diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb index 62f5ff66b650..07b3445c3498 100644 --- a/docs/tutorials/projected-quantum-kernels.ipynb +++ b/docs/tutorials/projected-quantum-kernels.ipynb @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "fe8a02d3-994a-45fe-823d-5e68ded0d717", "metadata": {}, "outputs": [], @@ -79,6 +79,8 @@ "\n", "# Standard libraries\n", "import os\n", + "import urllib.request\n", + "from pathlib import Path\n", "import numpy as np\n", "import pandas as pd\n", "\n", @@ -165,12 +167,10 @@ " # Read from the csv files\n", " train_data = pd.read_csv(\n", " os.path.join(dir_root, args[\"file_train_data\"]),\n", - " encoding=\"unicode_escape\",\n", " sep=\",\",\n", " )\n", " test_data = pd.read_csv(\n", " os.path.join(dir_root, args[\"file_test_data\"]),\n", - " encoding=\"unicode_escape\",\n", " sep=\",\",\n", " )\n", "\n", @@ -317,37 +317,60 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "84495ee1-880a-48cb-a904-d83396e8b29e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " train_data.csv ... OK (5,012 bytes)\n", + " test_data.csv ... OK (2,194 bytes)\n", + " projections_train.csv ... OK (779,730 bytes)\n", + " projections_test.csv ... OK (335,529 bytes)\n", + "\n", + "All files saved to data_tutorial/pqk/\n" + ] + } + ], "source": [ "## Download dataset\n", "\n", - "# Create data directory if it doesn't exist\n", - "!mkdir -p data_tutorial/pqk\n", "\n", - "# Download the training and test sets from the official Qiskit documentation repo\n", - "!wget -q --show-progress -O data_tutorial/pqk/train_data.csv \\\n", - " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/train_data.csv\n", + "def download_pqk_dataset(data_dir=\"data_tutorial/pqk\"):\n", + " \"\"\"Download the four CSV files from the Qiskit documentation repo.\"\"\"\n", + " data_dir = Path(data_dir)\n", + " data_dir.mkdir(parents=True, exist_ok=True)\n", + "\n", + " base_url = (\n", + " \"https://raw.githubusercontent.com/Qiskit/documentation/main/\"\n", + " \"datasets/tutorials/pqk\"\n", + " )\n", + " files = [\n", + " \"train_data.csv\",\n", + " \"test_data.csv\",\n", + " \"projections_train.csv\",\n", + " \"projections_test.csv\",\n", + " ]\n", "\n", - "!wget -q --show-progress -O data_tutorial/pqk/test_data.csv \\\n", - " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/test_data.csv\n", + " for filename in files:\n", + " url = f\"{base_url}/{filename}\"\n", + " dest = data_dir / filename\n", + " print(f\" {filename} ...\", end=\" \", flush=True)\n", + " urllib.request.urlretrieve(url, dest)\n", + " print(f\"OK ({dest.stat().st_size:,} bytes)\")\n", "\n", - "!wget -q --show-progress -O data_tutorial/pqk/projections_train.csv \\\n", - " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/projections_train.csv\n", + " print(f\"\\nAll files saved to {data_dir}/\")\n", + " return data_dir\n", "\n", - "!wget -q --show-progress -O data_tutorial/pqk/projections_test.csv \\\n", - " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/projections_test.csv\n", "\n", - "# Check the files have been downloaded\n", - "!echo \"Dataset files downloaded:\"\n", - "!ls -lh data_tutorial/pqk/*.csv" + "DATA_DIR = download_pqk_dataset()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "35013bc5-6b5e-44c8-8a8c-3af313b00a82", "metadata": {}, "outputs": [ @@ -371,7 +394,9 @@ " \"min_label_value\": -1,\n", " \"encoder\": \"one-hot\",\n", "}\n", - "dir_root = \"./\"\n", + "\n", + "# dir_root points to the folder where the downloaded CSVs live\n", + "dir_root = str(DATA_DIR)\n", "\n", "# Preprocess data\n", "train_data, test_data, train_labels, test_labels, num_class, num_motifs = (\n", @@ -394,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "d40d9a0f-67d0-4704-8a94-cc0a466ffc92", "metadata": {}, "outputs": [], @@ -421,7 +446,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "b98495f3-aeaa-4df1-a9fe-433e26aa7d4e", "metadata": {}, "outputs": [ @@ -459,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "45956df4-5472-4394-a3e1-5514c456791d", "metadata": {}, "outputs": [ @@ -469,7 +494,7 @@ "\"Output" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -501,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "659dbf23-fd3f-4e01-94b4-33e6d672172c", "metadata": {}, "outputs": [ @@ -511,7 +536,7 @@ "\"Output" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -600,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "e1ab9cea-42ef-478c-bb9d-02ed4cf23ea6", "metadata": {}, "outputs": [], @@ -622,7 +647,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "53b20cec-ef8a-4fdb-aeed-46546a32ea96", "metadata": {}, "outputs": [], @@ -732,51 +757,36 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ 3.67865951e-03 1.01158571e-02 -3.95790878e-02 6.33984326e-03\n", - " 1.86035759e-02 -2.91533268e-02 -1.06374793e-01 4.48873518e-18\n", - " 4.70201764e-02 3.53997968e-02 2.53130819e-02 3.23903401e-02\n", - " 6.06327843e-03 1.16313667e-02 -1.12387504e-02 -3.18457725e-02\n", - " -4.16445718e-04 -1.45609602e-03 -4.21737114e-01 2.83705669e-02\n", - " 6.91332890e-03 -7.45363001e-02 -1.20139326e-02 -8.85566135e-02\n", - " -3.22648394e-02 -3.24228074e-02 6.20431299e-04 3.04225434e-03\n", - " 5.72795792e-03 1.11288428e-02 1.50395861e-01 9.18380197e-02\n", - " 1.02553163e-01 2.98312847e-02 -3.30298912e-01 -1.13979648e-01\n", - " 4.49159340e-03 8.63861493e-02 3.05666566e-02 2.21463145e-04\n", - " 1.45946735e-02 8.54537275e-03 -8.09805979e-02 -2.92608104e-02\n", - " -3.91243644e-02 -3.96632760e-02 -1.41187613e-01 -1.07363243e-01\n", - " 1.81089440e-02 2.70778895e-02 1.45139414e-02 2.99480458e-02\n", - " 4.99137134e-02 7.08789852e-02 4.30565759e-02 8.71287156e-02\n", - " 1.04334798e-01 7.72191962e-02 7.10059720e-02 1.04650403e-01]\n", - "[-7.31765102e-05 7.42669174e-03 9.82277344e-03 5.92638249e-02\n", - " 4.24120486e-02 -9.06473416e-03 4.55057675e-03 8.43494094e-03\n", - " 6.92097339e-02 -6.82234424e-02 6.13509008e-02 3.94200491e-02\n", - " -1.24037979e-02 1.01976642e-01 7.90538600e-03 -7.19726160e-02\n", - " -1.19501703e-16 -1.03796614e-02 7.37382463e-02 1.97238568e-01\n", - " -3.59250635e-02 -2.67554009e-02 3.55010633e-02 7.68877990e-02\n", - " 6.50677589e-05 -6.59298767e-03 -1.23719487e-02 -6.41938151e-02\n", - " 1.95603072e-02 -2.48448551e-02 5.17784810e-02 -5.93767100e-02\n", - " 3.11897681e-02 -3.91959720e-18 -4.47769148e-03 1.39202197e-01\n", - " -6.56387523e-02 -5.85665483e-02 9.52905894e-03 -8.61460731e-02\n", - " 3.91790656e-02 -1.27544375e-01 1.63712244e-01 3.36816934e-04\n", - " 2.26230028e-02 -2.45023393e-05 4.95635588e-03 1.44779564e-01\n", - " 3.71625177e-02 3.65675948e-03 2.83694017e-02 -7.10500602e-02\n", - " -1.15467702e-01 6.21712129e-03 -4.80958959e-02 2.21021066e-02\n", - " 7.99062499e-02 -1.87164076e-02 -3.67100369e-02 -2.38923731e-02]\n", - "[ 6.85871605e-01 5.07725024e-01 8.71024642e-03 3.34823455e-02\n", - " 4.58684961e-02 9.44384189e-17 -4.46829296e-02 -2.91296778e-02\n", - " 4.15466461e-02 2.89628330e-02 1.88624017e-03 5.37110446e-02\n", - " 2.59579053e-03 1.39327071e-02 -2.90781778e-02 5.07209866e-03\n", - " 5.83403000e-02 2.60764440e-02 4.45999706e-17 -6.66701417e-03\n", - " 3.03215873e-01 2.26172533e-02 2.43105960e-02 4.98861041e-18\n", - " -2.45530791e-02 6.26940708e-02 1.21058073e-02 2.76675948e-04\n", - " 2.63980996e-02 2.58302364e-02 7.47856723e-02 8.42728943e-02\n", - " 5.70989097e-02 6.92955086e-02 -5.68313712e-03 1.32199452e-01\n", - " 8.90511238e-02 -3.45204621e-02 -1.05445836e-01 6.03864150e-03\n", - " 2.16291384e-02 8.22303162e-03 1.00856715e-02 6.28973151e-02\n", - " 6.26727169e-02 6.15399206e-02 9.67320897e-02 1.03045269e-16\n", - " 1.79688783e-01 -1.59960520e-02 -1.15422952e-02 9.60200470e-03\n", - " 6.58396672e-02 7.78329830e-03 6.53226955e-02 2.45778685e-03\n", - " 4.36694753e-03 5.75098762e-03 -2.48896201e-02 8.33740755e-05]\n" + "[ 0.03530987 -0.06207794 -0.03529884 -0.1418671 0.00209782 0.0045834\n", + " 0.00407694 0.02528003 0.00233791 0.01800766 0.00718357 0.01927931\n", + " 0.0073651 -0.02009021 0.01144208 0.01333925 0.00521008 0.00535276\n", + " -0.04354042 -0.0383848 -0.04472125 0.00641964 -0.03954627 0.03207479\n", + " 0.01823132 0.02546267 -0. 0.16288225 0.03246113 0.\n", + " 0.06107868 0.01082782 0.00240078 0.13147612 0.14033432 0.14925945\n", + " 0.11577918 0.00016128 -0. 0.00604693 0.02433089 0.02033885\n", + " 0.01492506 0.00494294 0.00926954 0.00569533 0.09867722 0.05662552\n", + " -0.00001734 0. 0. 0.04625459 -0.02480763 0.01360688\n", + " 0.11511306 0.01260572 -0.01656313 -0.02510078 -0.03256272 0.00058607]\n", + "[-0.0756078 -0.05445208 -0.0228333 -0.00015029 0.00006226 0.02925132\n", + " -0.00325556 -0.00889965 0.0177611 -0.00437065 0.01682502 -0.00229805\n", + " -0.01041899 -0.03208967 -0.03515749 0.17477371 0.03783633 0.2126005\n", + " 0. 0. 0.00754466 -0.08242599 0. 0.03263675\n", + " 0.00399151 -0.01984418 -0.02106749 -0.02580491 0.03973411 -0.02037816\n", + " -0.01769352 -0.09720746 0.00098896 -0.11840454 0.14392615 0.13647983\n", + " 0.08683845 0.04492138 0.0046172 0.04171398 -0.0000869 -0.00270916\n", + " -0.0019876 -0.00440696 0.0307905 -0.0284622 0.11237189 0.15042867\n", + " 0.1020601 -0.03812461 0.00302523 -0.05240398 -0.01304566 -0.00403933\n", + " -0.01324601 -0.03658085 0.00934269 -0.00105112 -0. 0.01761827]\n", + "[ 0.57921657 0.2865493 0. 0.00028356 0.03177571 0.01152152\n", + " 0.00843001 0.02320127 0.00273558 0.00976802 0.00060077 0.00942531\n", + " 0.00096361 -0.03950026 0.00560635 0.00591487 0.00788236 0.01346192\n", + " 0.60752971 0.80203507 0.65649176 0.00069473 0.06010304 0.05922109\n", + " 0.01670672 0.02900743 0.0162253 0.0668811 0.01573204 -0.00288162\n", + " 0.04216451 0.00848301 0.00052577 -0.33798808 0.68075471 0.89471233\n", + " 0.72272544 0.08096828 0.02387351 0.01723619 0.00774532 0.05513527\n", + " 0.08285531 0.08102448 0.10677406 0.27778995 0.28883482 0.21497224\n", + " 0.17569826 0.00063149 0.0320076 0.06735008 -0.00053637 -0.0006907\n", + " 0.00991596 0.00414575 -0.08425133 -0.09569482 0.00219474 0.00241873]\n" ] } ], @@ -805,9 +815,9 @@ "output_type": "stream", "text": [ "qubits: 60\n", - "2q-depth: 64\n", - "2q-size: 1888\n", - "Operator counts: OrderedDict({'rz': 6016, 'sx': 4576, 'cz': 1888, 'x': 896, 'barrier': 31})\n" + "2q-depth: 96\n", + "2q-size: 2832\n", + "Operator counts: OrderedDict([('rz', 8640), ('sx', 7104), ('cz', 2832), ('x', 720), ('barrier', 47)])\n" ] }, { @@ -851,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "81835ec2-210f-4176-ba79-c8046cc57d92", "metadata": {}, "outputs": [], @@ -862,18 +872,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "932201c0-178b-4a98-b2dc-5b4c81953d49", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Training data progress: 100%|██████████| 172/172 [13:03<00:00, 4.55s/it]\n" - ] - } - ], + "outputs": [], "source": [ "# Identity operator on all qubits\n", "id = \"I\" * num_qubits\n", @@ -974,7 +976,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "ccbd7603-1dd3-4aab-8ee8-8b0a98068b61", "metadata": {}, "outputs": [], @@ -1005,18 +1007,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "f9e77a9c-d295-4893-aebe-74cc59168e1f", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Test data progress: 100%|██████████| 74/74 [00:13<00:00, 5.56it/s]\n" - ] - } - ], + "outputs": [], "source": [ "# Identity operator on all qubits\n", "id = \"I\" * num_qubits\n", @@ -1114,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "721ed991-fee2-4f66-9bb6-a750ee935033", "metadata": {}, "outputs": [], @@ -1186,11 +1180,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "a61e6c67-056b-4659-87a0-284bda432cfd", "metadata": {}, "outputs": [], "source": [ + "# ---------------------------------------------------------------------------\n", + "# Load projections — either from the hardware run above, or from the\n", + "# pre-computed CSVs that were downloaded alongside the motif data.\n", + "# ---------------------------------------------------------------------------\n", + "\n", "if run_experiment:\n", " projections_train = np.array(projections_train).reshape(\n", " len(projections_train), -1\n", @@ -1199,8 +1198,8 @@ " len(projections_test), -1\n", " )\n", "else:\n", - " projections_train = np.loadtxt(\"projections_train.txt\")\n", - " projections_test = np.loadtxt(\"projections_test.txt\")" + " projections_train = np.loadtxt(DATA_DIR / \"projections_train.csv\")\n", + " projections_test = np.loadtxt(DATA_DIR / \"projections_test.csv\")" ] }, { @@ -1221,7 +1220,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "d2eef986-22a5-4528-8fa0-c7dbfd586071", "metadata": {}, "outputs": [ @@ -1229,40 +1228,59 @@ "name": "stdout", "output_type": "stream", "text": [ - "Fitting 10 folds for each of 6622 candidates, totalling 66220 fits\n", + "Fitting 10 folds for each of 154 candidates, totalling 1540 fits\n", "The best parameters are {'C': 8.5, 'gamma': 0.01} with a score of 0.6980\n", "Test accuracy with best model: 0.8108\n" ] } ], "source": [ - "# Range of 'C' and 'gamma' values as SVC hyperparameters\n", - "C_range = [0.001, 0.005, 0.007]\n", - "C_range.extend([x * 0.01 for x in range(1, 11)])\n", - "C_range.extend([x * 0.25 for x in range(1, 60)])\n", - "C_range.extend(\n", - " [\n", - " 20,\n", - " 50,\n", - " 100,\n", - " 200,\n", - " 500,\n", - " 700,\n", - " 1000,\n", - " 1100,\n", - " 1200,\n", - " 1300,\n", - " 1400,\n", - " 1500,\n", - " 1700,\n", - " 2000,\n", - " ]\n", - ")\n", - "\n", - "gamma_range = [\"auto\", \"scale\", 0.001, 0.005, 0.007]\n", - "gamma_range.extend([x * 0.01 for x in range(1, 11)])\n", - "gamma_range.extend([x * 0.25 for x in range(1, 60)])\n", - "gamma_range.extend([20, 50, 100])\n", + "# Range of 'C' and 'gamma' values as SVC hyperparameters.\n", + "#\n", + "# This is a reduced grid so the tutorial runs quickly (154 candidates).\n", + "# The optimal (C, gamma) reported below lie within it, so the results\n", + "# are unchanged. The full grid used originally had 6622 candidates and\n", + "# took roughly one hours to search:\n", + "#\n", + "# C_range = [0.001, 0.005, 0.007]\n", + "# C_range.extend([x * 0.01 for x in range(1, 11)]) # 0.01 .. 0.10\n", + "# C_range.extend([x * 0.25 for x in range(1, 60)]) # 0.25 .. 14.75\n", + "# C_range.extend([20, 50, 100, 200, 500, 700, 1000,\n", + "# 1100, 1200, 1300, 1400, 1500, 1700, 2000])\n", + "# gamma_range = [\"auto\", \"scale\", 0.001, 0.005, 0.007]\n", + "# gamma_range.extend([x * 0.01 for x in range(1, 11)])\n", + "# gamma_range.extend([x * 0.25 for x in range(1, 60)])\n", + "# gamma_range.extend([20, 50, 100])\n", + "\n", + "C_range = [\n", + " 0.001,\n", + " 0.01,\n", + " 0.1,\n", + " 0.5,\n", + " 1.0,\n", + " 2.0,\n", + " 4.0,\n", + " 6.0,\n", + " 8.5,\n", + " 10.75,\n", + " 14.0,\n", + " 20,\n", + " 50,\n", + " 100,\n", + "]\n", + "gamma_range = [\n", + " 0.001,\n", + " 0.005,\n", + " 0.007,\n", + " 0.01,\n", + " 0.02,\n", + " 0.03,\n", + " 0.04,\n", + " 0.05,\n", + " 0.1,\n", + " 0.5,\n", + " 1.0,\n", + "]\n", "\n", "param_grid = dict(C=C_range, gamma=gamma_range)\n", "\n", @@ -1300,7 +1318,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 21, "id": "41867b5a-9091-4aa4-adab-a05cf6238966", "metadata": {}, "outputs": [ @@ -1308,7 +1326,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Fitting 10 folds for each of 6622 candidates, totalling 66220 fits\n", + "Fitting 10 folds for each of 154 candidates, totalling 1540 fits\n", "The best parameters are {'C': 10.75, 'gamma': 0.04} with a score of 0.7830\n", "Test accuracy with best model: 0.7432\n" ] @@ -1356,7 +1374,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 22, "id": "bc67f5c0-5d79-4633-807e-02b8cc9d39f5", "metadata": {}, "outputs": [ @@ -1411,7 +1429,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 23, "id": "877cf344-7324-4154-b0d9-7bcfa03b6ac0", "metadata": {}, "outputs": [ @@ -1451,7 +1469,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 24, "id": "90e9de08-cafc-4493-9358-581c148f3447", "metadata": {}, "outputs": [ @@ -1520,6 +1538,7 @@ } ], "metadata": { + "hours": 2.5, "kernelspec": { "display_name": "Python 3", "language": "python", @@ -1537,15 +1556,14 @@ "pygments_lexer": "ipython3", "version": "3" }, + "qpuSeconds": 4800, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } - }, - "hours": 2.5, - "qpuSeconds": 4800 + } }, "nbformat": 4, "nbformat_minor": 4 diff --git a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/45956df4-5472-4394-a3e1-5514c456791d-0.avif b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/45956df4-5472-4394-a3e1-5514c456791d-0.avif index 54685356a19c..b54c60dbd47d 100644 Binary files a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/45956df4-5472-4394-a3e1-5514c456791d-0.avif and b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/45956df4-5472-4394-a3e1-5514c456791d-0.avif differ diff --git a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/4f573436-ec5c-451b-976c-ad718b3c201d-1.avif b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/4f573436-ec5c-451b-976c-ad718b3c201d-1.avif index 1479ee18645c..c3c147fc4999 100644 Binary files a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/4f573436-ec5c-451b-976c-ad718b3c201d-1.avif and b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/4f573436-ec5c-451b-976c-ad718b3c201d-1.avif differ diff --git a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/659dbf23-fd3f-4e01-94b4-33e6d672172c-0.avif b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/659dbf23-fd3f-4e01-94b4-33e6d672172c-0.avif index 5179efc55acf..3bf14c109a07 100644 Binary files a/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/659dbf23-fd3f-4e01-94b4-33e6d672172c-0.avif and b/public/docs/images/tutorials/projected-quantum-kernels/extracted-outputs/659dbf23-fd3f-4e01-94b4-33e6d672172c-0.avif differ