From a966f941329565c819ef3b1787349dd601525b42 Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Fri, 4 Sep 2026 14:06:56 -0700
Subject: [PATCH 1/7] Update projected-quantum-kernels.ipynb
---
.../tutorials/projected-quantum-kernels.ipynb | 185 +++++++++++++++---
1 file changed, 161 insertions(+), 24 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index b2f9c3118225..8405b26325c3 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -62,6 +62,18 @@
"- Tqdm 4.67.1 (`pip install tqdm`)"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "pip-install-requirements",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#!pip install -U \"qiskit[visualization]\" qiskit-ibm-runtime \\\n",
+ "# category-encoders==2.8.1 numpy==2.3.2 pandas==2.3.2 \\\n",
+ "# scikit-learn tqdm==4.67.1"
+ ]
+ },
{
"cell_type": "markdown",
"id": "2c676996-1361-4b3a-9c94-4784376097b0",
@@ -72,7 +84,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"id": "fe8a02d3-994a-45fe-823d-5e68ded0d717",
"metadata": {},
"outputs": [],
@@ -81,6 +93,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",
@@ -322,29 +336,125 @@
"execution_count": null,
"id": "84495ee1-880a-48cb-a904-d83396e8b29e",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " train_data.csv ... OK (5,532 bytes)\n",
+ " test_data.csv ... OK (2,420 bytes)\n",
+ " projections_train.csv ... OK (779,903 bytes)\n",
+ " projections_test.csv ... OK (335,604 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",
+ " 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/test_data.csv \\\n",
- " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/test_data.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_train.csv \\\n",
- " https://raw.githubusercontent.com/Qiskit/documentation/main/datasets/tutorials/pqk/projections_train.csv\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",
+ "DATA_DIR = download_pqk_dataset()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "sanitize-csv-fixed",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Sanitized train_data.csv\n",
+ " Sanitized test_data.csv\n",
+ " Sanitized projections_train.csv\n",
+ " Sanitized projections_test.csv\n"
+ ]
+ }
+ ],
+ "source": [
+ "# ---------------------------------------------------------------------------\n",
+ "# Sanitize CSV files.\n",
+ "# ---------------------------------------------------------------------------\n",
+ "\n",
+ "\n",
+ "def sanitize_csv_files(data_dir):\n",
+ " \"\"\"Normalize quirky CSV files to well-formed UTF-8 comma-separated CSVs.\"\"\"\n",
+ " data_dir = Path(data_dir)\n",
+ "\n",
+ " # Motif files: strip BOM and outer line-wrap quotes if present.\n",
+ " for name in [\"train_data.csv\", \"test_data.csv\"]:\n",
+ " path = data_dir / name\n",
+ " if not path.exists():\n",
+ " continue\n",
+ " with open(path, \"rb\") as f:\n",
+ " raw = f.read()\n",
+ " text = raw.decode(\"utf-8-sig\")\n",
+ " lines = text.replace(\"\\r\\n\", \"\\n\").strip().split(\"\\n\")\n",
+ " wrapped = all(\n",
+ " len(L) >= 2 and L.startswith('\"') and L.endswith('\"')\n",
+ " for L in lines\n",
+ " )\n",
+ " if wrapped:\n",
+ " lines = [L[1:-1] for L in lines]\n",
+ " cleaned = \"\\n\".join(lines) + \"\\n\"\n",
+ " if cleaned.encode(\"utf-8\") != raw:\n",
+ " path.write_text(cleaned, encoding=\"utf-8\")\n",
+ " print(f\" Sanitized {name}\")\n",
+ "\n",
+ " # Projection files: convert whitespace-separated to comma-separated if needed.\n",
+ " for name in [\"projections_train.csv\", \"projections_test.csv\"]:\n",
+ " path = data_dir / name\n",
+ " if not path.exists():\n",
+ " continue\n",
+ " with open(path, \"rb\") as f:\n",
+ " head = f.read(2048)\n",
+ " text_head = head.decode(\"utf-8-sig\", errors=\"replace\")\n",
+ " first_line = text_head.split(\"\\n\")[0]\n",
+ " # If the first line has many whitespace-separated floats and no commas,\n",
+ " # it's the whitespace-separated format.\n",
+ " if \",\" not in first_line and len(first_line.split()) > 10:\n",
+ " from io import StringIO\n",
+ "\n",
+ " with open(path, \"rb\") as f:\n",
+ " text = f.read().decode(\"utf-8-sig\")\n",
+ " df = pd.read_csv(\n",
+ " StringIO(text), sep=r\"\\s+\", header=None, engine=\"python\"\n",
+ " )\n",
+ " df.to_csv(path, index=False, header=False)\n",
+ " print(f\" Sanitized {name}\")\n",
+ "\n",
"\n",
- "# Check the files have been downloaded\n",
- "!echo \"Dataset files downloaded:\"\n",
- "!ls -lh data_tutorial/pqk/*.csv"
+ "sanitize_csv_files(DATA_DIR)"
]
},
{
@@ -373,7 +483,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",
@@ -396,7 +508,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"id": "d40d9a0f-67d0-4704-8a94-cc0a466ffc92",
"metadata": {},
"outputs": [],
@@ -714,7 +826,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"id": "7a56eda8-3fb2-43e9-8a82-ec64be05b699",
"metadata": {},
"outputs": [],
@@ -1193,6 +1305,31 @@
"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",
+ "# FIX: the original tutorial loaded .txt files with np.loadtxt, but the\n",
+ "# downloaded files are .csv (and may be comma- or whitespace-separated\n",
+ "# depending on the repo version). sanitize_csv_files() above has already\n",
+ "# normalised them to comma-separated CSV, so we just use pd.read_csv here.\n",
+ "# ---------------------------------------------------------------------------\n",
+ "\n",
+ "\n",
+ "def _load_projections(path):\n",
+ " \"\"\"Load a projections CSV regardless of whether it has a header row.\"\"\"\n",
+ " df = pd.read_csv(path)\n",
+ " # If every column name is parseable as a float the first row is actually\n",
+ " # data, not a header — reload without a header in that case.\n",
+ " try:\n",
+ " df.columns.astype(float)\n",
+ " df = pd.read_csv(path, header=None)\n",
+ " except (ValueError, TypeError):\n",
+ " pass\n",
+ " df.columns = [f\"q{i}\" for i in range(df.shape[1])]\n",
+ " return df\n",
+ "\n",
+ "\n",
"if run_experiment:\n",
" projections_train = np.array(projections_train).reshape(\n",
" len(projections_train), -1\n",
@@ -1201,8 +1338,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 = _load_projections(DATA_DIR / \"projections_train.csv\")\n",
+ " projections_test = _load_projections(DATA_DIR / \"projections_test.csv\")"
]
},
{
@@ -1522,6 +1659,7 @@
}
],
"metadata": {
+ "hours": 2.5,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
@@ -1539,15 +1677,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
From a21eb5a6af59e1b1f993ee692321b76c9a53a90f Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Fri, 4 Sep 2026 14:09:08 -0700
Subject: [PATCH 2/7] Update projected-quantum-kernels.ipynb
---
docs/tutorials/projected-quantum-kernels.ipynb | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 8405b26325c3..81e13cc6f94d 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -62,18 +62,6 @@
"- Tqdm 4.67.1 (`pip install tqdm`)"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "pip-install-requirements",
- "metadata": {},
- "outputs": [],
- "source": [
- "#!pip install -U \"qiskit[visualization]\" qiskit-ibm-runtime \\\n",
- "# category-encoders==2.8.1 numpy==2.3.2 pandas==2.3.2 \\\n",
- "# scikit-learn tqdm==4.67.1"
- ]
- },
{
"cell_type": "markdown",
"id": "2c676996-1361-4b3a-9c94-4784376097b0",
From 41956feee2410506247634b45ce456ef8da30de4 Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Fri, 4 Sep 2026 14:11:58 -0700
Subject: [PATCH 3/7] Update projected-quantum-kernels.ipynb
---
docs/tutorials/projected-quantum-kernels.ipynb | 5 -----
1 file changed, 5 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 81e13cc6f94d..de1364cd770b 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -1296,11 +1296,6 @@
"# ---------------------------------------------------------------------------\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",
- "# FIX: the original tutorial loaded .txt files with np.loadtxt, but the\n",
- "# downloaded files are .csv (and may be comma- or whitespace-separated\n",
- "# depending on the repo version). sanitize_csv_files() above has already\n",
- "# normalised them to comma-separated CSV, so we just use pd.read_csv here.\n",
"# ---------------------------------------------------------------------------\n",
"\n",
"\n",
From 46c37ad35f92eca3e1234c2f23d03e28a71c4a8e Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Thu, 10 Sep 2026 11:43:09 -0700
Subject: [PATCH 4/7] Update projected-quantum-kernels.ipynb
---
.../tutorials/projected-quantum-kernels.ipynb | 73 -------------------
1 file changed, 73 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 753bda4ee39b..3eaac1b45429 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -370,79 +370,6 @@
"DATA_DIR = download_pqk_dataset()"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "sanitize-csv-fixed",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " Sanitized train_data.csv\n",
- " Sanitized test_data.csv\n",
- " Sanitized projections_train.csv\n",
- " Sanitized projections_test.csv\n"
- ]
- }
- ],
- "source": [
- "# ---------------------------------------------------------------------------\n",
- "# Sanitize CSV files.\n",
- "# ---------------------------------------------------------------------------\n",
- "\n",
- "\n",
- "def sanitize_csv_files(data_dir):\n",
- " \"\"\"Normalize quirky CSV files to well-formed UTF-8 comma-separated CSVs.\"\"\"\n",
- " data_dir = Path(data_dir)\n",
- "\n",
- " # Motif files: strip BOM and outer line-wrap quotes if present.\n",
- " for name in [\"train_data.csv\", \"test_data.csv\"]:\n",
- " path = data_dir / name\n",
- " if not path.exists():\n",
- " continue\n",
- " with open(path, \"rb\") as f:\n",
- " raw = f.read()\n",
- " text = raw.decode(\"utf-8-sig\")\n",
- " lines = text.replace(\"\\r\\n\", \"\\n\").strip().split(\"\\n\")\n",
- " wrapped = all(\n",
- " len(L) >= 2 and L.startswith('\"') and L.endswith('\"')\n",
- " for L in lines\n",
- " )\n",
- " if wrapped:\n",
- " lines = [L[1:-1] for L in lines]\n",
- " cleaned = \"\\n\".join(lines) + \"\\n\"\n",
- " if cleaned.encode(\"utf-8\") != raw:\n",
- " path.write_text(cleaned, encoding=\"utf-8\")\n",
- " print(f\" Sanitized {name}\")\n",
- "\n",
- " # Projection files: convert whitespace-separated to comma-separated if needed.\n",
- " for name in [\"projections_train.csv\", \"projections_test.csv\"]:\n",
- " path = data_dir / name\n",
- " if not path.exists():\n",
- " continue\n",
- " with open(path, \"rb\") as f:\n",
- " head = f.read(2048)\n",
- " text_head = head.decode(\"utf-8-sig\", errors=\"replace\")\n",
- " first_line = text_head.split(\"\\n\")[0]\n",
- " # If the first line has many whitespace-separated floats and no commas,\n",
- " # it's the whitespace-separated format.\n",
- " if \",\" not in first_line and len(first_line.split()) > 10:\n",
- " from io import StringIO\n",
- "\n",
- " with open(path, \"rb\") as f:\n",
- " text = f.read().decode(\"utf-8-sig\")\n",
- " df = pd.read_csv(\n",
- " StringIO(text), sep=r\"\\s+\", header=None, engine=\"python\"\n",
- " )\n",
- " df.to_csv(path, index=False, header=False)\n",
- " print(f\" Sanitized {name}\")\n",
- "\n",
- "\n",
- "sanitize_csv_files(DATA_DIR)"
- ]
- },
{
"cell_type": "code",
"execution_count": null,
From 74dda339ff2811e504763c110df50b6352d3a862 Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Thu, 10 Sep 2026 12:38:03 -0700
Subject: [PATCH 5/7] Update projected-quantum-kernels.ipynb
---
.../tutorials/projected-quantum-kernels.ipynb | 27 ++++---------------
1 file changed, 5 insertions(+), 22 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 3eaac1b45429..4d3448f829b5 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -155,7 +155,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "f1ce0222-e7c7-451c-a11c-e61425a6bb8e",
"metadata": {},
"outputs": [],
@@ -167,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",
@@ -1223,21 +1221,6 @@
"# pre-computed CSVs that were downloaded alongside the motif data.\n",
"# ---------------------------------------------------------------------------\n",
"\n",
- "\n",
- "def _load_projections(path):\n",
- " \"\"\"Load a projections CSV regardless of whether it has a header row.\"\"\"\n",
- " df = pd.read_csv(path)\n",
- " # If every column name is parseable as a float the first row is actually\n",
- " # data, not a header — reload without a header in that case.\n",
- " try:\n",
- " df.columns.astype(float)\n",
- " df = pd.read_csv(path, header=None)\n",
- " except (ValueError, TypeError):\n",
- " pass\n",
- " df.columns = [f\"q{i}\" for i in range(df.shape[1])]\n",
- " return df\n",
- "\n",
- "\n",
"if run_experiment:\n",
" projections_train = np.array(projections_train).reshape(\n",
" len(projections_train), -1\n",
@@ -1246,8 +1229,8 @@
" len(projections_test), -1\n",
" )\n",
"else:\n",
- " projections_train = _load_projections(DATA_DIR / \"projections_train.csv\")\n",
- " projections_test = _load_projections(DATA_DIR / \"projections_test.csv\")"
+ " projections_train = np.loadtxt(DATA_DIR / \"projections_train.csv\")\n",
+ " projections_test = np.loadtxt(DATA_DIR / \"projections_test.csv\")"
]
},
{
@@ -1569,7 +1552,7 @@
"metadata": {
"hours": 2.5,
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "qiskit",
"language": "python",
"name": "python3"
},
@@ -1583,7 +1566,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3"
+ "version": "3.11.11"
},
"qpuSeconds": 4800,
"widgets": {
From e6a86105c9f0c957c7b852d159d5053d84f60c85 Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Thu, 10 Sep 2026 12:51:53 -0700
Subject: [PATCH 6/7] Update projected-quantum-kernels.ipynb
---
docs/tutorials/projected-quantum-kernels.ipynb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 4d3448f829b5..56e7359e269d 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -1552,7 +1552,7 @@
"metadata": {
"hours": 2.5,
"kernelspec": {
- "display_name": "qiskit",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -1566,7 +1566,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.11"
+ "version": "3"
},
"qpuSeconds": 4800,
"widgets": {
From 6f42aba41b65c99a7055954c2061958455c0d002 Mon Sep 17 00:00:00 2001
From: Soyoung Shin <63990199+0sophy1@users.noreply.github.com>
Date: Thu, 10 Sep 2026 17:10:45 -0700
Subject: [PATCH 7/7] updated parameter
---
.../tutorials/projected-quantum-kernels.ipynb | 232 +++++++++---------
...5956df4-5472-4394-a3e1-5514c456791d-0.avif | Bin 802434 -> 2261273 bytes
...f573436-ec5c-451b-976c-ad718b3c201d-1.avif | Bin 521664 -> 3310256 bytes
...59dbf23-fd3f-4e01-94b4-33e6d672172c-0.avif | Bin 121780 -> 1238598 bytes
4 files changed, 110 insertions(+), 122 deletions(-)
diff --git a/docs/tutorials/projected-quantum-kernels.ipynb b/docs/tutorials/projected-quantum-kernels.ipynb
index 56e7359e269d..07b3445c3498 100644
--- a/docs/tutorials/projected-quantum-kernels.ipynb
+++ b/docs/tutorials/projected-quantum-kernels.ipynb
@@ -155,7 +155,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "f1ce0222-e7c7-451c-a11c-e61425a6bb8e",
"metadata": {},
"outputs": [],
@@ -317,7 +317,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "84495ee1-880a-48cb-a904-d83396e8b29e",
"metadata": {},
"outputs": [
@@ -325,10 +325,10 @@
"name": "stdout",
"output_type": "stream",
"text": [
- " train_data.csv ... OK (5,532 bytes)\n",
- " test_data.csv ... OK (2,420 bytes)\n",
- " projections_train.csv ... OK (779,903 bytes)\n",
- " projections_test.csv ... OK (335,604 bytes)\n",
+ " 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"
]
@@ -370,7 +370,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"id": "35013bc5-6b5e-44c8-8a8c-3af313b00a82",
"metadata": {},
"outputs": [
@@ -419,7 +419,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"id": "d40d9a0f-67d0-4704-8a94-cc0a466ffc92",
"metadata": {},
"outputs": [],
@@ -446,7 +446,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
"id": "b98495f3-aeaa-4df1-a9fe-433e26aa7d4e",
"metadata": {},
"outputs": [
@@ -484,7 +484,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 7,
"id": "45956df4-5472-4394-a3e1-5514c456791d",
"metadata": {},
"outputs": [
@@ -494,7 +494,7 @@
""
]
},
- "execution_count": 6,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -526,7 +526,7 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"id": "659dbf23-fd3f-4e01-94b4-33e6d672172c",
"metadata": {},
"outputs": [
@@ -536,7 +536,7 @@
""
]
},
- "execution_count": 7,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@@ -625,7 +625,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"id": "e1ab9cea-42ef-478c-bb9d-02ed4cf23ea6",
"metadata": {},
"outputs": [],
@@ -647,7 +647,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"id": "53b20cec-ef8a-4fdb-aeed-46546a32ea96",
"metadata": {},
"outputs": [],
@@ -737,7 +737,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"id": "7a56eda8-3fb2-43e9-8a82-ec64be05b699",
"metadata": {},
"outputs": [],
@@ -757,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"
]
}
],
@@ -830,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"
]
},
{
@@ -876,7 +861,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"id": "81835ec2-210f-4176-ba79-c8046cc57d92",
"metadata": {},
"outputs": [],
@@ -887,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",
@@ -999,7 +976,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"id": "ccbd7603-1dd3-4aab-8ee8-8b0a98068b61",
"metadata": {},
"outputs": [],
@@ -1030,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",
@@ -1139,7 +1108,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 18,
"id": "721ed991-fee2-4f66-9bb6-a750ee935033",
"metadata": {},
"outputs": [],
@@ -1211,7 +1180,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 19,
"id": "a61e6c67-056b-4659-87a0-284bda432cfd",
"metadata": {},
"outputs": [],
@@ -1251,7 +1220,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"id": "d2eef986-22a5-4528-8fa0-c7dbfd586071",
"metadata": {},
"outputs": [
@@ -1259,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",
@@ -1330,7 +1318,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 21,
"id": "41867b5a-9091-4aa4-adab-a05cf6238966",
"metadata": {},
"outputs": [
@@ -1338,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"
]
@@ -1386,7 +1374,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 22,
"id": "bc67f5c0-5d79-4633-807e-02b8cc9d39f5",
"metadata": {},
"outputs": [
@@ -1441,7 +1429,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 23,
"id": "877cf344-7324-4154-b0d9-7bcfa03b6ac0",
"metadata": {},
"outputs": [
@@ -1481,7 +1469,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 24,
"id": "90e9de08-cafc-4493-9358-581c148f3447",
"metadata": {},
"outputs": [
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 54685356a19cde2afa535421b7947de569640965..b54c60dbd47d88636d3a6f38f3f3af22efbfe6dd 100644
GIT binary patch
literal 2261273
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