{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Understanding QCMet\n", "\n", "This tutorial explains the core concepts and architecture of QCMet benchmarks." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running Benchmarks\n", "\n", "The easiest way to run a benchmark is using the `__call__` function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from qcmet import T1\n", "from qcmet.devices import IdealSimulator\n", "\n", "# Create benchmark\n", "experiment = T1()\n", "\n", "# Create device\n", "ideal_sim = IdealSimulator()\n", "\n", "# Get results\n", "results = experiment(device=ideal_sim, num_shots=1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `__call__` function sequentially executes `generate_circuits()`, `run()` and `analyze()` (and `plot()` if it is implemented). These functions will be described in further detail below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The BaseBenchmark Class\n", "\n", "All benchmarks in QCMet inherit from `BaseBenchmark`, which provides a consistent interface:\n", "\n", "- `generate_circuits()` - Generate the benchmark circuits\n", "- `run(device, num_shots, max_circs_per_job)` - Execute circuits on a device with option to select maximum number of circuits to be submitted per job \n", "- `analyze()` - Process results and compute metrics\n", "- `plot()` - Visualize results (if implemented)\n", "\n", "## The BaseDevice Class\n", "\n", "Devices inherit from `BaseDevice` and implement:\n", "\n", "- `run(circuits, num_shots, max_circs_per_job)` - Execute a list of circuits and return measurement counts\n", "\n", "This abstraction allows benchmarks to run on any device without modification.\n", "\n", "Under the hood, QCMet heavily uses Qiskit's features (in particular, circuits are represented as Qiskit's QuantumCircuit)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Metric Categories\n", "\n", "QCMet organizes benchmarks into categories based on what they measure:\n", "\n", "### Qubit Quality Metrics\n", "- **T1**: Relaxation time (energy decay)\n", "- **T2**: Relaxation time (dephasing)\n", "- **Idle Qubit Oscillation Frequency**: Non-Markovian noise induced coherence revivals\n", "\n", "### Gate Execution Quality Metrics\n", "- **Clifford RB**: Average gate error rate\n", "- **Interleaved RB**: Specific gate error rate\n", "- **Over/Under Rotation**: Systematic rotation errors\n", "- **Cycle Benchmarking**: Average fidelity of a repeated layer\n", "- **Gate Set Tomography**: Full characterization of process fidelity\n", "\n", "### Circuit Execution Quality Metrics\n", "- **Quantum Volume**: Holistic circuit complexity measure\n", "- **Mirrored Circuits**: Target circuit performance benchmark\n", "- **Upper Bound on Variation Distance**: Quantum accreditation protocol\n", "\n", "### Well-studied Task Execution Quality Metrics\n", "- **QFT**: Quantum Fourier Transform fidelity\n", "- **VQE**: Energy expectation value reproducibility\n", "- **QScore**: Metric based on using QAOA for a MaxCut problem \n", "- **Hamiltonian Simulation**: Ability to perform Hamiltonian dynamics\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Exploring the T1 Benchmark" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Experiment data columns: ['hash', 'id', 'circuit']\n", "\n", "First few rows:\n", " hash id \\\n", "0 010b614c4773c3cc057914f2452e1abd cef8fd5b-a171-45e8-a7d0-f5d327197331 \n", "1 60f69467bcf27869429777838f863958 05c0eb10-8161-4942-93e6-4c8ea5957cd5 \n", "2 5234934c916137d9c1140bbc0850be78 e2fb6581-90a7-421e-a934-bb4f134b9395 \n", "3 e0580ef9e815af069c70ed84a14429d1 d6b6a2e0-17c9-4037-80b5-f59826ca0201 \n", "4 255ef6a71771ba7f1d2e3c87e6efaa00 2166ce39-64b0-4aea-b773-20d5bf3cb1a2 \n", "\n", " circuit \n", "0 ((Instruction(name='x', num_qubits=1, num_clbi... \n", "1 ((Instruction(name='x', num_qubits=1, num_clbi... \n", "2 ((Instruction(name='x', num_qubits=1, num_clbi... \n", "3 ((Instruction(name='x', num_qubits=1, num_clbi... \n", "4 ((Instruction(name='x', num_qubits=1, num_clbi... \n" ] } ], "source": [ "from qcmet import T1\n", "from qcmet.devices import NoisySimulator\n", "import numpy as np\n", "\n", "# Create benchmark\n", "t1 = T1(num_idle_gates_per_circ=np.arange(1, 1000, 100))\n", "\n", "# Generate circuits\n", "t1.generate_circuits()\n", "\n", "# Inspect the experiment data structure\n", "print(\"Experiment data columns:\", t1.experiment_data.columns.tolist())\n", "print(\"\\nFirst few rows:\")\n", "print(t1.experiment_data.head())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First circuit:\n", " ┌───┐ ░ ┌───┐ ░ ░ ┌─┐\n", " q: ┤ X ├─░─┤ I ├─░──░─┤M├\n", " └───┘ ░ └───┘ ░ ░ └╥┘\n", "meas: 1/════════════════════╩═\n", " 0 \n" ] } ], "source": [ "# Look at a circuit\n", "print(\"First circuit:\")\n", "print(t1.circuits[0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "After running, columns: ['hash', 'id', 'circuit', 'circuit_measurements']\n", "\n", "Sample measurements:\n", "0 {'0': 1, '1': 1023}\n", "1 {'0': 22, '1': 1002}\n", "2 {'0': 44, '1': 980}\n", "3 {'0': 63, '1': 961}\n", "4 {'0': 73, '1': 951}\n", "Name: circuit_measurements, dtype: object\n" ] } ], "source": [ "# Run on device\n", "# Option to set maximum number of circuits per job when device has a limit on the circuits submitted per job\n", "device = NoisySimulator()\n", "t1.run(device, num_shots=1024, max_circs_per_job=3)\n", "\n", "# Check the measurements have been added\n", "print(\"After running, columns:\", t1.experiment_data.columns.tolist())\n", "print(\"\\nSample measurements:\")\n", "print(t1.experiment_data['circuit_measurements'].head())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Experiment Data DataFrame\n", "\n", "Each benchmark stores its data in a pandas DataFrame with:\n", "\n", "- `hash`: Circuit hash for identification\n", "- `id`: Unique circuit ID\n", "- `circuit`: The QuantumCircuit object\n", "- `circuit_measurements`: Measurement counts (added after running)\n", "- Additional benchmark-specific metadata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Configuration Dictionary\n", "\n", "Each benchmark has a `config` dictionary storing its parameters:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T1 configuration:\n", "{'num_idle_gates_per_circ': array([ 1, 101, 201, 301, 401, 501, 601, 701, 801, 901])}\n" ] } ], "source": [ "print(\"T1 configuration:\")\n", "print(t1.config)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Saving and Loading\n", "\n", "Benchmarks can save their state for later analysis:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating dir structure at t1_results/T1_20251222_170315\n", "Results saved to: t1_results\n" ] }, { "data": { "image/png": "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XIpu3XogOjoa58//jj17DgF4f0lyx44tOHnyvMb227Rpim7demrsz65d2/DPP4+RlpYGZ2cXDBgQjAYNGgJ4f5Zt5sypAICAgJYAgDJlymLPnkPq7w4fPgVLS0sA71+mvHTpL7h4MRTJySlwc3PHkCHD4OFRR13DsGGDYWJiAn//AKxa9Suio6NQpUo1jBs3EQ4OjrnulS5hWCogdet6onTpMnj1KhIHD/4P3br1ELokIiItOc0JJ5FINC7L5LSsWCzWCBQfW9bc3PQTK/1XRkaGVp3/faH5mDHjMW3aJBgaGiEkZCQAwM7ODs2b+2U7DgBnz57Cjz9+j7Zt22PAgGDExERjxYqlSEyUYerUWQCA1NRUjB49DEZGRpg48ScAwNq1K5CUlARHx3I51n337h18800wGjRohKlTZyElJRmrVy/H+PFjsHLlevVy48ePQVTUG3z77QSYmZlhy5aNePv2DSQSySf36tWrCDRq5IuePb+CWCzClSuX8N13I7Bo0XLUqeMJb28fBAUNwMaNazF//hKYmprBwEA/220pFAqMGTMcr15F4Ouvv4GVVSns2bMDo0aFYPnydahcuYp62cePHyEubjOGDPkGSqUCS5YsxE8/TdLYz6KEYamA6OvrIyioP2bPno41a1aga9dArd/MRERCK1++7Ae/a9myFbZt26P+XK1aBbx79y7bZRs29MH+/UfVnz09qyMmJibbZT08auPMmfPZfvcxycnJaNq0gcbYpEk/oXXrthpj5cu7wsTEFCYmJlqX57IbV6lUWLZsEZo398P48ZPU46VK2eC770YgKGggXF0r4NixQ4iOjsLWrXtQrpwTAMDNzR1fftnlo2FpxYqlqFy5CmbOnKv++8DVtSL69AnE5csX0LixL65cuYS//76PRYuWo27degCA2rU90blzO0il0k/sFtClS6D6fyuVStSu7YmnT8Nw8OD/UKeOJ6ysrNRne9zdq6jPIGXn8uULePDgHubPXwIvL28AgJeXNwIDO2Hz5nWYMWOuelm5PBHr1m1VX8ZLTk7GzJlT8fbtG9jZlf7k/RAaw1IB+uqrfli4cC5u3ryBa9euwsurwcdXIiKiDzI0NMSyZas1xuztHT57uy9fPsfr168wfPgYjTNXtWvXgVgsxsOHD+DqWgH3799D+fIV1EEJABwdy6FixUo5bj8lJQV//XUb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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pathlib import Path\n", "\n", "# Create benchmark with save path\n", "t1_saved = T1(\n", " num_idle_gates_per_circ=np.arange(1, 20000, 2000),\n", " save_path=Path(\"./t1_results\")\n", ")\n", "\n", "# Generate and run\n", "t1_saved.generate_circuits()\n", "t1_saved.run(device, num_shots=1024)\n", "\n", "# Analyze and save\n", "results = t1_saved.analyze()\n", "print(f\"Results saved to: {t1_saved.file_manager.base_path}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Offline Mode\n", "\n", "You can generate circuits without a device for later execution:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating dir structure at t1_offline/T1_20251222_170315\n", "Circuits saved for offline execution\n" ] } ], "source": [ "# Create benchmark with save enabled\n", "t1_offline = T1(\n", " num_idle_gates_per_circ=np.arange(1, 500, 100),\n", " save_path=Path(\"./t1_offline\")\n", ")\n", "\n", "# Generate circuits\n", "t1_offline.generate_circuits()\n", "\n", "# Run without device (saves circuits for later)\n", "t1_offline.run() # No device specified\n", "\n", "print(\"Circuits saved for offline execution\")" ] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "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.10" } }, "nbformat": 4, "nbformat_minor": 4 }