{ "cells": [ { "cell_type": "markdown", "id": "56a937f6", "metadata": {}, "source": [ "# Section 0 — Imports and Configuration\n", "\n", "All imports, seeds, and global configuration in one place." ] }, { "cell_type": "code", "execution_count": 1, "id": "14b3703d", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:15.648777Z", "iopub.status.busy": "2026-05-07T14:55:15.648567Z", "iopub.status.idle": "2026-05-07T14:55:18.479874Z", "shell.execute_reply": "2026-05-07T14:55:18.478674Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Configuration loaded.\n", "Phase 1: ['eclipse', 'mylyn']\n", "Phase 2: ['equinox', 'lucene', 'pde']\n" ] } ], "source": [ "import os\n", "import sys\n", "import json\n", "import random\n", "import warnings\n", "from collections import defaultdict\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from scipy import stats\n", "from tqdm.auto import tqdm\n", "\n", "# sklearn\n", "from sklearn.model_selection import train_test_split, StratifiedKFold\n", "from sklearn.preprocessing import FunctionTransformer, RobustScaler\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.utils.class_weight import compute_sample_weight\n", "\n", "# models\n", "from sklearn.ensemble import (\n", " RandomForestClassifier, GradientBoostingClassifier, ExtraTreesClassifier\n", ")\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.svm import SVC\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.naive_bayes import GaussianNB\n", "\n", "# xgboost / lightgbm\n", "try:\n", " from xgboost import XGBClassifier\n", "except Exception:\n", " XGBClassifier = None\n", "try:\n", " from lightgbm import LGBMClassifier\n", "except Exception:\n", " LGBMClassifier = None\n", "\n", "# imbalanced-learn\n", "from imblearn.over_sampling import SMOTE\n", "\n", "# metrics\n", "from sklearn.metrics import (\n", " f1_score, roc_auc_score, average_precision_score,\n", " classification_report, confusion_matrix, roc_curve, precision_recall_curve\n", ")\n", "\n", "# SHAP / LIME\n", "import shap\n", "from lime.lime_tabular import LimeTabularExplainer\n", "\n", "# Seeds\n", "SEED = 42\n", "np.random.seed(SEED)\n", "random.seed(SEED)\n", "\n", "# Matplotlib defaults\n", "plt.rcParams['figure.dpi'] = 100\n", "plt.rcParams['savefig.dpi'] = 150\n", "sns.set_palette(\"husl\")\n", "\n", "# ---------------- CONFIG ----------------\n", "CONFIG = {\n", " 'data_dir': 'data',\n", " 'datasets': {\n", " 'eclipse': 'eclipse.csv',\n", " 'equinox': 'equinox.csv',\n", " 'lucene': 'lucene.csv',\n", " 'mylyn': 'mylyn.csv',\n", " 'pde': 'pde.csv',\n", " },\n", " 'phase1': ['eclipse', 'mylyn'],\n", " 'phase2': ['equinox', 'lucene', 'pde'],\n", " 'random_state': 42,\n", " 'cv_folds': 5,\n", " 'test_size': 0.20,\n", " 'smote_threshold': 2.0,\n", " 'ZERO_VAR_FEATURES': {\n", " 'lucene': [\n", " 'numberOfNonTrivialBugsFoundUntil:',\n", " 'numberOfMajorBugsFoundUntil:',\n", " 'numberOfCriticalBugsFoundUntil:',\n", " 'numberOfHighPriorityBugsFoundUntil:',\n", " ],\n", " },\n", "}\n", "\n", "# Storage containers\n", "DATASETS = {}\n", "RESULTS_PHASE1 = {}\n", "BEST_MODEL = {}\n", "TOP2_MODELS = {}\n", "SHAP_WEIGHTS = {}\n", "AVERAGED_SHAP_WEIGHTS = None\n", "ALL_FEATURES = []\n", "\n", "print(\"Configuration loaded.\")\n", "print(\"Phase 1:\", CONFIG['phase1'])\n", "print(\"Phase 2:\", CONFIG['phase2'])\n" ] }, { "cell_type": "markdown", "id": "746df5c7", "metadata": {}, "source": [ "# Section 1 — Data Loading\n", "\n", "Load all 5 datasets, drop leakage columns, create binary target, drop zero-variance features per CONFIG, and report shapes + class distributions." ] }, { "cell_type": "code", "execution_count": 2, "id": "f624d0f5", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:18.483498Z", "iopub.status.busy": "2026-05-07T14:55:18.482981Z", "iopub.status.idle": "2026-05-07T14:55:18.525217Z", "shell.execute_reply": "2026-05-07T14:55:18.523969Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset: eclipse | shape=(997, 5) | buggy=206 | clean=791 | imbalance_ratio=3.84\n", "Dataset: equinox | shape=(324, 5) | buggy=129 | clean=195 | imbalance_ratio=1.51\n", " [lucene] Dropping zero-variance: ['numberOfNonTrivialBugsFoundUntil:', 'numberOfMajorBugsFoundUntil:', 'numberOfCriticalBugsFoundUntil:', 'numberOfHighPriorityBugsFoundUntil:']\n", "Dataset: lucene | shape=(691, 1) | buggy=64 | clean=627 | imbalance_ratio=9.80\n", "Dataset: mylyn | shape=(1862, 5) | buggy=245 | clean=1617 | imbalance_ratio=6.60\n", "Dataset: pde | shape=(1497, 5) | buggy=209 | clean=1288 | imbalance_ratio=6.16\n", "\n", "All datasets loaded.\n" ] } ], "source": [ "def load_dataset(name, path):\n", " df = pd.read_csv(path, sep=';', skipinitialspace=True)\n", " df.columns = df.columns.str.strip()\n", "\n", " # Drop unnamed / empty columns\n", " unnamed = [c for c in df.columns if c == '' or c.startswith('Unnamed')]\n", " df = df.drop(columns=unnamed)\n", "\n", " # Drop leakage columns\n", " leakage = ['nonTrivialBugs', 'majorBugs', 'criticalBugs', 'highPriorityBugs']\n", " leakage = [c for c in leakage if c in df.columns]\n", " df = df.drop(columns=leakage)\n", "\n", " # Binary target\n", " y = (df['bugs'] > 0).astype(int)\n", " df = df.drop(columns=['bugs'])\n", "\n", " # Drop identifier\n", " df = df.drop(columns=['classname'])\n", "\n", " # Drop zero-variance per CONFIG\n", " zv = CONFIG['ZERO_VAR_FEATURES'].get(name, [])\n", " zv = [c for c in zv if c in df.columns]\n", " if zv:\n", " print(f\" [{name}] Dropping zero-variance: {zv}\")\n", " df = df.drop(columns=zv)\n", "\n", " feature_names = [f.rstrip(':') for f in df.columns.tolist()]\n", " df.columns = feature_names\n", " return df, y, feature_names\n", "\n", "\n", "for name, fname in CONFIG['datasets'].items():\n", " path = os.path.join(CONFIG['data_dir'], fname)\n", " X, y, fnames = load_dataset(name, path)\n", " DATASETS[name] = {'X': X, 'y': y, 'feature_names': fnames}\n", " n_buggy = int(y.sum())\n", " n_clean = int((y == 0).sum())\n", " ratio = n_clean / n_buggy if n_buggy > 0 else float('inf')\n", " print(f\"Dataset: {name:8s} | shape={X.shape} | buggy={n_buggy} | clean={n_clean} | imbalance_ratio={ratio:.2f}\")\n", "\n", "print(\"\\nAll datasets loaded.\")\n" ] }, { "cell_type": "markdown", "id": "b1c7557c", "metadata": {}, "source": [ "# Section 2 — EDA (Concise Per-Dataset)\n", "\n", "For each dataset: class balance bar chart, feature boxplots (log-scaled), correlation heatmap, and a printed summary table — all in a single figure using `gridspec`." ] }, { "cell_type": "code", "execution_count": 3, "id": "9a73dd1f", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:18.527156Z", "iopub.status.busy": "2026-05-07T14:55:18.526946Z", "iopub.status.idle": "2026-05-07T14:55:24.479169Z", "shell.execute_reply": "2026-05-07T14:55:24.477582Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "EDA for dataset: eclipse\n", "============================================================\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved EDA figure: eda_eclipse.png\n", "\n", "--- Summary table for eclipse ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremeanmedianmaxskewness%zerosIQR_outliers
0numberOfBugsFoundUntil11.645.002144.9511.3111
1numberOfNonTrivialBugsFoundUntil10.154.002004.9414.4114
2numberOfMajorBugsFoundUntil1.140.00385.6164.7140
3numberOfCriticalBugsFoundUntil0.430.00155.3478.3216
4numberOfHighPriorityBugsFoundUntil0.460.00104.3272.640
\n", "
" ], "text/plain": [ " feature mean median max skewness %zeros \\\n", "0 numberOfBugsFoundUntil 11.64 5.00 214 4.95 11.3 \n", "1 numberOfNonTrivialBugsFoundUntil 10.15 4.00 200 4.94 14.4 \n", "2 numberOfMajorBugsFoundUntil 1.14 0.00 38 5.61 64.7 \n", "3 numberOfCriticalBugsFoundUntil 0.43 0.00 15 5.34 78.3 \n", "4 numberOfHighPriorityBugsFoundUntil 0.46 0.00 10 4.32 72.6 \n", "\n", " IQR_outliers \n", "0 111 \n", "1 114 \n", "2 140 \n", "3 216 \n", "4 40 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "EDA for dataset: equinox\n", "============================================================\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved EDA figure: eda_equinox.png\n", "\n", "--- Summary table for equinox ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremeanmedianmaxskewness%zerosIQR_outliers
0numberOfBugsFoundUntil4.592.00784.953.437
1numberOfNonTrivialBugsFoundUntil4.302.00714.944.331
2numberOfMajorBugsFoundUntil0.480.00114.9076.576
3numberOfCriticalBugsFoundUntil0.220.0043.5485.547
4numberOfHighPriorityBugsFoundUntil0.040.0049.6496.910
\n", "
" ], "text/plain": [ " feature mean median max skewness %zeros \\\n", "0 numberOfBugsFoundUntil 4.59 2.00 78 4.95 3.4 \n", "1 numberOfNonTrivialBugsFoundUntil 4.30 2.00 71 4.94 4.3 \n", "2 numberOfMajorBugsFoundUntil 0.48 0.00 11 4.90 76.5 \n", "3 numberOfCriticalBugsFoundUntil 0.22 0.00 4 3.54 85.5 \n", "4 numberOfHighPriorityBugsFoundUntil 0.04 0.00 4 9.64 96.9 \n", "\n", " IQR_outliers \n", "0 37 \n", "1 31 \n", "2 76 \n", "3 47 \n", "4 10 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "EDA for dataset: lucene\n", "============================================================\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved EDA figure: eda_lucene.png\n", "\n", "--- Summary table for lucene ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremeanmedianmaxskewness%zerosIQR_outliers
0numberOfBugsFoundUntil2.481.00818.1724.648
\n", "
" ], "text/plain": [ " feature mean median max skewness %zeros IQR_outliers\n", "0 numberOfBugsFoundUntil 2.48 1.00 81 8.17 24.6 48" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "EDA for dataset: mylyn\n", "============================================================\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved EDA figure: eda_mylyn.png\n", "\n", "--- Summary table for mylyn ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremeanmedianmaxskewness%zerosIQR_outliers
0numberOfBugsFoundUntil7.834.001975.901.1153
1numberOfNonTrivialBugsFoundUntil3.662.00926.1916.5169
2numberOfMajorBugsFoundUntil0.320.00135.9879.0391
3numberOfCriticalBugsFoundUntil0.130.0055.2490.3180
4numberOfHighPriorityBugsFoundUntil4.302.00854.2927.0141
\n", "
" ], "text/plain": [ " feature mean median max skewness %zeros \\\n", "0 numberOfBugsFoundUntil 7.83 4.00 197 5.90 1.1 \n", "1 numberOfNonTrivialBugsFoundUntil 3.66 2.00 92 6.19 16.5 \n", "2 numberOfMajorBugsFoundUntil 0.32 0.00 13 5.98 79.0 \n", "3 numberOfCriticalBugsFoundUntil 0.13 0.00 5 5.24 90.3 \n", "4 numberOfHighPriorityBugsFoundUntil 4.30 2.00 85 4.29 27.0 \n", "\n", " IQR_outliers \n", "0 153 \n", "1 169 \n", "2 391 \n", "3 180 \n", "4 141 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "EDA for dataset: pde\n", "============================================================\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved EDA figure: eda_pde.png\n", "\n", "--- Summary table for pde ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremeanmedianmaxskewness%zerosIQR_outliers
0numberOfBugsFoundUntil3.882.0023217.2017.0149
1numberOfNonTrivialBugsFoundUntil2.801.0014312.4631.1133
2numberOfMajorBugsFoundUntil0.240.0084.9485.2221
3numberOfCriticalBugsFoundUntil0.070.0068.3895.568
4numberOfHighPriorityBugsFoundUntil0.060.0068.6395.765
\n", "
" ], "text/plain": [ " feature mean median max skewness %zeros \\\n", "0 numberOfBugsFoundUntil 3.88 2.00 232 17.20 17.0 \n", "1 numberOfNonTrivialBugsFoundUntil 2.80 1.00 143 12.46 31.1 \n", "2 numberOfMajorBugsFoundUntil 0.24 0.00 8 4.94 85.2 \n", "3 numberOfCriticalBugsFoundUntil 0.07 0.00 6 8.38 95.5 \n", "4 numberOfHighPriorityBugsFoundUntil 0.06 0.00 6 8.63 95.7 \n", "\n", " IQR_outliers \n", "0 149 \n", "1 133 \n", "2 221 \n", "3 68 \n", "4 65 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def eda_dataset(name, data_dict, save_prefix='eda'):\n", " X = data_dict['X']\n", " y = data_dict['y']\n", " features = data_dict['feature_names']\n", "\n", " fig = plt.figure(figsize=(18, 14))\n", " gs = fig.add_gridspec(3, 2, height_ratios=[1, 1.2, 1.2])\n", "\n", " # --- Class balance ---\n", " ax1 = fig.add_subplot(gs[0, 0])\n", " counts = y.value_counts().sort_index()\n", " bars = ax1.bar(['clean (0)', 'buggy (1)'], counts.values, color=['steelblue', 'coral'])\n", " ax1.set_title('Class Balance')\n", " ax1.set_ylabel('Count')\n", " for bar, val in zip(bars, counts.values):\n", " ax1.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.02*counts.max(),\n", " str(val), ha='center', va='bottom', fontsize=11)\n", "\n", " # --- Feature boxplots (log1p scale) ---\n", " ax2 = fig.add_subplot(gs[0, 1])\n", " X_log1p = np.log1p(X)\n", " vals = [X_log1p[c].dropna().values for c in features]\n", " bp = ax2.boxplot(vals, labels=features, vert=False, patch_artist=True)\n", " for patch in bp['boxes']:\n", " patch.set_facecolor('lightsteelblue')\n", " ax2.set_title('Feature Distributions (log1p scale)')\n", " ax2.set_xlabel('log1p(value)')\n", "\n", " # --- Correlation heatmap ---\n", " ax3 = fig.add_subplot(gs[1, :])\n", " corr = X.corr(method='pearson')\n", " sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0, ax=ax3,\n", " vmin=-1, vmax=1, square=True)\n", " ax3.set_title('Pearson Correlation Heatmap (features only)')\n", "\n", " # --- Summary table ---\n", " ax4 = fig.add_subplot(gs[2, :])\n", " ax4.axis('off')\n", " rows = []\n", " for col in features:\n", " s = X[col]\n", " pct_zeros = (s == 0).mean() * 100\n", " q1, q3 = s.quantile(0.25), s.quantile(0.75)\n", " iqr = q3 - q1\n", " low, high = q1 - 1.5*iqr, q3 + 1.5*iqr\n", " outlier_count = ((s < low) | (s > high)).sum()\n", " rows.append({\n", " 'feature': col,\n", " 'mean': f\"{s.mean():.2f}\",\n", " 'median': f\"{s.median():.2f}\",\n", " 'max': f\"{s.max():.0f}\",\n", " 'skewness': f\"{s.skew():.2f}\",\n", " '%zeros': f\"{pct_zeros:.1f}\",\n", " 'IQR_outliers': outlier_count,\n", " })\n", " summary_df = pd.DataFrame(rows)\n", " table = ax4.table(cellText=summary_df.values, colLabels=summary_df.columns,\n", " loc='center', cellLoc='center')\n", " table.auto_set_font_size(False)\n", " table.set_fontsize(9)\n", " table.scale(1.2, 1.5)\n", " ax4.set_title('Feature Summary Table', y=0.95, pad=10)\n", "\n", " fig.suptitle(f'EDA: {name}', fontsize=16, fontweight='bold')\n", " plt.tight_layout(rect=[0, 0, 1, 0.96])\n", " fname = f\"{save_prefix}_{name}.png\"\n", " plt.savefig(fname)\n", " plt.close(fig)\n", " print(f\"Saved EDA figure: {fname}\")\n", " print(f\"\\n--- Summary table for {name} ---\")\n", " display(summary_df)\n", " return summary_df\n", "\n", "\n", "for name in DATASETS:\n", " print(f\"\\n{'='*60}\")\n", " print(f\"EDA for dataset: {name}\")\n", " print(f\"{'='*60}\")\n", " eda_dataset(name, DATASETS[name])\n" ] }, { "cell_type": "markdown", "id": "0a0befbb", "metadata": {}, "source": [ "# Section 3 — Preprocessing Pipelines\n", "\n", "Three pipelines:\n", "- **Pipeline A**: tree-compatible (no scaling)\n", "- **Pipeline B**: linear/distance-compatible (log1p + RobustScaler + optional SMOTE)\n", "- **Pipeline C**: interpretability-optimised (log1p only, no SMOTE)" ] }, { "cell_type": "code", "execution_count": 4, "id": "3388aba9", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:24.488412Z", "iopub.status.busy": "2026-05-07T14:55:24.487683Z", "iopub.status.idle": "2026-05-07T14:55:24.497158Z", "shell.execute_reply": "2026-05-07T14:55:24.496173Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pipeline A (tree): Pipeline(steps=[('identity', 'passthrough')])\n", "\n", "Preproc B (log1p+RobustScaler): Pipeline(steps=[('log1p', FunctionTransformer(func=)),\n", " ('scaler', RobustScaler())])\n", "\n", "Pipeline C (interpretability): Pipeline(steps=[('log1p', FunctionTransformer(func=))])\n" ] } ], "source": [ "def make_pipeline_a():\n", " return Pipeline([('identity', 'passthrough')])\n", "\n", "\n", "def make_preproc_b():\n", " \"\"\"Return the preprocessing part of Pipeline B (log1p + RobustScaler).\"\"\"\n", " return Pipeline([\n", " ('log1p', FunctionTransformer(np.log1p)),\n", " ('scaler', RobustScaler()),\n", " ])\n", "\n", "\n", "def make_pipeline_c():\n", " return Pipeline([\n", " ('log1p', FunctionTransformer(np.log1p)),\n", " ])\n", "\n", "\n", "def imbalance_ratio(y):\n", " counts = np.bincount(y)\n", " if len(counts) < 2 or counts[1] == 0:\n", " return float('inf')\n", " return counts[0] / counts[1]\n", "\n", "\n", "print(\"Pipeline A (tree):\", make_pipeline_a())\n", "print(\"\\nPreproc B (log1p+RobustScaler):\", make_preproc_b())\n", "print(\"\\nPipeline C (interpretability):\", make_pipeline_c())\n" ] }, { "cell_type": "markdown", "id": "1e4d6d76", "metadata": {}, "source": [ "# Section 4 — Model Definitions\n", "\n", "Define all 8 models with assigned pipelines. XGBoost `scale_pos_weight` is computed per dataset at training time." ] }, { "cell_type": "code", "execution_count": 5, "id": "4b9211dd", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:24.499876Z", "iopub.status.busy": "2026-05-07T14:55:24.499597Z", "iopub.status.idle": "2026-05-07T14:55:24.508565Z", "shell.execute_reply": "2026-05-07T14:55:24.507645Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RandomForest -> pipeline A | RandomForestClassifier\n", "XGBoost -> pipeline A | XGBClassifier\n", "LightGBM -> pipeline A | LGBMClassifier\n", "GradientBoosting -> pipeline A | GradientBoostingClassifier\n", "ExtraTrees -> pipeline A | ExtraTreesClassifier\n", "LogisticRegression -> pipeline B | LogisticRegression\n", "SVM -> pipeline B | SVC\n", "KNN -> pipeline B | KNeighborsClassifier\n" ] } ], "source": [ "def build_models(y_train=None):\n", " spw = 1.0\n", " if y_train is not None:\n", " counts = np.bincount(y_train)\n", " if len(counts) > 1 and counts[1] > 0:\n", " spw = counts[0] / counts[1]\n", "\n", " models = {\n", " 'RandomForest': {\n", " 'model': RandomForestClassifier(\n", " n_estimators=300, class_weight='balanced',\n", " random_state=CONFIG['random_state'], n_jobs=-1\n", " ),\n", " 'pipeline': 'A',\n", " },\n", " 'XGBoost': {\n", " 'model': XGBClassifier(\n", " n_estimators=300,\n", " eval_metric='logloss',\n", " scale_pos_weight=spw,\n", " random_state=CONFIG['random_state'],\n", " n_jobs=-1,\n", " ) if XGBClassifier is not None else None,\n", " 'pipeline': 'A',\n", " },\n", " 'LightGBM': {\n", " 'model': LGBMClassifier(\n", " n_estimators=300, class_weight='balanced',\n", " random_state=CONFIG['random_state'],\n", " n_jobs=-1, verbose=-1,\n", " ) if LGBMClassifier is not None else None,\n", " 'pipeline': 'A',\n", " },\n", " 'GradientBoosting': {\n", " 'model': GradientBoostingClassifier(\n", " n_estimators=200, random_state=CONFIG['random_state']\n", " ),\n", " 'pipeline': 'A',\n", " },\n", " 'ExtraTrees': {\n", " 'model': ExtraTreesClassifier(\n", " n_estimators=300, class_weight='balanced',\n", " random_state=CONFIG['random_state'], n_jobs=-1\n", " ),\n", " 'pipeline': 'A',\n", " },\n", " 'LogisticRegression': {\n", " 'model': LogisticRegression(\n", " C=1.0, class_weight='balanced', max_iter=1000,\n", " random_state=CONFIG['random_state']\n", " ),\n", " 'pipeline': 'B',\n", " },\n", " 'SVM': {\n", " 'model': SVC(\n", " kernel='rbf', C=1.0, probability=True,\n", " class_weight='balanced', random_state=CONFIG['random_state']\n", " ),\n", " 'pipeline': 'B',\n", " },\n", " 'KNN': {\n", " 'model': KNeighborsClassifier(\n", " n_neighbors=7, metric='euclidean', n_jobs=-1\n", " ),\n", " 'pipeline': 'B',\n", " },\n", " }\n", " models = {k: v for k, v in models.items() if v['model'] is not None}\n", " return models\n", "\n", "\n", "MODELS_CHECK = build_models(np.array([0,0,0,1,1]))\n", "for k, v in MODELS_CHECK.items():\n", " print(f\"{k:20s} -> pipeline {v['pipeline']} | {type(v['model']).__name__}\")\n" ] }, { "cell_type": "markdown", "id": "4e7f4546", "metadata": {}, "source": [ "# Section 5 — Training and Evaluation (Phase 1 datasets)\n", "\n", "Stratified split, 5-fold CV on train set, final test evaluation, model ranking, and comparative visualisation." ] }, { "cell_type": "code", "execution_count": 6, "id": "a26d2aca", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:55:24.510686Z", "iopub.status.busy": "2026-05-07T14:55:24.510460Z", "iopub.status.idle": "2026-05-07T14:56:03.673975Z", "shell.execute_reply": "2026-05-07T14:56:03.672496Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "======================================================================\n", "PHASE 1 — Dataset: eclipse\n", "======================================================================\n", "Train: (797, 5) | Test: (200, 5)\n", "Train dist: [632 165] | Test dist: [159 41]\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "36e19e3b212f4e2a8ff4962b1d019b69", "version_major": 2, "version_minor": 0 }, "text/plain": [ "CV eclipse: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelf1_macroroc_aucpr_auc
6SVM0.7166 ± 0.02950.7786 ± 0.03860.5303 ± 0.0404
7KNN0.6893 ± 0.02730.7593 ± 0.02540.4703 ± 0.0366
5LogisticRegression0.6842 ± 0.02190.8133 ± 0.02610.6371 ± 0.0397
0RandomForest0.6812 ± 0.03760.7411 ± 0.01700.5368 ± 0.0466
2LightGBM0.6771 ± 0.02400.7133 ± 0.03160.5389 ± 0.0427
3GradientBoosting0.6679 ± 0.04340.7073 ± 0.03920.5357 ± 0.0373
1XGBoost0.6621 ± 0.02990.6868 ± 0.03060.5158 ± 0.0455
4ExtraTrees0.6601 ± 0.01700.7150 ± 0.01970.4693 ± 0.0459
\n", "" ], "text/plain": [ " model f1_macro roc_auc pr_auc\n", "6 SVM 0.7166 ± 0.0295 0.7786 ± 0.0386 0.5303 ± 0.0404\n", "7 KNN 0.6893 ± 0.0273 0.7593 ± 0.0254 0.4703 ± 0.0366\n", "5 LogisticRegression 0.6842 ± 0.0219 0.8133 ± 0.0261 0.6371 ± 0.0397\n", "0 RandomForest 0.6812 ± 0.0376 0.7411 ± 0.0170 0.5368 ± 0.0466\n", "2 LightGBM 0.6771 ± 0.0240 0.7133 ± 0.0316 0.5389 ± 0.0427\n", "3 GradientBoosting 0.6679 ± 0.0434 0.7073 ± 0.0392 0.5357 ± 0.0373\n", "1 XGBoost 0.6621 ± 0.0299 0.6868 ± 0.0306 0.5158 ± 0.0455\n", "4 ExtraTrees 0.6601 ± 0.0170 0.7150 ± 0.0197 0.4693 ± 0.0459" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "247614267d7b45eb8ca13b12ee3e4125", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Test eclipse: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelf1_macroroc_aucpr_auc
3GradientBoosting0.7236230.7464340.522457
6SVM0.7086830.7718980.595115
7KNN0.7035570.7498850.572197
5LogisticRegression0.7011430.7843230.627092
4ExtraTrees0.6293230.7198960.388231
2LightGBM0.6230310.7309400.465996
0RandomForest0.6190480.7242680.471125
1XGBoost0.6129030.6830800.452841
\n", "" ], "text/plain": [ " model f1_macro roc_auc pr_auc\n", "3 GradientBoosting 0.723623 0.746434 0.522457\n", "6 SVM 0.708683 0.771898 0.595115\n", "7 KNN 0.703557 0.749885 0.572197\n", "5 LogisticRegression 0.701143 0.784323 0.627092\n", "4 ExtraTrees 0.629323 0.719896 0.388231\n", "2 LightGBM 0.623031 0.730940 0.465996\n", "0 RandomForest 0.619048 0.724268 0.471125\n", "1 XGBoost 0.612903 0.683080 0.452841" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top-1 (SHAP): GradientBoosting\n", "Top-2 (LIME): ['GradientBoosting', 'SVM']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved model_comparison_eclipse.png\n", "\n", "======================================================================\n", "PHASE 1 — Dataset: mylyn\n", "======================================================================\n", "Train: (1489, 5) | Test: (373, 5)\n", "Train dist: [1293 196] | Test dist: [324 49]\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e6a9373f078d4b079ff1e6f0a095b629", "version_major": 2, "version_minor": 0 }, "text/plain": [ "CV mylyn: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelf1_macroroc_aucpr_auc
7KNN0.6001 ± 0.01600.6599 ± 0.01750.2451 ± 0.0282
0RandomForest0.5965 ± 0.02960.6723 ± 0.03570.3147 ± 0.0618
2LightGBM0.5952 ± 0.04280.6563 ± 0.04920.2923 ± 0.0665
6SVM0.5946 ± 0.03370.7372 ± 0.02910.3210 ± 0.0621
5LogisticRegression0.5851 ± 0.03370.7007 ± 0.04240.2914 ± 0.0353
4ExtraTrees0.5850 ± 0.02840.6538 ± 0.03590.2644 ± 0.0514
1XGBoost0.5824 ± 0.04270.6362 ± 0.06410.2881 ± 0.0653
3GradientBoosting0.5741 ± 0.03050.6809 ± 0.04390.3075 ± 0.0475
\n", "" ], "text/plain": [ " model f1_macro roc_auc pr_auc\n", "7 KNN 0.6001 ± 0.0160 0.6599 ± 0.0175 0.2451 ± 0.0282\n", "0 RandomForest 0.5965 ± 0.0296 0.6723 ± 0.0357 0.3147 ± 0.0618\n", "2 LightGBM 0.5952 ± 0.0428 0.6563 ± 0.0492 0.2923 ± 0.0665\n", "6 SVM 0.5946 ± 0.0337 0.7372 ± 0.0291 0.3210 ± 0.0621\n", "5 LogisticRegression 0.5851 ± 0.0337 0.7007 ± 0.0424 0.2914 ± 0.0353\n", "4 ExtraTrees 0.5850 ± 0.0284 0.6538 ± 0.0359 0.2644 ± 0.0514\n", "1 XGBoost 0.5824 ± 0.0427 0.6362 ± 0.0641 0.2881 ± 0.0653\n", "3 GradientBoosting 0.5741 ± 0.0305 0.6809 ± 0.0439 0.3075 ± 0.0475" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4f67f20befda43119e11318be4df03c5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Test mylyn: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelf1_macroroc_aucpr_auc
6SVM0.6199940.7598260.331761
7KNN0.6061850.6413770.224083
3GradientBoosting0.5977110.6608720.255290
5LogisticRegression0.5651060.7207730.306504
0RandomForest0.5528010.6059780.184380
1XGBoost0.5523190.5745150.220625
2LightGBM0.5515560.6109220.191383
4ExtraTrees0.5469880.5747350.154150
\n", "" ], "text/plain": [ " model f1_macro roc_auc pr_auc\n", "6 SVM 0.619994 0.759826 0.331761\n", "7 KNN 0.606185 0.641377 0.224083\n", "3 GradientBoosting 0.597711 0.660872 0.255290\n", "5 LogisticRegression 0.565106 0.720773 0.306504\n", "0 RandomForest 0.552801 0.605978 0.184380\n", "1 XGBoost 0.552319 0.574515 0.220625\n", "2 LightGBM 0.551556 0.610922 0.191383\n", "4 ExtraTrees 0.546988 0.574735 0.154150" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top-1 (SHAP): SVM\n", "Top-2 (LIME): ['SVM', 'KNN']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved model_comparison_mylyn.png\n", "\n", "Phase 1 training complete.\n" ] } ], "source": [ "def apply_pipeline_b(X_train, y_train, X_test, apply_smote=False):\n", " pre = make_preproc_b()\n", " X_train_t = pre.fit_transform(X_train)\n", " X_test_t = pre.transform(X_test)\n", " if apply_smote:\n", " sm = SMOTE(random_state=CONFIG['random_state'])\n", " X_train_t, y_train_t = sm.fit_resample(X_train_t, y_train)\n", " else:\n", " y_train_t = y_train\n", " return X_train_t, y_train_t, X_test_t, pre\n", "\n", "\n", "def evaluate_model(model, X_train, y_train, X_test, y_test, pipeline_key):\n", " ir = imbalance_ratio(y_train)\n", " apply_smote = (pipeline_key == 'B') and (ir > CONFIG['smote_threshold'])\n", "\n", " if pipeline_key == 'A':\n", " pipe = make_pipeline_a()\n", " X_train_t = pipe.fit_transform(X_train)\n", " X_test_t = pipe.transform(X_test)\n", " if isinstance(model, GradientBoostingClassifier):\n", " sw = compute_sample_weight('balanced', y_train)\n", " model.fit(X_train_t, y_train, sample_weight=sw)\n", " else:\n", " model.fit(X_train_t, y_train)\n", " elif pipeline_key == 'B':\n", " X_train_t, y_train_t, X_test_t, _ = apply_pipeline_b(\n", " X_train, y_train, X_test, apply_smote=apply_smote\n", " )\n", " model.fit(X_train_t, y_train_t)\n", " else:\n", " raise ValueError(f\"Unknown pipeline key {pipeline_key}\")\n", "\n", " y_pred = model.predict(X_test_t)\n", " y_prob = model.predict_proba(X_test_t)[:, 1]\n", " return {\n", " 'f1_macro': f1_score(y_test, y_pred, average='macro'),\n", " 'roc_auc': roc_auc_score(y_test, y_prob),\n", " 'pr_auc': average_precision_score(y_test, y_prob),\n", " 'y_pred': y_pred,\n", " 'y_prob': y_prob,\n", " }\n", "\n", "\n", "def cross_val_model(model, X, y, pipeline_key):\n", " skf = StratifiedKFold(n_splits=CONFIG['cv_folds'], shuffle=True,\n", " random_state=CONFIG['random_state'])\n", " fold_f1, fold_roc, fold_pr = [], [], []\n", "\n", " for tr_idx, val_idx in skf.split(X, y):\n", " X_tr, X_val = X.iloc[tr_idx], X.iloc[val_idx]\n", " y_tr, y_val = y.iloc[tr_idx], y.iloc[val_idx]\n", " ir = imbalance_ratio(y_tr)\n", " apply_smote = (pipeline_key == 'B') and (ir > CONFIG['smote_threshold'])\n", "\n", " if pipeline_key == 'A':\n", " pipe = make_pipeline_a()\n", " X_tr_t = pipe.fit_transform(X_tr)\n", " X_val_t = pipe.transform(X_val)\n", " m = type(model)(**model.get_params())\n", " if isinstance(m, GradientBoostingClassifier):\n", " sw = compute_sample_weight('balanced', y_tr)\n", " m.fit(X_tr_t, y_tr, sample_weight=sw)\n", " else:\n", " m.fit(X_tr_t, y_tr)\n", " elif pipeline_key == 'B':\n", " X_tr_t, y_tr_t, X_val_t, _ = apply_pipeline_b(\n", " X_tr, y_tr, X_val, apply_smote=apply_smote\n", " )\n", " m = type(model)(**model.get_params())\n", " m.fit(X_tr_t, y_tr_t)\n", " else:\n", " raise ValueError(f\"Unknown pipeline key {pipeline_key}\")\n", "\n", " y_pred = m.predict(X_val_t)\n", " y_prob = m.predict_proba(X_val_t)[:, 1]\n", " fold_f1.append(f1_score(y_val, y_pred, average='macro'))\n", " fold_roc.append(roc_auc_score(y_val, y_prob))\n", " fold_pr.append(average_precision_score(y_val, y_prob))\n", "\n", " return {\n", " 'f1_macro_mean': np.mean(fold_f1),\n", " 'f1_macro_std': np.std(fold_f1),\n", " 'roc_auc_mean': np.mean(fold_roc),\n", " 'roc_auc_std': np.std(fold_roc),\n", " 'pr_auc_mean': np.mean(fold_pr),\n", " 'pr_auc_std': np.std(fold_pr),\n", " }\n", "\n", "\n", "# --- Run Phase 1 ---\n", "for ds_name in CONFIG['phase1']:\n", " print(f\"\\n{'='*70}\")\n", " print(f\"PHASE 1 — Dataset: {ds_name}\")\n", " print(f\"{'='*70}\")\n", "\n", " data = DATASETS[ds_name]\n", " X, y = data['X'], data['y']\n", " X_train, X_test, y_train, y_test = train_test_split(\n", " X, y, test_size=CONFIG['test_size'], stratify=y,\n", " random_state=CONFIG['random_state']\n", " )\n", " print(f\"Train: {X_train.shape} | Test: {X_test.shape}\")\n", " print(f\"Train dist: {np.bincount(y_train)} | Test dist: {np.bincount(y_test)}\")\n", "\n", " DATASETS[ds_name]['X_train'] = X_train\n", " DATASETS[ds_name]['X_test'] = X_test\n", " DATASETS[ds_name]['y_train'] = y_train\n", " DATASETS[ds_name]['y_test'] = y_test\n", "\n", " # 5.2 Cross-validation\n", " models = build_models(y_train.values)\n", " cv_results = []\n", " for mname, mdict in tqdm(models.items(), desc=f\"CV {ds_name}\"):\n", " cv = cross_val_model(mdict['model'], X_train, y_train, mdict['pipeline'])\n", " cv_results.append({\n", " 'model': mname,\n", " 'f1_macro': f\"{cv['f1_macro_mean']:.4f} ± {cv['f1_macro_std']:.4f}\",\n", " 'roc_auc': f\"{cv['roc_auc_mean']:.4f} ± {cv['roc_auc_std']:.4f}\",\n", " 'pr_auc': f\"{cv['pr_auc_mean']:.4f} ± {cv['pr_auc_std']:.4f}\",\n", " 'f1_macro_raw': cv['f1_macro_mean'],\n", " 'roc_auc_raw': cv['roc_auc_mean'],\n", " })\n", " cv_df = pd.DataFrame(cv_results).sort_values('f1_macro_raw', ascending=False)\n", " print(f\"\\n--- CV Results ({ds_name}) ---\")\n", " display(cv_df[['model', 'f1_macro', 'roc_auc', 'pr_auc']])\n", "\n", " # 5.3 Final evaluation on held-out test set\n", " test_results = {}\n", " fig, axes = plt.subplots(2, 4, figsize=(20, 10))\n", " axes = axes.flatten()\n", " ax_idx = 0\n", "\n", " for mname, mdict in tqdm(models.items(), desc=f\"Test {ds_name}\"):\n", " res = evaluate_model(mdict['model'], X_train, y_train, X_test, y_test, mdict['pipeline'])\n", " test_results[mname] = res\n", " print(f\"\\n--- {mname} on {ds_name} test set ---\")\n", " print(classification_report(y_test, res['y_pred'],\n", " target_names=['clean', 'buggy'], digits=4))\n", " cm = confusion_matrix(y_test, res['y_pred'])\n", " if ax_idx < len(axes):\n", " ax = axes[ax_idx]\n", " sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax,\n", " xticklabels=['clean', 'buggy'],\n", " yticklabels=['clean', 'buggy'])\n", " ax.set_title(f'{mname} — CM')\n", " ax.set_ylabel('True')\n", " ax.set_xlabel('Predicted')\n", " ax_idx += 1\n", " # ROC\n", " fpr, tpr, _ = roc_curve(y_test, res['y_prob'])\n", " plt.figure(figsize=(5, 4))\n", " plt.plot(fpr, tpr, label=f'{mname} (AUC={res[\"roc_auc\"]:.3f})')\n", " plt.plot([0, 1], [0, 1], 'k--')\n", " plt.xlabel('FPR'); plt.ylabel('TPR')\n", " plt.title(f'ROC: {mname} — {ds_name}')\n", " plt.legend()\n", " plt.savefig(f\"roc_{ds_name}_{mname}.png\")\n", " plt.close()\n", " # PR\n", " prec, rec, _ = precision_recall_curve(y_test, res['y_prob'])\n", " plt.figure(figsize=(5, 4))\n", " plt.plot(rec, prec, label=f'{mname} (AP={res[\"pr_auc\"]:.3f})')\n", " plt.xlabel('Recall'); plt.ylabel('Precision')\n", " plt.title(f'PR: {mname} — {ds_name}')\n", " plt.legend()\n", " plt.savefig(f\"pr_{ds_name}_{mname}.png\")\n", " plt.close()\n", "\n", " plt.tight_layout()\n", " plt.savefig(f\"confusion_matrices_{ds_name}.png\")\n", " plt.close()\n", "\n", " # 5.4 Model ranking\n", " test_summary = []\n", " for mname, res in test_results.items():\n", " test_summary.append({\n", " 'model': mname,\n", " 'f1_macro': res['f1_macro'],\n", " 'roc_auc': res['roc_auc'],\n", " 'pr_auc': res['pr_auc'],\n", " })\n", " test_df = pd.DataFrame(test_summary).sort_values(\n", " ['f1_macro', 'roc_auc'], ascending=[False, False]\n", " )\n", " print(f\"\\n--- Test Set Ranking ({ds_name}) ---\")\n", " display(test_df)\n", "\n", " top1 = test_df.iloc[0]['model']\n", " top2 = [test_df.iloc[0]['model'], test_df.iloc[1]['model']]\n", " BEST_MODEL[ds_name] = top1\n", " TOP2_MODELS[ds_name] = top2\n", " RESULTS_PHASE1[ds_name] = test_results\n", " print(f\"Top-1 (SHAP): {top1}\")\n", " print(f\"Top-2 (LIME): {top2}\")\n", "\n", " # 5.5 Comparative visualisation\n", " fig, ax = plt.subplots(figsize=(12, 6))\n", " x = np.arange(len(test_df))\n", " width = 0.25\n", " color_map = {\n", " 'RandomForest': 'teal', 'ExtraTrees': 'teal',\n", " 'XGBoost': 'coral', 'LightGBM': 'coral', 'GradientBoosting': 'coral',\n", " 'LogisticRegression': '#DAA520', 'SVM': '#DAA520', 'KNN': '#DAA520',\n", " }\n", " colors = [color_map.get(m, 'gray') for m in test_df['model']]\n", " ax.bar(x - width, test_df['f1_macro'], width, label='F1-macro',\n", " color=colors, alpha=0.8, edgecolor='black')\n", " ax.bar(x, test_df['roc_auc'], width, label='ROC-AUC',\n", " color=colors, alpha=0.6, edgecolor='black', hatch='//')\n", " ax.bar(x + width, test_df['pr_auc'], width, label='PR-AUC',\n", " color=colors, alpha=0.4, edgecolor='black', hatch='xx')\n", " ax.set_xticks(x)\n", " ax.set_xticklabels(test_df['model'], rotation=45, ha='right')\n", " ax.set_ylabel('Score')\n", " ax.set_title(f'Model Comparison — {ds_name}')\n", " ax.legend()\n", " ax.set_ylim(0, 1.05)\n", " plt.tight_layout()\n", " plt.savefig(f\"model_comparison_{ds_name}.png\")\n", " plt.close()\n", " print(f\"Saved model_comparison_{ds_name}.png\")\n", "\n", "print(\"\\nPhase 1 training complete.\")\n" ] }, { "cell_type": "markdown", "id": "2e5fe03a", "metadata": {}, "source": [ "# Section 6 — LIME (Top-2 Models, Phase 1 Datasets)\n", "\n", "LIME explanations for the top-2 models on each Phase 1 dataset, including stability checks." ] }, { "cell_type": "code", "execution_count": 7, "id": "d3dfe5af", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:56:03.677280Z", "iopub.status.busy": "2026-05-07T14:56:03.677043Z", "iopub.status.idle": "2026-05-07T14:56:09.833455Z", "shell.execute_reply": "2026-05-07T14:56:09.832470Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "======================================================================\n", "LIME — Dataset: eclipse\n", "======================================================================\n", "\n", "--- LIME for GradientBoosting ---\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_GradientBoosting_confidently_buggy.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_GradientBoosting_borderline.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_GradientBoosting_confidently_clean.png\n", "\n", "--- LIME Stability (eclipse, GradientBoosting, confidently_buggy) ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_LIME_weightstdstable
0numberOfBugsFoundUntil0.1778900.005512True
1numberOfNonTrivialBugsFoundUntil0.0379330.001901True
2numberOfMajorBugsFoundUntil0.0974610.001851True
3numberOfCriticalBugsFoundUntil-0.0202490.002427False
4numberOfHighPriorityBugsFoundUntil0.0113790.001608False
\n", "
" ], "text/plain": [ " feature mean_LIME_weight std stable\n", "0 numberOfBugsFoundUntil 0.177890 0.005512 True\n", "1 numberOfNonTrivialBugsFoundUntil 0.037933 0.001901 True\n", "2 numberOfMajorBugsFoundUntil 0.097461 0.001851 True\n", "3 numberOfCriticalBugsFoundUntil -0.020249 0.002427 False\n", "4 numberOfHighPriorityBugsFoundUntil 0.011379 0.001608 False" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: Unstable features: ['numberOfCriticalBugsFoundUntil', 'numberOfHighPriorityBugsFoundUntil']\n", "\n", "--- LIME for SVM ---\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_SVM_confidently_buggy.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_SVM_borderline.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_eclipse_SVM_confidently_clean.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- LIME Stability (eclipse, SVM, confidently_buggy) ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_LIME_weightstdstable
0numberOfBugsFoundUntil0.1080200.000932True
1numberOfNonTrivialBugsFoundUntil0.0069680.001553False
2numberOfMajorBugsFoundUntil0.0097970.000285True
3numberOfCriticalBugsFoundUntil0.0037140.000333True
4numberOfHighPriorityBugsFoundUntil0.0193480.002188False
\n", "
" ], "text/plain": [ " feature mean_LIME_weight std stable\n", "0 numberOfBugsFoundUntil 0.108020 0.000932 True\n", "1 numberOfNonTrivialBugsFoundUntil 0.006968 0.001553 False\n", "2 numberOfMajorBugsFoundUntil 0.009797 0.000285 True\n", "3 numberOfCriticalBugsFoundUntil 0.003714 0.000333 True\n", "4 numberOfHighPriorityBugsFoundUntil 0.019348 0.002188 False" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: Unstable features: ['numberOfNonTrivialBugsFoundUntil', 'numberOfHighPriorityBugsFoundUntil']\n", "\n", "======================================================================\n", "LIME — Dataset: mylyn\n", "======================================================================\n", "\n", "--- LIME for SVM ---\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_SVM_confidently_buggy.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_SVM_borderline.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_SVM_confidently_clean.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- LIME Stability (mylyn, SVM, confidently_buggy) ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_LIME_weightstdstable
0numberOfBugsFoundUntil0.2054260.001041True
1numberOfNonTrivialBugsFoundUntil-0.1162400.001091True
2numberOfMajorBugsFoundUntil0.0460750.001564True
3numberOfCriticalBugsFoundUntil-0.0346080.002826True
4numberOfHighPriorityBugsFoundUntil0.0292250.001809True
\n", "
" ], "text/plain": [ " feature mean_LIME_weight std stable\n", "0 numberOfBugsFoundUntil 0.205426 0.001041 True\n", "1 numberOfNonTrivialBugsFoundUntil -0.116240 0.001091 True\n", "2 numberOfMajorBugsFoundUntil 0.046075 0.001564 True\n", "3 numberOfCriticalBugsFoundUntil -0.034608 0.002826 True\n", "4 numberOfHighPriorityBugsFoundUntil 0.029225 0.001809 True" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- LIME for KNN ---\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_KNN_confidently_buggy.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_KNN_borderline.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved LIME explanation: lime_mylyn_KNN_confidently_clean.png\n", "\n", "--- LIME Stability (mylyn, KNN, confidently_buggy) ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_LIME_weightstdstable
0numberOfBugsFoundUntil0.0826440.000496True
1numberOfNonTrivialBugsFoundUntil0.0632680.001292True
2numberOfMajorBugsFoundUntil0.0379950.001511True
3numberOfCriticalBugsFoundUntil-0.0092600.002500False
4numberOfHighPriorityBugsFoundUntil0.1053830.001307True
\n", "
" ], "text/plain": [ " feature mean_LIME_weight std stable\n", "0 numberOfBugsFoundUntil 0.082644 0.000496 True\n", "1 numberOfNonTrivialBugsFoundUntil 0.063268 0.001292 True\n", "2 numberOfMajorBugsFoundUntil 0.037995 0.001511 True\n", "3 numberOfCriticalBugsFoundUntil -0.009260 0.002500 False\n", "4 numberOfHighPriorityBugsFoundUntil 0.105383 0.001307 True" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: Unstable features: ['numberOfCriticalBugsFoundUntil']\n" ] } ], "source": [ "# PHASE 1 LIME\n", "for ds_name in CONFIG['phase1']:\n", " print(f\"\\n{'='*70}\")\n", " print(f\"LIME — Dataset: {ds_name}\")\n", " print(f\"{'='*70}\")\n", "\n", " data = DATASETS[ds_name]\n", " X_train = data['X_train']\n", " X_test = data['X_test']\n", " y_test = data['y_test']\n", " feature_names = data['feature_names']\n", "\n", " pipe_c = make_pipeline_c()\n", " X_train_c = pipe_c.fit_transform(X_train).values\n", " X_test_c = pipe_c.transform(X_test).values\n", "\n", " for mname in TOP2_MODELS[ds_name]:\n", " print(f\"\\n--- LIME for {mname} ---\")\n", " models = build_models(data['y_train'].values)\n", " model = models[mname]['model']\n", " model.fit(X_train_c, data['y_train'])\n", " probs = model.predict_proba(X_test_c)[:, 1]\n", "\n", " buggy_idx = np.where(y_test.values == 1)[0]\n", " clean_idx = np.where(y_test.values == 0)[0]\n", " conf_buggy_idx = int(buggy_idx[np.argmax(probs[buggy_idx])])\n", " conf_clean_idx = int(clean_idx[np.argmin(probs[clean_idx])])\n", " border_idx = int(np.argmin(np.abs(probs - 0.5)))\n", " instances = {\n", " 'confidently_buggy': conf_buggy_idx,\n", " 'borderline': border_idx,\n", " 'confidently_clean': conf_clean_idx,\n", " }\n", "\n", " explainer = LimeTabularExplainer(\n", " training_data=X_train_c,\n", " feature_names=feature_names,\n", " class_names=['clean', 'buggy'],\n", " mode='classification',\n", " discretize_continuous=False,\n", " sample_around_instance=True,\n", " random_state=CONFIG['random_state'],\n", " )\n", "\n", " for inst_label, idx in instances.items():\n", " x_inst = X_test_c[idx]\n", " true_label = int(y_test.values[idx])\n", " pred_prob = float(probs[idx])\n", " exp = explainer.explain_instance(\n", " x_inst, model.predict_proba,\n", " num_features=len(feature_names), num_samples=5000,\n", " )\n", " fig = exp.as_pyplot_figure()\n", " fig.suptitle(\n", " f\"{ds_name} | {mname} | {inst_label} | idx={idx} | \"\n", " f\"true={true_label} | prob={pred_prob:.3f}\"\n", " )\n", " plt.tight_layout()\n", " fname = f\"lime_{ds_name}_{mname}_{inst_label}.png\"\n", " plt.savefig(fname)\n", " plt.close(fig)\n", " print(f\"Saved LIME explanation: {fname}\")\n", "\n", " # 6.3 LIME stability check for confidently-buggy instance\n", " idx = conf_buggy_idx\n", " x_inst = X_test_c[idx]\n", " weights_runs = []\n", " for seed in [42, 123, 999]:\n", " expl_s = LimeTabularExplainer(\n", " training_data=X_train_c,\n", " feature_names=feature_names,\n", " class_names=['clean', 'buggy'],\n", " mode='classification',\n", " discretize_continuous=False,\n", " sample_around_instance=True,\n", " random_state=seed,\n", " )\n", " exp_s = expl_s.explain_instance(\n", " x_inst, model.predict_proba,\n", " num_features=len(feature_names), num_samples=5000,\n", " )\n", " w_dict = dict(exp_s.as_list())\n", " weights_runs.append([w_dict.get(f, 0.0) for f in feature_names])\n", "\n", " weights_arr = np.array(weights_runs)\n", " mean_w = weights_arr.mean(axis=0)\n", " std_w = weights_arr.std(axis=0)\n", " stab_df = pd.DataFrame({\n", " 'feature': feature_names,\n", " 'mean_LIME_weight': mean_w,\n", " 'std': std_w,\n", " 'stable': [std_w[i] < 0.1 * abs(mean_w[i]) if abs(mean_w[i]) > 1e-9 else False\n", " for i in range(len(feature_names))],\n", " })\n", " print(f\"\\n--- LIME Stability ({ds_name}, {mname}, confidently_buggy) ---\")\n", " display(stab_df)\n", " unstable = stab_df[~stab_df['stable']]['feature'].tolist()\n", " if unstable:\n", " print(f\"WARNING: Unstable features: {unstable}\")\n" ] }, { "cell_type": "markdown", "id": "cbf7d0d9", "metadata": {}, "source": [ "# Section 7 — SHAP (Best Model, Phase 1 Datasets)\n", "\n", "SHAP analysis for the best model on each Phase 1 dataset. Extract mean absolute SHAP values as weight vectors." ] }, { "cell_type": "code", "execution_count": 8, "id": "7a6cc3dd", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:56:09.835841Z", "iopub.status.busy": "2026-05-07T14:56:09.835580Z", "iopub.status.idle": "2026-05-07T14:57:04.451464Z", "shell.execute_reply": "2026-05-07T14:57:04.450574Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "======================================================================" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "SHAP — Dataset: eclipse | Best model: GradientBoosting\n", "======================================================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_2350/1849820119.py:53: FutureWarning: The NumPy global RNG was seeded by calling `np.random.seed`. In a future version this function will no longer use the global RNG. Pass `rng` explicitly to opt-in to the new behaviour and silence this warning.\n", " shap.summary_plot(shap_values, X_test_c, feature_names=feature_names,\n", "/tmp/ipykernel_2350/1849820119.py:63: FutureWarning: The NumPy global RNG was seeded by calling `np.random.seed`. In a future version this function will no longer use the global RNG. Pass `rng` explicitly to opt-in to the new behaviour and silence this warning.\n", " shap.summary_plot(shap_values, X_test_c, feature_names=feature_names,\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved shap_summary_eclipse.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- SHAP Weights (eclipse) ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_abs_SHAPweight
0numberOfBugsFoundUntil1.1247810.511651
1numberOfNonTrivialBugsFoundUntil0.5080460.231105
2numberOfMajorBugsFoundUntil0.3173380.144353
3numberOfCriticalBugsFoundUntil0.1750320.079620
4numberOfHighPriorityBugsFoundUntil0.0731410.033271
\n", "
" ], "text/plain": [ " feature mean_abs_SHAP weight\n", "0 numberOfBugsFoundUntil 1.124781 0.511651\n", "1 numberOfNonTrivialBugsFoundUntil 0.508046 0.231105\n", "2 numberOfMajorBugsFoundUntil 0.317338 0.144353\n", "3 numberOfCriticalBugsFoundUntil 0.175032 0.079620\n", "4 numberOfHighPriorityBugsFoundUntil 0.073141 0.033271" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Saved shap_weights_eclipse.json\n", "\n", "======================================================================\n", "SHAP — Dataset: mylyn | Best model: SVM\n", "======================================================================\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "bb77565a12f3457f98a236d99e9d795e", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/373 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremean_abs_SHAPweight
0numberOfBugsFoundUntil0.1206000.450861
4numberOfHighPriorityBugsFoundUntil0.0781520.292171
2numberOfMajorBugsFoundUntil0.0296330.110783
1numberOfNonTrivialBugsFoundUntil0.0260530.097398
3numberOfCriticalBugsFoundUntil0.0130500.048787
\n", "" ], "text/plain": [ " feature mean_abs_SHAP weight\n", "0 numberOfBugsFoundUntil 0.120600 0.450861\n", "4 numberOfHighPriorityBugsFoundUntil 0.078152 0.292171\n", "2 numberOfMajorBugsFoundUntil 0.029633 0.110783\n", "1 numberOfNonTrivialBugsFoundUntil 0.026053 0.097398\n", "3 numberOfCriticalBugsFoundUntil 0.013050 0.048787" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Saved shap_weights_mylyn.json\n", "\n", "Saved shap_weights_phase1.json\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# PHASE 1 SHAP\n", "for ds_name in CONFIG['phase1']:\n", " print(f\"\\n{'='*70}\")\n", " print(f\"SHAP — Dataset: {ds_name} | Best model: {BEST_MODEL[ds_name]}\")\n", " print(f\"{'='*70}\")\n", "\n", " data = DATASETS[ds_name]\n", " X_train = data['X_train']\n", " X_test = data['X_test']\n", " y_train = data['y_train']\n", " y_test = data['y_test']\n", " feature_names = data['feature_names']\n", "\n", " pipe_c = make_pipeline_c()\n", " X_train_c = pipe_c.fit_transform(X_train).values\n", " X_test_c = pipe_c.transform(X_test).values\n", "\n", " models = build_models(y_train.values)\n", " best_name = BEST_MODEL[ds_name]\n", " model = models[best_name]['model']\n", " model.fit(X_train_c, y_train)\n", "\n", " # 7.1 Determine explainer type\n", " tree_types = (RandomForestClassifier, DecisionTreeClassifier,\n", " ExtraTreesClassifier, GradientBoostingClassifier)\n", " if isinstance(model, tree_types):\n", " explainer = shap.TreeExplainer(model)\n", " elif XGBClassifier is not None and isinstance(model, XGBClassifier):\n", " explainer = shap.TreeExplainer(model)\n", " elif LGBMClassifier is not None and isinstance(model, LGBMClassifier):\n", " explainer = shap.TreeExplainer(model)\n", " elif isinstance(model, LogisticRegression):\n", " explainer = shap.LinearExplainer(model, X_train_c)\n", " else:\n", " background = shap.sample(X_train_c, 100, random_state=CONFIG['random_state'])\n", " explainer = shap.KernelExplainer(model.predict_proba, background)\n", "\n", " # 7.2 Compute SHAP values\n", " shap_vals = explainer.shap_values(X_test_c)\n", "\n", " # Handle different return shapes\n", " if isinstance(shap_vals, list):\n", " shap_values = shap_vals[1]\n", " elif shap_vals.ndim == 3:\n", " # (n_samples, n_features, n_classes) -> take positive class\n", " shap_values = shap_vals[:, :, 1]\n", " else:\n", " shap_values = shap_vals\n", "\n", " # 7.3 SHAP plots\n", " # Bar summary\n", " plt.figure(figsize=(10, 6))\n", " shap.summary_plot(shap_values, X_test_c, feature_names=feature_names,\n", " plot_type='bar', show=False)\n", " plt.title(f\"SHAP Bar Summary — {ds_name}\")\n", " plt.tight_layout()\n", " plt.savefig(f\"shap_summary_{ds_name}.png\")\n", " plt.close()\n", " print(f\"Saved shap_summary_{ds_name}.png\")\n", "\n", " # Beeswarm\n", " plt.figure(figsize=(10, 6))\n", " shap.summary_plot(shap_values, X_test_c, feature_names=feature_names,\n", " plot_type='dot', show=False)\n", " plt.title(f\"SHAP Beeswarm — {ds_name}\")\n", " plt.tight_layout()\n", " plt.savefig(f\"shap_beeswarm_{ds_name}.png\")\n", " plt.close()\n", "\n", " # Dependence plots for top-3 features\n", " mean_abs = np.abs(shap_values).mean(axis=0)\n", " top3_idx = np.argsort(mean_abs)[-3:][::-1]\n", " for idx in top3_idx:\n", " plt.figure(figsize=(8, 5))\n", " shap.dependence_plot(idx, shap_values, X_test_c,\n", " feature_names=feature_names, show=False)\n", " plt.title(f\"Dependence: {feature_names[idx]} — {ds_name}\")\n", " plt.tight_layout()\n", " plt.savefig(f\"shap_dependence_{ds_name}_{feature_names[idx]}.png\")\n", " plt.close()\n", "\n", " # Waterfall plots for 3 representative instances\n", " probs = model.predict_proba(X_test_c)[:, 1]\n", " buggy_idx = np.where(y_test.values == 1)[0]\n", " clean_idx = np.where(y_test.values == 0)[0]\n", " rep_indices = [\n", " int(buggy_idx[np.argmax(probs[buggy_idx])]),\n", " int(np.argmin(np.abs(probs - 0.5))),\n", " int(clean_idx[np.argmin(probs[clean_idx])]),\n", " ]\n", "\n", " for ridx in rep_indices:\n", " plt.figure(figsize=(10, 6))\n", " base = explainer.expected_value\n", " # Convert array expected_value to scalar for waterfall\n", " if hasattr(base, '__len__') and not isinstance(base, str):\n", " base = float(base[0])\n", " shap.waterfall_plot(shap.Explanation(\n", " values=shap_values[ridx],\n", " base_values=base,\n", " data=X_test_c[ridx],\n", " feature_names=feature_names,\n", " ), max_display=len(feature_names), show=False)\n", " plt.title(f\"Waterfall — {ds_name} — idx={ridx} — true={int(y_test.values[ridx])}\")\n", " plt.tight_layout()\n", " plt.savefig(f\"shap_waterfall_{ds_name}_idx{ridx}.png\")\n", " plt.close()\n", "\n", " # 7.4 Extract SHAP weight vector\n", " mean_abs_shap = np.abs(shap_values).mean(axis=0)\n", " shap_weights = mean_abs_shap / mean_abs_shap.sum()\n", " SHAP_WEIGHTS[ds_name] = dict(zip(feature_names, shap_weights))\n", "\n", " weight_df = pd.DataFrame({\n", " 'feature': feature_names,\n", " 'mean_abs_SHAP': mean_abs_shap,\n", " 'weight': shap_weights,\n", " }).sort_values('weight', ascending=False)\n", " print(f\"\\n--- SHAP Weights ({ds_name}) ---\")\n", " display(weight_df)\n", "\n", " with open(f\"shap_weights_{ds_name}.json\", 'w') as f:\n", " json.dump(SHAP_WEIGHTS[ds_name], f, indent=2)\n", " print(f\"Saved shap_weights_{ds_name}.json\")\n", "\n", "# Save merged phase1 SHAP weights\n", "with open(\"shap_weights_phase1.json\", 'w') as f:\n", " json.dump(SHAP_WEIGHTS, f, indent=2)\n", "print(\"\\nSaved shap_weights_phase1.json\")\n" ] }, { "cell_type": "markdown", "id": "23125db6", "metadata": {}, "source": [ "# Section 8 — Cross-Dataset SHAP Weight Averaging\n", "\n", "Align feature spaces across Phase 1 datasets, handle missing features as NaN, and compute a canonical averaged weight vector." ] }, { "cell_type": "code", "execution_count": 9, "id": "1aed1920", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:57:04.454361Z", "iopub.status.busy": "2026-05-07T14:57:04.454039Z", "iopub.status.idle": "2026-05-07T14:57:04.707461Z", "shell.execute_reply": "2026-05-07T14:57:04.706524Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unified feature space (5 features): ['numberOfBugsFoundUntil', 'numberOfCriticalBugsFoundUntil', 'numberOfHighPriorityBugsFoundUntil', 'numberOfMajorBugsFoundUntil', 'numberOfNonTrivialBugsFoundUntil']\n", "Saved averaged_shap_weights.json\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved averaged_shap_weights.png\n", "\n", "--- Averaged SHAP Weight Comparison ---\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featureaveraged_weightweight_eclipseweight_mylynn_datasets_contributing
0numberOfBugsFoundUntil0.48130.51170.45092
1numberOfCriticalBugsFoundUntil0.06420.07960.04882
2numberOfHighPriorityBugsFoundUntil0.16270.03330.29222
3numberOfMajorBugsFoundUntil0.12760.14440.11082
4numberOfNonTrivialBugsFoundUntil0.16430.23110.09742
\n", "
" ], "text/plain": [ " feature averaged_weight weight_eclipse \\\n", "0 numberOfBugsFoundUntil 0.4813 0.5117 \n", "1 numberOfCriticalBugsFoundUntil 0.0642 0.0796 \n", "2 numberOfHighPriorityBugsFoundUntil 0.1627 0.0333 \n", "3 numberOfMajorBugsFoundUntil 0.1276 0.1444 \n", "4 numberOfNonTrivialBugsFoundUntil 0.1643 0.2311 \n", "\n", " weight_mylyn n_datasets_contributing \n", "0 0.4509 2 \n", "1 0.0488 2 \n", "2 0.2922 2 \n", "3 0.1108 2 \n", "4 0.0974 2 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 8.1 Build unified feature space\n", "ALL_FEATURES = sorted(list(set().union(*[set(SHAP_WEIGHTS[ds].keys()) for ds in CONFIG['phase1']])))\n", "print(f\"Unified feature space ({len(ALL_FEATURES)} features): {ALL_FEATURES}\")\n", "\n", "weight_matrix = []\n", "for ds_name in CONFIG['phase1']:\n", " vec = []\n", " for f in ALL_FEATURES:\n", " vec.append(SHAP_WEIGHTS[ds_name].get(f, np.nan))\n", " weight_matrix.append(vec)\n", "\n", "weight_matrix = np.array(weight_matrix, dtype=float)\n", "\n", "# 8.2 Averaged weight vector (NaN-aware)\n", "AVERAGED_SHAP_WEIGHTS = np.nanmean(weight_matrix, axis=0)\n", "AVERAGED_SHAP_WEIGHTS = AVERAGED_SHAP_WEIGHTS / AVERAGED_SHAP_WEIGHTS.sum()\n", "avg_dict = {f: float(w) for f, w in zip(ALL_FEATURES, AVERAGED_SHAP_WEIGHTS)}\n", "\n", "with open(\"averaged_shap_weights.json\", 'w') as f:\n", " json.dump(avg_dict, f, indent=2)\n", "print(\"Saved averaged_shap_weights.json\")\n", "\n", "# Visualise\n", "fig, ax = plt.subplots(figsize=(10, 6))\n", "y_pos = np.arange(len(ALL_FEATURES))\n", "ax.barh(y_pos, AVERAGED_SHAP_WEIGHTS, color='seagreen')\n", "ax.set_yticks(y_pos)\n", "ax.set_yticklabels(ALL_FEATURES)\n", "ax.set_xlabel('Averaged SHAP Weight')\n", "ax.set_title('Averaged SHAP Weights Across Phase 1 Datasets')\n", "for i, v in enumerate(AVERAGED_SHAP_WEIGHTS):\n", " ax.text(v + 0.005, i, f\"{v:.3f}\", va='center', fontsize=9)\n", "plt.tight_layout()\n", "plt.savefig(\"averaged_shap_weights.png\")\n", "plt.close()\n", "print(\"Saved averaged_shap_weights.png\")\n", "\n", "# Table\n", "comp_rows = []\n", "for i, f in enumerate(ALL_FEATURES):\n", " row = {'feature': f, 'averaged_weight': f\"{AVERAGED_SHAP_WEIGHTS[i]:.4f}\"}\n", " for j, ds_name in enumerate(CONFIG['phase1']):\n", " row[f'weight_{ds_name}'] = f\"{weight_matrix[j, i]:.4f}\" if not np.isnan(weight_matrix[j, i]) else \"NaN\"\n", " row['n_datasets_contributing'] = int(np.sum(~np.isnan(weight_matrix[:, i])))\n", " comp_rows.append(row)\n", "\n", "comp_df = pd.DataFrame(comp_rows)\n", "print(\"\\n--- Averaged SHAP Weight Comparison ---\")\n", "display(comp_df)\n" ] }, { "cell_type": "markdown", "id": "4b2e7919", "metadata": {}, "source": [ "# Section 9 — Phase 2: Apply Averaged SHAP Weights to Remaining Datasets\n", "\n", "For each Phase 2 dataset: load, align features, create original and SHAP-weighted variants, retrain all 8 models, and compare." ] }, { "cell_type": "code", "execution_count": 10, "id": "49290102", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:57:04.709683Z", "iopub.status.busy": "2026-05-07T14:57:04.709463Z", "iopub.status.idle": "2026-05-07T14:57:18.321327Z", "shell.execute_reply": "2026-05-07T14:57:18.320129Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "======================================================================\n", "PHASE 2 — Dataset: equinox\n", "======================================================================\n", "Train: (259, 5) | Test: (65, 5)\n", "Class dist: [156 103]\n", "\n", "--- Variant: original ---\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2bb2416ab15144c18b8b37104e7ef8a9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "equinox-original: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modeldelta_f1_strdelta_roc_str
0RandomForest+0.0000+0.0020
1XGBoost+0.0000+0.0000
2LightGBM+0.0000+0.0000
3GradientBoosting+0.0000+0.0000
4ExtraTrees+0.0000+0.0000
5LogisticRegression+0.0000-0.0030
6SVM+0.0424-0.0325
7KNN-0.0720-0.0725
\n", "" ], "text/plain": [ " model delta_f1_str delta_roc_str\n", "0 RandomForest +0.0000 +0.0020\n", "1 XGBoost +0.0000 +0.0000\n", "2 LightGBM +0.0000 +0.0000\n", "3 GradientBoosting +0.0000 +0.0000\n", "4 ExtraTrees +0.0000 +0.0000\n", "5 LogisticRegression +0.0000 -0.0030\n", "6 SVM +0.0424 -0.0325\n", "7 KNN -0.0720 -0.0725" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Models benefiting from SHAP weighting: ['SVM']\n", "Models hurt by SHAP weighting: ['KNN']\n", "\n", "======================================================================\n", "PHASE 2 — Dataset: lucene\n", "======================================================================\n", "Train: (552, 5) | Test: (139, 5)\n", "Class dist: [501 51]\n", "\n", "--- Variant: original ---\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "83f83c850b5748f1a4ea8bd69078cccf", "version_major": 2, "version_minor": 0 }, "text/plain": [ "lucene-original: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modeldelta_f1_strdelta_roc_str
0RandomForest+0.0000+0.0000
1XGBoost+0.0000+0.0000
2LightGBM+0.0000+0.0000
3GradientBoosting+0.0000+0.0000
4ExtraTrees+0.0000+0.0000
5LogisticRegression+0.0000+0.0000
6SVM+0.0000-0.0049
7KNN+0.0000+0.0000
\n", "" ], "text/plain": [ " model delta_f1_str delta_roc_str\n", "0 RandomForest +0.0000 +0.0000\n", "1 XGBoost +0.0000 +0.0000\n", "2 LightGBM +0.0000 +0.0000\n", "3 GradientBoosting +0.0000 +0.0000\n", "4 ExtraTrees +0.0000 +0.0000\n", "5 LogisticRegression +0.0000 +0.0000\n", "6 SVM +0.0000 -0.0049\n", "7 KNN +0.0000 +0.0000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Models benefiting from SHAP weighting: []\n", "Models hurt by SHAP weighting: []\n", "\n", "======================================================================\n", "PHASE 2 — Dataset: pde\n", "======================================================================\n", "Train: (1197, 5) | Test: (300, 5)\n", "Class dist: [1030 167]\n", "\n", "--- Variant: original ---\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d1434329ff284e2bb99208252de791f9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "pde-original: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modeldelta_f1_strdelta_roc_str
0RandomForest+0.0025-0.0007
1XGBoost+0.0000+0.0000
2LightGBM+0.0000+0.0000
3GradientBoosting+0.0000+0.0014
4ExtraTrees+0.0000+0.0000
5LogisticRegression+0.0547-0.0008
6SVM+0.0240-0.0071
7KNN-0.0201-0.0672
\n", "" ], "text/plain": [ " model delta_f1_str delta_roc_str\n", "0 RandomForest +0.0025 -0.0007\n", "1 XGBoost +0.0000 +0.0000\n", "2 LightGBM +0.0000 +0.0000\n", "3 GradientBoosting +0.0000 +0.0014\n", "4 ExtraTrees +0.0000 +0.0000\n", "5 LogisticRegression +0.0547 -0.0008\n", "6 SVM +0.0240 -0.0071\n", "7 KNN -0.0201 -0.0672" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Models benefiting from SHAP weighting: ['RandomForest', 'LogisticRegression', 'SVM']\n", "Models hurt by SHAP weighting: ['KNN']\n" ] } ], "source": [ "# PHASE 2\n", "RESULTS_PHASE2 = {}\n", "\n", "for ds_name in CONFIG['phase2']:\n", " print(f\"\\n{'='*70}\")\n", " print(f\"PHASE 2 — Dataset: {ds_name}\")\n", " print(f\"{'='*70}\")\n", "\n", " data = DATASETS[ds_name]\n", " X = data['X']\n", " y = data['y']\n", " feature_names = data['feature_names']\n", "\n", " # 9.1 Align to ALL_FEATURES\n", " X_aligned = pd.DataFrame(0.0, index=X.index, columns=ALL_FEATURES)\n", " for f in feature_names:\n", " if f in ALL_FEATURES:\n", " X_aligned[f] = X[f].values\n", "\n", " # 9.2 Apply averaged SHAP weights\n", " weight_vec = np.array([avg_dict.get(f, 0.0) for f in ALL_FEATURES])\n", " X_weighted = X_aligned * weight_vec\n", "\n", " # Train/test split\n", " X_train_o, X_test_o, y_train, y_test = train_test_split(\n", " X_aligned, y, test_size=CONFIG['test_size'], stratify=y,\n", " random_state=CONFIG['random_state']\n", " )\n", " X_train_w, X_test_w, _, _ = train_test_split(\n", " X_weighted, y, test_size=CONFIG['test_size'], stratify=y,\n", " random_state=CONFIG['random_state']\n", " )\n", " print(f\"Train: {X_train_o.shape} | Test: {X_test_o.shape}\")\n", " print(f\"Class dist: {np.bincount(y_train)}\")\n", "\n", " RESULTS_PHASE2[ds_name] = {'original': {}, 'weighted': {}}\n", "\n", " for variant, X_tr, X_te in [('original', X_train_o, X_test_o),\n", " ('weighted', X_train_w, X_test_w)]:\n", " print(f\"\\n--- Variant: {variant} ---\")\n", " models = build_models(y_train.values)\n", " for mname, mdict in tqdm(models.items(), desc=f\"{ds_name}-{variant}\"):\n", " res = evaluate_model(mdict['model'], X_tr, y_train, X_te, y_test, mdict['pipeline'])\n", " RESULTS_PHASE2[ds_name][variant][mname] = res\n", " print(f\"{mname:20s} | F1={res['f1_macro']:.4f} | ROC={res['roc_auc']:.4f} | PR={res['pr_auc']:.4f}\")\n", "\n", " # 9.4 Comparative analysis\n", " orig_df = pd.DataFrame([\n", " {'model': m, 'f1_macro': RESULTS_PHASE2[ds_name]['original'][m]['f1_macro'],\n", " 'roc_auc': RESULTS_PHASE2[ds_name]['original'][m]['roc_auc'],\n", " 'pr_auc': RESULTS_PHASE2[ds_name]['original'][m]['pr_auc']}\n", " for m in RESULTS_PHASE2[ds_name]['original']\n", " ])\n", " wgt_df = pd.DataFrame([\n", " {'model': m, 'f1_macro': RESULTS_PHASE2[ds_name]['weighted'][m]['f1_macro'],\n", " 'roc_auc': RESULTS_PHASE2[ds_name]['weighted'][m]['roc_auc'],\n", " 'pr_auc': RESULTS_PHASE2[ds_name]['weighted'][m]['pr_auc']}\n", " for m in RESULTS_PHASE2[ds_name]['weighted']\n", " ])\n", " merged = orig_df.merge(wgt_df, on='model', suffixes=('_orig', '_wgt'))\n", " merged['delta_f1'] = merged['f1_macro_wgt'] - merged['f1_macro_orig']\n", " merged['delta_roc'] = merged['roc_auc_wgt'] - merged['roc_auc_orig']\n", "\n", " # Grouped bar chart\n", " fig, ax = plt.subplots(figsize=(12, 6))\n", " x = np.arange(len(merged))\n", " width = 0.35\n", " ax.bar(x - width/2, merged['f1_macro_orig'], width, label='Original', color='steelblue')\n", " ax.bar(x + width/2, merged['f1_macro_wgt'], width, label='SHAP-weighted', color='coral')\n", " ax.set_xticks(x)\n", " ax.set_xticklabels(merged['model'], rotation=45, ha='right')\n", " ax.set_ylabel('F1-macro')\n", " ax.set_title(f'Original vs SHAP-weighted — {ds_name}')\n", " ax.legend()\n", " plt.tight_layout()\n", " plt.savefig(f\"phase2_comparison_{ds_name}.png\")\n", " plt.close()\n", " print(f\"Saved phase2_comparison_{ds_name}.png\")\n", "\n", " # Delta table\n", " print(f\"\\n--- Delta Table ({ds_name}) ---\")\n", " delta_df = merged[['model', 'delta_f1', 'delta_roc']].copy()\n", " delta_df['delta_f1_str'] = delta_df['delta_f1'].apply(lambda v: f\"{v:+.4f}\")\n", " delta_df['delta_roc_str'] = delta_df['delta_roc'].apply(lambda v: f\"{v:+.4f}\")\n", " display(delta_df[['model', 'delta_f1_str', 'delta_roc_str']])\n", " winners = delta_df[delta_df['delta_f1'] > 0]['model'].tolist()\n", " losers = delta_df[delta_df['delta_f1'] < 0]['model'].tolist()\n", " print(f\"Models benefiting from SHAP weighting: {winners}\")\n", " print(f\"Models hurt by SHAP weighting: {losers}\")\n" ] }, { "cell_type": "markdown", "id": "eb11bc98", "metadata": {}, "source": [ "# Section 10 — Summary and Cross-Dataset Report\n", "\n", "Master results table, cross-dataset consistency plot, SHAP comparison, and final printed summary." ] }, { "cell_type": "code", "execution_count": 11, "id": "9e9283a1", "metadata": { "execution": { "iopub.execute_input": "2026-05-07T14:57:18.323682Z", "iopub.status.busy": "2026-05-07T14:57:18.323425Z", "iopub.status.idle": "2026-05-07T14:57:18.878584Z", "shell.execute_reply": "2026-05-07T14:57:18.877327Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved results_summary.csv\n", "Master results shape: (64, 7)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datasetmodelvariantf1_macroroc_aucpr_aucis_phase1
0eclipseRandomForestoriginal0.6190480.7242680.471125True
1eclipseXGBoostoriginal0.6129030.6830800.452841True
2eclipseLightGBMoriginal0.6230310.7309400.465996True
3eclipseGradientBoostingoriginal0.7236230.7464340.522457True
4eclipseExtraTreesoriginal0.6293230.7198960.388231True
5eclipseLogisticRegressionoriginal0.7011430.7843230.627092True
6eclipseSVMoriginal0.7086830.7718980.595115True
7eclipseKNNoriginal0.7035570.7498850.572197True
8mylynRandomForestoriginal0.5528010.6059780.184380True
9mylynXGBoostoriginal0.5523190.5745150.220625True
\n", "
" ], "text/plain": [ " dataset model variant f1_macro roc_auc pr_auc \\\n", "0 eclipse RandomForest original 0.619048 0.724268 0.471125 \n", "1 eclipse XGBoost original 0.612903 0.683080 0.452841 \n", "2 eclipse LightGBM original 0.623031 0.730940 0.465996 \n", "3 eclipse GradientBoosting original 0.723623 0.746434 0.522457 \n", "4 eclipse ExtraTrees original 0.629323 0.719896 0.388231 \n", "5 eclipse LogisticRegression original 0.701143 0.784323 0.627092 \n", "6 eclipse SVM original 0.708683 0.771898 0.595115 \n", "7 eclipse KNN original 0.703557 0.749885 0.572197 \n", "8 mylyn RandomForest original 0.552801 0.605978 0.184380 \n", "9 mylyn XGBoost original 0.552319 0.574515 0.220625 \n", "\n", " is_phase1 \n", "0 True \n", "1 True \n", "2 True \n", "3 True \n", "4 True \n", "5 True \n", "6 True \n", "7 True \n", "8 True \n", "9 True " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Saved cross_dataset_consistency.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saved shap_comparison.png\n", "\n", "======================================================================\n", "FINAL SUMMARY\n", "======================================================================\n", "Best model overall (highest mean F1-macro): SVM (mean F1=0.6320)\n", "Most consistent model (lowest std F1-macro): LightGBM (std F1=0.0366)\n", "Feature with highest averaged SHAP weight: numberOfBugsFoundUntil (weight=0.4813)\n", "Mean Δ_F1 on Phase 2 (weighted - original): +0.0013\n", "SHAP weighting IMPROVED performance on Phase 2 datasets on average.\n", "======================================================================\n" ] } ], "source": [ "# 10.1 Master results table\n", "master_rows = []\n", "\n", "# Phase 1\n", "for ds_name in CONFIG['phase1']:\n", " for mname, res in RESULTS_PHASE1[ds_name].items():\n", " master_rows.append({\n", " 'dataset': ds_name,\n", " 'model': mname,\n", " 'variant': 'original',\n", " 'f1_macro': res['f1_macro'],\n", " 'roc_auc': res['roc_auc'],\n", " 'pr_auc': res['pr_auc'],\n", " 'is_phase1': True,\n", " })\n", "\n", "# Phase 2\n", "for ds_name in CONFIG['phase2']:\n", " for variant in ['original', 'weighted']:\n", " for mname, res in RESULTS_PHASE2[ds_name][variant].items():\n", " master_rows.append({\n", " 'dataset': ds_name,\n", " 'model': mname,\n", " 'variant': variant,\n", " 'f1_macro': res['f1_macro'],\n", " 'roc_auc': res['roc_auc'],\n", " 'pr_auc': res['pr_auc'],\n", " 'is_phase1': False,\n", " })\n", "\n", "master_df = pd.DataFrame(master_rows)\n", "master_df.to_csv(\"results_summary.csv\", index=False)\n", "print(\"Saved results_summary.csv\")\n", "print(f\"Master results shape: {master_df.shape}\")\n", "display(master_df.head(10))\n", "\n", "# 10.2 Cross-dataset model consistency plot\n", "consistency = defaultdict(dict)\n", "for _, row in master_df.iterrows():\n", " if row['is_phase1'] or (not row['is_phase1'] and row['variant'] == 'weighted'):\n", " consistency[row['model']][row['dataset']] = row['f1_macro']\n", "\n", "fig, ax = plt.subplots(figsize=(12, 7))\n", "all_datasets = CONFIG['phase1'] + CONFIG['phase2']\n", "x = np.arange(len(all_datasets))\n", "for mname in sorted(consistency.keys()):\n", " vals = [consistency[mname].get(ds, np.nan) for ds in all_datasets]\n", " ax.plot(x, vals, marker='o', label=mname)\n", "ax.set_xticks(x)\n", "ax.set_xticklabels(all_datasets)\n", "ax.set_ylabel('F1-macro')\n", "ax.set_title('Cross-Dataset Model Consistency (Phase 1 original + Phase 2 weighted)')\n", "ax.legend()\n", "ax.set_ylim(0, 1.05)\n", "plt.tight_layout()\n", "plt.savefig(\"cross_dataset_consistency.png\")\n", "plt.close()\n", "print(\"Saved cross_dataset_consistency.png\")\n", "\n", "# 10.3 SHAP feature importance comparison\n", "fig, ax = plt.subplots(figsize=(10, 6))\n", "bar_width = 0.25\n", "x = np.arange(len(ALL_FEATURES))\n", "for i, ds_name in enumerate(CONFIG['phase1']):\n", " weights = [SHAP_WEIGHTS[ds_name].get(f, 0.0) for f in ALL_FEATURES]\n", " ax.bar(x + i*bar_width, weights, bar_width, label=ds_name)\n", "ax.bar(x + len(CONFIG['phase1'])*bar_width, AVERAGED_SHAP_WEIGHTS,\n", " bar_width, label='averaged', color='black')\n", "ax.set_xticks(x + bar_width)\n", "ax.set_xticklabels(ALL_FEATURES, rotation=45, ha='right')\n", "ax.set_ylabel('SHAP Weight')\n", "ax.set_title('SHAP Feature Importance Comparison')\n", "ax.legend()\n", "plt.tight_layout()\n", "plt.savefig(\"shap_comparison.png\")\n", "plt.close()\n", "print(\"Saved shap_comparison.png\")\n", "\n", "# 10.4 Final printed summary\n", "print(\"\\n\" + \"=\"*70)\n", "print(\"FINAL SUMMARY\")\n", "print(\"=\"*70)\n", "\n", "model_mean_f1 = {}\n", "model_std_f1 = {}\n", "for mname in sorted(consistency.keys()):\n", " vals = [consistency[mname].get(ds, np.nan) for ds in all_datasets]\n", " model_mean_f1[mname] = np.nanmean(vals)\n", " model_std_f1[mname] = np.nanstd(vals)\n", "\n", "best_overall = max(model_mean_f1, key=model_mean_f1.get)\n", "print(f\"Best model overall (highest mean F1-macro): {best_overall} (mean F1={model_mean_f1[best_overall]:.4f})\")\n", "\n", "most_consistent = min(model_std_f1, key=model_std_f1.get)\n", "print(f\"Most consistent model (lowest std F1-macro): {most_consistent} (std F1={model_std_f1[most_consistent]:.4f})\")\n", "\n", "top_feature = ALL_FEATURES[np.argmax(AVERAGED_SHAP_WEIGHTS)]\n", "print(f\"Feature with highest averaged SHAP weight: {top_feature} (weight={AVERAGED_SHAP_WEIGHTS.max():.4f})\")\n", "\n", "phase2_deltas = []\n", "for ds_name in CONFIG['phase2']:\n", " for mname in RESULTS_PHASE2[ds_name]['original']:\n", " d = RESULTS_PHASE2[ds_name]['weighted'][mname]['f1_macro'] - RESULTS_PHASE2[ds_name]['original'][mname]['f1_macro']\n", " phase2_deltas.append(d)\n", "mean_delta = np.mean(phase2_deltas)\n", "print(f\"Mean Δ_F1 on Phase 2 (weighted - original): {mean_delta:+.4f}\")\n", "if mean_delta > 0:\n", " print(\"SHAP weighting IMPROVED performance on Phase 2 datasets on average.\")\n", "else:\n", " print(\"SHAP weighting did NOT improve performance on Phase 2 datasets on average.\")\n", "\n", "print(\"=\"*70)\n" ] } ], "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0284da0f5b274e78838f38b3ef2dca55": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "02e2dc7a600a4c91a197341fa9d40e78": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "04ec49c98dd94569900101513328aa90": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "05235f0bc96547059ca6fe4457025389": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_10d60d1486b44fbc8bbd3faa54a6f915", "placeholder": "​", "style": "IPY_MODEL_564a613aa6d94ba39345122e9b745f8b", "tabbable": null, "tooltip": null, "value": " 8/8 [00:02<00:00,  2.81it/s]" } }, "05d22bc8cd804154b2157d2a82a331ee": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0858affa4842445cac0f54e2a8f7253c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0879b02b60f64264b14d61f50ae2c36e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "0919568854c74666ba410773c46d6531": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0d1ee3fa705d42be8e41ceec681c4ce3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_5aadfc1b281a4e59abc5d87ae7c89ea4", "placeholder": "​", "style": "IPY_MODEL_57fbb52b97684b428f933a6e02fb2228", "tabbable": null, "tooltip": null, "value": "equinox-original: 100%" } }, "0dc89b8c52b24ff4b1e6a0b45351d27c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0ecba73843334c449c6adc370c54391b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "10d60d1486b44fbc8bbd3faa54a6f915": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "110576e094ef44fcaa43bdfe287d65b0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_31ba4fe654af4fad98c1e09f29de0494", "placeholder": "​", "style": "IPY_MODEL_cd03671898e64c7d8b47801776ce2b24", "tabbable": null, "tooltip": null, "value": " 373/373 [00:49<00:00,  7.09it/s]" } }, "1458302bf50f4a2186435d0e0f2d49ad": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "160da6fb6320427591dfed49754b016b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "17e39b92dabf4c81a81bc5ae88796ad8": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "1893bf392d76449daa021ddb69c0aa6a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_1458302bf50f4a2186435d0e0f2d49ad", "placeholder": "​", "style": "IPY_MODEL_3c9899dbd3cb4695b21d2c4ea4686810", "tabbable": null, "tooltip": null, "value": " 8/8 [00:10<00:00,  1.10it/s]" } }, "198f2b2bb8ac4a19815ab28440e28af1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_160da6fb6320427591dfed49754b016b", "placeholder": "​", "style": "IPY_MODEL_0ecba73843334c449c6adc370c54391b", "tabbable": null, "tooltip": null, "value": " 8/8 [00:05<00:00,  1.56it/s]" } }, "1d2208887ff84ef28b759fb284cc1c8a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1ebd7a176f7a498ba91eff163d6477f3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_2e6dcc8ce49349b3b01e560b91f2d5bc", "placeholder": "​", "style": "IPY_MODEL_daf841ec919145349c4fe0ac8baf41ca", "tabbable": null, "tooltip": null, "value": "100%" } }, "1f4cb99e204a4b259e5a0bafbf45b1ad": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_8eff8d8991ae483c9b9334c9049f4c4b", "placeholder": "​", "style": "IPY_MODEL_e0825ef7ec7240f2a010a6d67b62dca8", "tabbable": null, "tooltip": null, "value": "lucene-weighted: 100%" } }, "1fec56b1ec0f44bab464a367147f0d63": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2050bf4ed4754e5fa129740cc3440a00": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "20b779efcc864138a4a4d823fcb607b5": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "22ad2409dd7f4e3e927b4ed51ab0b687": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2417bda2b35441aa813960c2d3853e62": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_de9024a569504bd4afd36143c315d361", "placeholder": "​", "style": "IPY_MODEL_17e39b92dabf4c81a81bc5ae88796ad8", "tabbable": null, "tooltip": null, "value": " 8/8 [00:06<00:00,  1.30it/s]" } }, "247614267d7b45eb8ca13b12ee3e4125": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_7140e4eee15d43b3b78e05505798ed43", "IPY_MODEL_d606de86e26d45579dd670efbb6dca0f", "IPY_MODEL_198f2b2bb8ac4a19815ab28440e28af1" ], "layout": "IPY_MODEL_a20759f9177f4340878ee83d8e199f65", "tabbable": null, "tooltip": null } }, "26e7c61625fc41e4bfe28c54ae6d062e": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "28bd53fb8811463096b598cb5ffe599d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_26e7c61625fc41e4bfe28c54ae6d062e", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_375fbe7d0d554fd0a72c890daf36f60b", "tabbable": null, "tooltip": null, "value": 8.0 } }, "2bb2416ab15144c18b8b37104e7ef8a9": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0d1ee3fa705d42be8e41ceec681c4ce3", "IPY_MODEL_919f2ce85b5e49e2b1c170467e254b17", "IPY_MODEL_b8f77d7dbbc1491690614d207daa44ac" ], "layout": "IPY_MODEL_b73469d3def44411a13c5371dc15c5e5", "tabbable": null, "tooltip": null } }, "2c297559b06c46b1b6f073a675d90d0e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "2d415d65588b45fd9fc4d08239ae14fc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2e6dcc8ce49349b3b01e560b91f2d5bc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "31639c90e81442a983107b10fb9163c0": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "31ba4fe654af4fad98c1e09f29de0494": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "346e868928b0421f80a3a70ae2bd40a3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "35055e1b7389436b88600679dbbc22eb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_6f4357e554ec4d98bc23bfddd3996007", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_ad58d70ddeff4b48a4155b8c3200f6d0", "tabbable": null, "tooltip": null, "value": 8.0 } }, "36e19e3b212f4e2a8ff4962b1d019b69": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_39b91419e0e1422a87a5cd4c0a6e4986", "IPY_MODEL_fd5beca9762c4386a116cb6ea0601b9d", "IPY_MODEL_1893bf392d76449daa021ddb69c0aa6a" ], "layout": "IPY_MODEL_672370ebe3bb44a488573bf617fad3b7", "tabbable": null, "tooltip": null } }, "375fbe7d0d554fd0a72c890daf36f60b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "38d1f02d5ce643888933e703e9d2d89b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3933f5e4a7594d28849fa75577e9aa2b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_1fec56b1ec0f44bab464a367147f0d63", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_0879b02b60f64264b14d61f50ae2c36e", "tabbable": null, "tooltip": null, "value": 8.0 } }, "39b91419e0e1422a87a5cd4c0a6e4986": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_56bcb0086c664a2990b9a8e9f8669140", "placeholder": "​", "style": "IPY_MODEL_2c297559b06c46b1b6f073a675d90d0e", "tabbable": null, "tooltip": null, "value": "CV eclipse: 100%" } }, "3bdd59c4fbd04a10a952e98f3ef690ea": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "3c9899dbd3cb4695b21d2c4ea4686810": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "3d0781dbf4504a8dbb18872f4983879d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_38d1f02d5ce643888933e703e9d2d89b", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_04ec49c98dd94569900101513328aa90", "tabbable": null, "tooltip": null, "value": 8.0 } }, "442dc07ba2c04dfa8b082c16eefe8a51": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_8dc69776a361482c9ccf03de5aa2a6e5", "placeholder": "​", "style": "IPY_MODEL_85da01686e91495bbb563806acd71548", "tabbable": null, "tooltip": null, "value": " 8/8 [00:02<00:00,  2.96it/s]" } }, "4a1d247bfa6c41f09a7e86e274e8356c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_0dc89b8c52b24ff4b1e6a0b45351d27c", "placeholder": "​", "style": "IPY_MODEL_ef513f3203f34b0588b26f821bd4c7bc", "tabbable": null, "tooltip": null, "value": " 8/8 [00:13<00:00,  1.30s/it]" } }, "4d2febe205f542f1a8351873555e2b2c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "4ef662a0223341eeaf94159b736f66bb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "4f67f20befda43119e11318be4df03c5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_d4ab78cc3f874a9a83efd22c31587d45", "IPY_MODEL_28bd53fb8811463096b598cb5ffe599d", "IPY_MODEL_2417bda2b35441aa813960c2d3853e62" ], "layout": "IPY_MODEL_0919568854c74666ba410773c46d6531", "tabbable": null, "tooltip": null } }, "51bc441a2ed34beca459f67f6f515d2b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "51d41c1f599546b892ad698782a365c0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "522cf0aca5074160a4d626771fb88607": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "564a613aa6d94ba39345122e9b745f8b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "56bcb0086c664a2990b9a8e9f8669140": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "57fbb52b97684b428f933a6e02fb2228": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "5aadfc1b281a4e59abc5d87ae7c89ea4": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5ede1b85299748cfa21d04e2397c8aa6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_522cf0aca5074160a4d626771fb88607", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_fd7e2dcd71d94de8b1f1ca6bd1777c7d", "tabbable": null, "tooltip": null, "value": 8.0 } }, "605d13e302c849b7a0022fad5b851159": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_e5abd23bb547493a8820c0ab496a7533", "max": 373.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_961efe5a5c634a7d83dd4d378d0dd9ed", "tabbable": null, "tooltip": null, "value": 373.0 } }, "6083e74a95ca49cabe1652425a7f8e7e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_c35082e5a14145cc8faee9a29f32b967", "placeholder": "​", "style": "IPY_MODEL_4ef662a0223341eeaf94159b736f66bb", "tabbable": null, "tooltip": null, "value": "pde-weighted: 100%" } }, "617e1b7eed9747e2988c9d572f209b0a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "672370ebe3bb44a488573bf617fad3b7": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6b0138ae2305411a98ab3b1a1616b33b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6e08471824604272acf89241db17436f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "6f4357e554ec4d98bc23bfddd3996007": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7140e4eee15d43b3b78e05505798ed43": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_d88824b36690468685e3d539b71b1c08", "placeholder": "​", "style": "IPY_MODEL_3bdd59c4fbd04a10a952e98f3ef690ea", "tabbable": null, "tooltip": null, "value": "Test eclipse: 100%" } }, "79ab93a18efe40e380d1f663e9ed349b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7af6cb2e27ee4eac9b706dc21c32dd50": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8152e391854d41418417b1f9008208f6": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "83f83c850b5748f1a4ea8bd69078cccf": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_df37ae06dd9b4f84bd6390a1486ea9c0", "IPY_MODEL_a4961208765a4615b9936322ef0141a5", "IPY_MODEL_e1321c32fe604168a3114e4efd86e1f5" ], "layout": "IPY_MODEL_22ad2409dd7f4e3e927b4ed51ab0b687", "tabbable": null, "tooltip": null } }, "85da01686e91495bbb563806acd71548": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "8b829c3c176343c68badc2c60e955d5d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "8dc69776a361482c9ccf03de5aa2a6e5": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8eff8d8991ae483c9b9334c9049f4c4b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "919f2ce85b5e49e2b1c170467e254b17": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_6b0138ae2305411a98ab3b1a1616b33b", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_2050bf4ed4754e5fa129740cc3440a00", "tabbable": null, "tooltip": null, "value": 8.0 } }, "922a74d8bfe245b493776e230f19e35f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_93a382e07d484cedbf2bd4c82c5b511f", "placeholder": "​", "style": "IPY_MODEL_f94c9fbd8a2a48c088189d77428c43b6", "tabbable": null, "tooltip": null, "value": "equinox-weighted: 100%" } }, "93a382e07d484cedbf2bd4c82c5b511f": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "961efe5a5c634a7d83dd4d378d0dd9ed": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "9646791c601f422599eea54b25460718": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "9a2021e1e6cf4dd484127c057cdfd263": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_6083e74a95ca49cabe1652425a7f8e7e", "IPY_MODEL_35055e1b7389436b88600679dbbc22eb", "IPY_MODEL_05235f0bc96547059ca6fe4457025389" ], "layout": "IPY_MODEL_fca5a24e30104db6b134da0596895588", "tabbable": null, "tooltip": null } }, "9b852374f85146ea823f1ed5c3a06e5b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_0858affa4842445cac0f54e2a8f7253c", "placeholder": "​", "style": "IPY_MODEL_6e08471824604272acf89241db17436f", "tabbable": null, "tooltip": null, "value": " 8/8 [00:01<00:00,  3.11it/s]" } }, "a19d03918e994c6f8cab3f054c5a4108": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_1f4cb99e204a4b259e5a0bafbf45b1ad", "IPY_MODEL_5ede1b85299748cfa21d04e2397c8aa6", "IPY_MODEL_ca3f9f0f93574948a68229d0a5141d5d" ], "layout": "IPY_MODEL_dc429b44001e4edcbdebd2fb3fd1c973", "tabbable": null, "tooltip": null } }, "a20759f9177f4340878ee83d8e199f65": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a4961208765a4615b9936322ef0141a5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_02e2dc7a600a4c91a197341fa9d40e78", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_346e868928b0421f80a3a70ae2bd40a3", "tabbable": null, "tooltip": null, "value": 8.0 } }, "a55c1e367ca54a74a222e7e18bfede16": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ad58d70ddeff4b48a4155b8c3200f6d0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "b65cd0e13eeb4fefb899be3f0a7f316c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "b73469d3def44411a13c5371dc15c5e5": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b8f77d7dbbc1491690614d207daa44ac": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_05d22bc8cd804154b2157d2a82a331ee", "placeholder": "​", "style": "IPY_MODEL_cc364820cffc48f1b34e0569b5708fbc", "tabbable": null, "tooltip": null, "value": " 8/8 [00:01<00:00,  3.20it/s]" } }, "b99273bb58a44526825c247e3a902f3c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_c2fd44f6263b414f9ddb886736d02d9d", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_9646791c601f422599eea54b25460718", "tabbable": null, "tooltip": null, "value": 8.0 } }, "bb77565a12f3457f98a236d99e9d795e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_1ebd7a176f7a498ba91eff163d6477f3", "IPY_MODEL_605d13e302c849b7a0022fad5b851159", "IPY_MODEL_110576e094ef44fcaa43bdfe287d65b0" ], "layout": "IPY_MODEL_1d2208887ff84ef28b759fb284cc1c8a", "tabbable": null, "tooltip": null } }, "bfae16dd28224fbabb7e1905db995c9e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "c2fd44f6263b414f9ddb886736d02d9d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c35082e5a14145cc8faee9a29f32b967": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c9899cc475b242b684fdef7203c75fbc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ca3f9f0f93574948a68229d0a5141d5d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_79ab93a18efe40e380d1f663e9ed349b", "placeholder": "​", "style": "IPY_MODEL_bfae16dd28224fbabb7e1905db995c9e", "tabbable": null, "tooltip": null, "value": " 8/8 [00:02<00:00,  4.17it/s]" } }, "cc364820cffc48f1b34e0569b5708fbc": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "cd03671898e64c7d8b47801776ce2b24": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "d1434329ff284e2bb99208252de791f9": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_f00ba37c0cc94e9d963f88a3e55a355c", "IPY_MODEL_b99273bb58a44526825c247e3a902f3c", "IPY_MODEL_442dc07ba2c04dfa8b082c16eefe8a51" ], "layout": "IPY_MODEL_ff61fd8b0bf44d4584cabd6680eef38e", "tabbable": null, "tooltip": null } }, "d4ab78cc3f874a9a83efd22c31587d45": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_8152e391854d41418417b1f9008208f6", "placeholder": "​", "style": "IPY_MODEL_51d41c1f599546b892ad698782a365c0", "tabbable": null, "tooltip": null, "value": "Test mylyn: 100%" } }, "d606de86e26d45579dd670efbb6dca0f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_a55c1e367ca54a74a222e7e18bfede16", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_e385ab9eb62d48d08d8276f721c0d980", "tabbable": null, "tooltip": null, "value": 8.0 } }, "d88824b36690468685e3d539b71b1c08": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "daf841ec919145349c4fe0ac8baf41ca": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "dc429b44001e4edcbdebd2fb3fd1c973": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "de9024a569504bd4afd36143c315d361": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "df37ae06dd9b4f84bd6390a1486ea9c0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_f6149532775647bba639b367269b4f34", "placeholder": "​", "style": "IPY_MODEL_0284da0f5b274e78838f38b3ef2dca55", "tabbable": null, "tooltip": null, "value": "lucene-original: 100%" } }, "e0825ef7ec7240f2a010a6d67b62dca8": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "e1321c32fe604168a3114e4efd86e1f5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_7af6cb2e27ee4eac9b706dc21c32dd50", "placeholder": "​", "style": "IPY_MODEL_51bc441a2ed34beca459f67f6f515d2b", "tabbable": null, "tooltip": null, "value": " 8/8 [00:02<00:00,  4.01it/s]" } }, "e385ab9eb62d48d08d8276f721c0d980": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "e574f804ba554d1f8e97c1256ba9fa1c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_617e1b7eed9747e2988c9d572f209b0a", "placeholder": "​", "style": "IPY_MODEL_8b829c3c176343c68badc2c60e955d5d", "tabbable": null, "tooltip": null, "value": "CV mylyn: 100%" } }, "e5abd23bb547493a8820c0ab496a7533": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e6a9373f078d4b079ff1e6f0a095b629": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_e574f804ba554d1f8e97c1256ba9fa1c", "IPY_MODEL_3d0781dbf4504a8dbb18872f4983879d", "IPY_MODEL_4a1d247bfa6c41f09a7e86e274e8356c" ], "layout": "IPY_MODEL_20b779efcc864138a4a4d823fcb607b5", "tabbable": null, "tooltip": null } }, "ef513f3203f34b0588b26f821bd4c7bc": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "f00ba37c0cc94e9d963f88a3e55a355c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_2d415d65588b45fd9fc4d08239ae14fc", "placeholder": "​", "style": "IPY_MODEL_b65cd0e13eeb4fefb899be3f0a7f316c", "tabbable": null, "tooltip": null, "value": "pde-original: 100%" } }, "f6149532775647bba639b367269b4f34": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f94c9fbd8a2a48c088189d77428c43b6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "fc0f28da08a04721acc6065aa9bcb56c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_922a74d8bfe245b493776e230f19e35f", "IPY_MODEL_3933f5e4a7594d28849fa75577e9aa2b", "IPY_MODEL_9b852374f85146ea823f1ed5c3a06e5b" ], "layout": "IPY_MODEL_c9899cc475b242b684fdef7203c75fbc", "tabbable": null, "tooltip": null } }, "fca5a24e30104db6b134da0596895588": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "fd5beca9762c4386a116cb6ea0601b9d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_31639c90e81442a983107b10fb9163c0", "max": 8.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_4d2febe205f542f1a8351873555e2b2c", "tabbable": null, "tooltip": null, "value": 8.0 } }, "fd7e2dcd71d94de8b1f1ca6bd1777c7d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "ff61fd8b0bf44d4584cabd6680eef38e": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": 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, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }