diff --git a/2026/Bruno_minions/ETH_Hackathon_QuEra.pptx b/2026/Bruno_minions/ETH_Hackathon_QuEra.pptx new file mode 100644 index 0000000..19ba68a Binary files /dev/null and b/2026/Bruno_minions/ETH_Hackathon_QuEra.pptx differ diff --git a/2026/Bruno_minions/STAR_part.ipynb b/2026/Bruno_minions/STAR_part.ipynb new file mode 100644 index 0000000..d6bdc14 --- /dev/null +++ b/2026/Bruno_minions/STAR_part.ipynb @@ -0,0 +1,7820 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "55528cdd", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Any\n", + "import os\n", + "import re\n", + "\n", + "from kirin.ir import Method\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from bloqade import squin, tsim\n", + "from bloqade.cirq_utils import emit_circuit, load_circuit, noise\n", + "from bloqade.pyqrack import StackMemorySimulator\n", + "from bloqade.types import MeasurementResult, Qubit\n", + "from kirin.dialects.ilist import IList\n", + "\n", + "# this will help us have return types for our methods that have more intuitive names\n", + "Register = IList[Qubit, Any]\n", + "Measurement = IList[MeasurementResult, Any]\n", + "\n", + "# this function will help us visualize some circuits\n", + "def show_circuit(squin_kernel):\n", + " @squin.kernel\n", + " def _to_visualize():\n", + " _ = squin_kernel()\n", + "\n", + " return tsim.Circuit(_to_visualize).diagram(height=400)" + ] + }, + { + "cell_type": "markdown", + "id": "98b73c39", + "metadata": {}, + "source": [ + "## **STAR team part**\n", + "\n", + "**PART 1:** A surface code is a type of quantum error-correcting stabilizer code. A \"distance-3\" ($d=3$) surface code is designed to reliably detect and correct any single physical error that occurs anywhere on the grid without the logical qubit failing. \n", + "\n", + "To build this logical processor, we use **17 physical qubits** arranged in a planar square lattice:\n", + "* **9 Data Qubits:** These hold the actual logical quantum state and are never measured directly during the computation cycle. \n", + "* **8 Ancilla (Measure) Qubits:** These act as \"watchdogs.\" They are interlaced with the data qubits and are continuously measured to extract error syndromes without destroying the underlying data.\n", + "\n", + "Geometry & Qubit Mapping\n", + "\n", + "To build the circuit in Tsim, we map the qubits across a 2D grid. The data qubits form a $3 \\times 3$ lattice, while the ancillas sit between them to measure \"plaquettes\" (groups of 2 or 4 adjacent data qubits). \n", + "\n", + "**Our 17-Qubit Map:**\n", + "* **Data (0-8):** Vertices of the grid.\n", + "* **Z-Ancillas (9-12):** Measure $Z$-parity.\n", + "* **X-Ancillas (13-16):** Measure $X$-parity.\n", + "\n", + "\n", + "**Stabilizer Checks (The X and Z Crosses)**\n", + "\n", + "We detect errors by measuring multi-qubit Pauli operators called \"stabilizers\". \n", + "\n", + "- Z-Stabilizers (Green Checks): These entangle a Z-ancilla with its neighboring data qubits. Measuring the Z-ancilla allows us to detect X (bit-flip) errors on those data qubits. \n", + "\n", + "- X-Stabilizers (Yellow Checks): These entangle an X-ancilla with its neighbors. Using a Hadamard gate to change the basis, measuring the X-ancilla allows us to detect Z (phase-flip) errors. \n", + "\n", + "**Syndrome Extraction Over Time**\n", + " \n", + "\n", + "A single round of measurements is not reliable because the measurement hardware itself might introduce errors. To achieve fault tolerance, we perform repeated syndrome extraction cycles. \n", + "\n", + "1. Initialize the ancillas.\n", + "\n", + "2. Entangle them with data qubits (using a strict CNOT schedule to avoid gate collisions).\n", + "\n", + "3. Measure the ancillas.\n", + "\n", + "4. Repeat.\n", + "\n", + "By running this circuit for several rounds, we track the errors over time, transforming the problem from a 2D spatial grid into a 3D volume (2D space + 1D time). Tracking these measurements over multiple rounds is essential to distinguish between genuine data qubit errors and faulty measurement events. In Tsim, \"Detectors\" compare the measurement of an ancilla in the current round to its measurement in the previous round—if the parity suddenly flips, the detector fires, indicating an error occurred in that specific time window." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fc1c02bb", + "metadata": {}, + "outputs": [], + "source": [ + "from bloqade import squin, tsim\n", + "from bloqade.types import Qubit\n", + "from kirin.dialects.ilist import IList\n", + "from typing import Any\n", + "\n", + "Register = IList[Qubit, Any]\n", + "\n", + "@squin.kernel\n", + "def d3_surface_code() -> Register:\n", + " # Allocate all 17 physical qubits symmetrically:\n", + " data = squin.qalloc(9) # Indices 0-8\n", + " z_anc = squin.qalloc(4) # Indices 0-3\n", + " x_anc = squin.qalloc(4) # Indices 0-3\n", + " \n", + " # Execute 2 rounds of syndrome extraction\n", + " for r in range(2):\n", + " squin.broadcast.h(x_anc)\n", + " \n", + " # 4-layer CNOT Schedule\n", + " # Z-checks: Data is control, Ancilla is target\n", + " # X-checks: Ancilla is control, Data is target\n", + " \n", + " # Layer 1: North Interactions\n", + " squin.cx(data[0], z_anc[0]) \n", + " squin.cx(data[4], z_anc[3]) \n", + " squin.cx(data[2], z_anc[1])\n", + " squin.cx(x_anc[1], data[1])\n", + " squin.cx(x_anc[2], data[3])\n", + " squin.cx(x_anc[3], data[7])\n", + " \n", + " # Layer 2: East Interactions\n", + " squin.cx(data[1], z_anc[0])\n", + " squin.cx(data[3], z_anc[2])\n", + " squin.cx(data[5], z_anc[3])\n", + " squin.cx(x_anc[1], data[2])\n", + " squin.cx(x_anc[2], data[4])\n", + " squin.cx(x_anc[3], data[8])\n", + " \n", + " # Layer 3: West Interactions\n", + " squin.cx(data[3], z_anc[0])\n", + " squin.cx(data[7], z_anc[3])\n", + " squin.cx(data[5], z_anc[1])\n", + " squin.cx(x_anc[2], data[6])\n", + " squin.cx(x_anc[1], data[4])\n", + " squin.cx(x_anc[0], data[0])\n", + " \n", + " # Layer 4: South Interactions\n", + " squin.cx(data[4], z_anc[0])\n", + " squin.cx(data[6], z_anc[2])\n", + " squin.cx(data[8], z_anc[3])\n", + " squin.cx(x_anc[0], data[1])\n", + " squin.cx(x_anc[2], data[7])\n", + " squin.cx(x_anc[1], data[5])\n", + " \n", + " squin.broadcast.h(x_anc)\n", + " \n", + " # Mid-circuit measurement of the watchdogs\n", + " squin.broadcast.measure(z_anc)\n", + " squin.broadcast.measure(x_anc)\n", + "\n", + " # Reset ancillas\n", + " squin.broadcast.reset(z_anc)\n", + " squin.broadcast.reset(x_anc)\n", + "\n", + " # Check if there are errors:\n", + " if r == 0: squin.x(data[4])\n", + " \n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1fcb1755", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "q1\n", + "\n", + "q2\n", + "\n", + "q3\n", + "\n", + "q4\n", + "\n", + "q5\n", + "\n", + "q6\n", + "\n", + "q7\n", + "\n", + "q8\n", + "\n", + "q9\n", + "\n", + "q10\n", + "\n", + "q11\n", + "\n", + "q12\n", + "\n", + "q13\n", + "\n", + "q14\n", + "\n", + "q15\n", + "\n", + "q16\n", + "\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "M\n", + "0\n", + "rec[0]\n", + "\n", + "M\n", + "0\n", + "rec[1]\n", + "\n", + "M\n", + "0\n", + "rec[2]\n", + "\n", + "M\n", + "0\n", + "rec[3]\n", + "\n", + "M\n", + "0\n", + "rec[4]\n", + "\n", + "M\n", + "0\n", + "rec[5]\n", + "\n", + "M\n", + "0\n", + "rec[6]\n", + "\n", + "M\n", + "0\n", + "rec[7]\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "M\n", + "0\n", + "rec[8]\n", + "\n", + "M\n", + "0\n", + "rec[9]\n", + "\n", + "M\n", + "0\n", + "rec[10]\n", + "\n", + "M\n", + "0\n", + "rec[11]\n", + "\n", + "M\n", + "0\n", + "rec[12]\n", + "\n", + "M\n", + "0\n", + "rec[13]\n", + "\n", + "M\n", + "0\n", + "rec[14]\n", + "\n", + "M\n", + "0\n", + "rec[15]\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_circuit(d3_surface_code)" + ] + }, + { + "cell_type": "markdown", + "id": "3d93bc48", + "metadata": {}, + "source": [ + "An error is defined as a change in parity over time." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "34bdc318", + "metadata": {}, + "outputs": [], + "source": [ + "def analyze_syndrome_extraction(results):\n", + " \"\"\" \n", + " Args:\n", + " results: A 2D numpy array of shape (shots, 16) from the Tsim sampler.\n", + " \n", + " Returns:\n", + " A list of dictionaries containing the parsed Z and X error vectors for each shot.\n", + " \"\"\"\n", + " parsed_data = []\n", + " \n", + " for shot_idx, raw_shot in enumerate(results):\n", + " print(f\"\\n=========================================\")\n", + " print(f\" SHOT {shot_idx + 1} ANALYSIS\")\n", + " print(f\"=========================================\")\n", + " \n", + " # Reshape the 16 bits into a 2D matrix: (2 Rounds, 8 Ancillas)\n", + " measurements_by_round = raw_shot.reshape((2, 8))\n", + " \n", + " z_meas = measurements_by_round[:, 0:4]\n", + " x_meas = measurements_by_round[:, 4:8]\n", + " \n", + " # Did the parity change between rounds?\n", + " # We use XOR (^) to find differences. True ^ False = True (Error!)\n", + " z_errors = z_meas[1] ^ z_meas[0]\n", + " x_errors = x_meas[1] ^ x_meas[0]\n", + " \n", + " print(\"RAW MEASUREMENTS (Round 1 -> Round 2):\")\n", + " print(f\"Z-Ancillas: {z_meas[0]} -> {z_meas[1]}\")\n", + " print(f\"X-Ancillas: {x_meas[0]} -> {x_meas[1]}\\n\")\n", + " \n", + " print(\"DETECTOR VECTORS (True = Error Occurred):\")\n", + " print(f\"Z-Patch Error Vector [Z0, Z1, Z2, Z3]: {z_errors}\")\n", + " print(f\"X-Patch Error Vector [X0, X1, X2, X3]: {x_errors}\")\n", + " \n", + " parsed_data.append({\n", + " \"shot\": shot_idx + 1,\n", + " \"z_errors\": z_errors,\n", + " \"x_errors\": x_errors\n", + " })\n", + " \n", + " return parsed_data" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "9f02db57", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=========================================\n", + " SHOT 1 ANALYSIS\n", + "=========================================\n", + "RAW MEASUREMENTS (Round 1 -> Round 2):\n", + "Z-Ancillas: [False False False False] -> [ True False False True]\n", + "X-Ancillas: [False True False True] -> [False True False True]\n", + "\n", + "DETECTOR VECTORS (True = Error Occurred):\n", + "Z-Patch Error Vector [Z0, Z1, Z2, Z3]: [ True False False True]\n", + "X-Patch Error Vector [X0, X1, X2, X3]: [False False False False]\n", + "\n", + "=========================================\n", + " SHOT 2 ANALYSIS\n", + "=========================================\n", + "RAW MEASUREMENTS (Round 1 -> Round 2):\n", + "Z-Ancillas: [False False False False] -> [ True False False True]\n", + "X-Ancillas: [False False True False] -> [False False True False]\n", + "\n", + "DETECTOR VECTORS (True = Error Occurred):\n", + "Z-Patch Error Vector [Z0, Z1, Z2, Z3]: [ True False False True]\n", + "X-Patch Error Vector [X0, X1, X2, X3]: [False False False False]\n", + "\n", + "=========================================\n", + " SHOT 3 ANALYSIS\n", + "=========================================\n", + "RAW MEASUREMENTS (Round 1 -> Round 2):\n", + "Z-Ancillas: [False False False False] -> [ True False False True]\n", + "X-Ancillas: [False False True True] -> [False False True True]\n", + "\n", + "DETECTOR VECTORS (True = Error Occurred):\n", + "Z-Patch Error Vector [Z0, Z1, Z2, Z3]: [ True False False True]\n", + "X-Patch Error Vector [X0, X1, X2, X3]: [False False False False]\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'shot': 1,\n", + " 'z_errors': array([ True, False, False, True]),\n", + " 'x_errors': array([False, False, False, False])},\n", + " {'shot': 2,\n", + " 'z_errors': array([ True, False, False, True]),\n", + " 'x_errors': array([False, False, False, False])},\n", + " {'shot': 3,\n", + " 'z_errors': array([ True, False, False, True]),\n", + " 'x_errors': array([False, False, False, False])}]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@squin.kernel\n", + "def main_execution():\n", + " _ = d3_surface_code()\n", + "\n", + "circuit_tsim = tsim.Circuit(main_execution)\n", + "\n", + "sampler = circuit_tsim.compile_sampler()\n", + "\n", + "# Run 3 simulated hardware shots\n", + "results = sampler.sample(shots=3)\n", + "analyze_syndrome_extraction(results)" + ] + }, + { + "cell_type": "markdown", + "id": "a9d62e9e", + "metadata": {}, + "source": [ + "if we introduce a bit flip error ($X$-gate) in data[4], the error is caught by the Z-stabilizers. \n", + "\n", + "data[4] is monitored by Z0 and Z3 (indices 0 and 3), as we have detected it. \n", + "\n", + "---\n", + "\n", + "**PART 2:** Estimate STAR Fidelities\n", + "\n", + "In a standard digital circuit, if you want to rotate a qubit by $0.01\\pi$, you just apply an $R_Z(0.01\\pi)$ gate.\n", + "\n", + "Fault-tolerant architecture does not work like that. The STAR protocol applies a rotation transversally across $k$ physical qubits to achieve one logical rotation.\n", + "\n", + "Because of the error-correcting math, this relationship is non-linear. The physical_angle function they provided calculates exactly how hard you need to twist the physical qubits to get the logical qubit to land on your target angle." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "99421daf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=========================================\n", + " RUNNING TSIM SIMULATION: Distance 3\n", + "Angle: 1.0000e-04 rad | Acc: 81.39% | Norm Error: 2.1418e-03\n", + "Angle: 3.9760e-04 rad | Acc: 80.87% | Norm Error: 2.1328e-03\n", + "Angle: 1.5809e-03 rad | Acc: 79.70% | Norm Error: 2.1398e-03\n", + "Angle: 6.2855e-03 rad | Acc: 76.64% | Norm Error: 1.9667e-03\n", + "Angle: 2.4991e-02 rad | Acc: 69.87% | Norm Error: 2.2765e-03\n", + "Angle: 9.9364e-02 rad | Acc: 56.09% | Norm Error: 3.7487e-03\n", + "Angle: 3.9507e-01 rad | Acc: 35.15% | Norm Error: 2.6403e-02\n", + "Angle: 1.5708e+00 rad | Acc: 20.51% | Norm Error: 1.6608e-01\n", + "\n", + "=========================================\n", + " RUNNING TSIM SIMULATION: Distance 5\n", + "Angle: 1.0000e-04 rad | Acc: 52.08% | Norm Error: 2.7650e-05\n", + "Angle: 3.9760e-04 rad | Acc: 48.58% | Norm Error: 3.1286e-05\n", + "Angle: 1.5809e-03 rad | Acc: 43.37% | Norm Error: 2.6745e-05\n", + "Angle: 6.2855e-03 rad | Acc: 35.65% | Norm Error: 3.1420e-05\n", + "Angle: 2.4991e-02 rad | Acc: 25.89% | Norm Error: 7.8796e-05\n", + "Angle: 9.9364e-02 rad | Acc: 15.45% | Norm Error: 9.8923e-04\n", + "Angle: 3.9507e-01 rad | Acc: 7.17% | Norm Error: 1.5163e-02\n", + "Angle: 1.5708e+00 rad | Acc: 3.62% | Norm Error: 9.8829e-02\n", + "\n", + "=========================================\n", + " RUNNING TSIM SIMULATION: Distance 7\n", + "Angle: 1.0000e-04 rad | Acc: 22.62% | Norm Error: 1.2631e-06\n", + "Angle: 3.9760e-04 rad | Acc: 18.82% | Norm Error: 1.5184e-06\n", + "Angle: 1.5809e-03 rad | Acc: 14.41% | Norm Error: 0.0000e+00\n", + "Angle: 6.2855e-03 rad | Acc: 9.80% | Norm Error: 1.4580e-05\n", + "Angle: 2.4991e-02 rad | Acc: 5.83% | Norm Error: 3.4297e-05\n", + "Angle: 9.9364e-02 rad | Acc: 2.82% | Norm Error: 6.5879e-04\n", + "Angle: 3.9507e-01 rad | Acc: 1.16% | Norm Error: 1.0631e-02\n", + "Angle: 1.5708e+00 rad | Acc: 0.53% | Norm Error: 6.9976e-02\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-10T10:21:18.099005\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import stim\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from bloqade import tsim\n", + "import pymatching\n", + "\n", + "def physical_angle(logical_angle_in_pi: float, num_physical_rotations: int) -> float:\n", + " \"\"\"\n", + " Compute the physical rotation angle needed to achieve a logical rotation of\n", + " angle `logical_angle_in_pi` on `num_physical_rotations` physical rotations.\n", + "\n", + " Args:\n", + " logical_angle_in_pi (float): The logical rotation angle in units of pi.\n", + " num_physical_rotations (int): The number of physical rotations that are applied.\n", + " Returns:\n", + " float: The physical rotation angle in units of pi.\n", + " \"\"\"\n", + "\n", + " assert (\n", + " num_physical_rotations % 2 == 1 and num_physical_rotations > 0\n", + " ), \"k must be a positive odd integer\"\n", + " sign = -1 if (num_physical_rotations + 1) % 4 == 0 else 1\n", + " logical_angle_in_rad = logical_angle_in_pi * np.pi\n", + " x = np.tan(logical_angle_in_rad / 2) ** (1 / num_physical_rotations)\n", + " theta_phys = 2 * np.arctan(x)\n", + " return float(sign * theta_phys / np.pi)\n", + "\n", + "def run_tsim_star_benchmark():\n", + " distances = [3, 5, 7]\n", + " qubit_counts = {3: 17, 5: 49, 7: 97}\n", + " \n", + " angles_rad = np.logspace(-4, np.log10(np.pi/2), num=8)\n", + " \n", + " n_shots = 500_000 \n", + " results = {d: [] for d in distances}\n", + "\n", + " for d in distances:\n", + " print(f\"\\n=========================================\")\n", + " print(f\" RUNNING TSIM SIMULATION: Distance {d}\")\n", + " \n", + " file_path = f\"assets/star_circuits/star_d={d}.stim\"\n", + " with open(file_path, \"r\") as f:\n", + " base_stim_lines = f.read().split('\\n')\n", + "\n", + " for angle_rad in angles_rad:\n", + " logical_angle_in_pi = angle_rad / np.pi\n", + " phys_angle_in_pi = physical_angle(logical_angle_in_pi, d)\n", + "\n", + " # PAULI APPROXIMATION HAC K:\n", + " # Map the coherent rotation angles to probabilistic Pauli Z errors\n", + " p_phys = np.sin((phys_angle_in_pi * np.pi) / 2) ** 2\n", + " p_log = np.sin((logical_angle_in_pi * np.pi) / 2) ** 2\n", + "\n", + " modified_lines = []\n", + " for line in base_stim_lines:\n", + " clean_line = line.strip()\n", + " \n", + " match = re.match(r'^R_Z\\([^)]+\\)\\s+(.*)$', clean_line)\n", + " \n", + " if match:\n", + " targets_str = match.group(1)\n", + " targets_list = targets_str.split()\n", + " \n", + " if len(targets_list) > 1:\n", + " # Replace Transversal Rotation with independent Z Errors\n", + " modified_lines.append(f\"Z_ERROR({p_phys}) {targets_str}\")\n", + " elif len(targets_list) == 1:\n", + " # Replace Logical Unrotation with independent Z Error\n", + " modified_lines.append(f\"Z_ERROR({p_log}) {targets_str}\")\n", + " else:\n", + " modified_lines.append(clean_line)\n", + "\n", + " modified_stim_text = '\\n'.join(modified_lines)\n", + "\n", + " temp_filename = f\"temp_star_d{d}.stim\"\n", + " with open(temp_filename, \"w\") as f:\n", + " f.write(modified_stim_text)\n", + "\n", + " c = Circuit.from_file(temp_filename)\n", + " \n", + " if os.path.exists(temp_filename):\n", + " os.remove(temp_filename)\n", + "\n", + " # extract Detector Error Model and initialize MWPM\n", + " dem = c.detector_error_model()\n", + " matcher = pymatching.Matching.from_detector_error_model(dem)\n", + "\n", + " # sample detectors and observables\n", + " sampler = c.compile_detector_sampler()\n", + " detectors, observables = sampler.sample(shots=n_shots, separate_observables=True)\n", + "\n", + " # decode the batch (Predict the logical observables based on the syndrome)\n", + " predictions = matcher.decode_batch(detectors)\n", + "\n", + " # strict post-selection ONLY On the rotation phase)\n", + " cutoff = 3 * (d**2 - 1)\n", + " # Mask is True ONLY if all detectors up to the cutoff are False (0)\n", + " clean_shots_mask = ~detectors[:, :cutoff].any(axis=1)\n", + " accepted_shots_count = np.sum(clean_shots_mask)\n", + "\n", + " if accepted_shots_count == 0:\n", + " print(f\"Angle: {angle_rad:.4e} rad | ALL SHOTS REJECTED\")\n", + " results[d].append(np.nan)\n", + " continue\n", + "\n", + " # 5. Filter observations and predictions using the mask\n", + " clean_observables = observables[clean_shots_mask]\n", + " clean_predictions = predictions[clean_shots_mask]\n", + "\n", + " # 6. Calculate errors: A logical error occurred if the MWPM prediction is wrong\n", + " # Vectorized comparison: returns True where prediction != observation\n", + " logical_errors = (clean_observables != clean_predictions)\n", + " \n", + " normalized_error = np.mean(logical_errors) / d\n", + " results[d].append(normalized_error)\n", + "\n", + " acc_rate = (accepted_shots_count / n_shots) * 100\n", + " print(f\"Angle: {angle_rad:.4e} rad | Acc: {acc_rate:.2f}% | Norm Error: {normalized_error:.4e}\")\n", + "\n", + "\n", + " plt.figure(figsize=(9, 6))\n", + " markers = {3: 'o', 5: 's', 7: '^'}\n", + " colors = {3: '#1f77b4', 5: '#ff7f0e', 7: '#2ca02c'}\n", + "\n", + " for d in distances:\n", + " label = f\"$d={d}$ ({qubit_counts[d]} qubits)\"\n", + " plt.loglog(angles_rad, results[d], marker=markers[d], color=colors[d], \n", + " linewidth=2, markersize=8, markerfacecolor='white', markeredgewidth=2, label=label)\n", + "\n", + " plt.xlabel('Rotation angle $\\\\theta$ (rad)', fontsize=13)\n", + " plt.ylabel('Logical error rate / distance', fontsize=13)\n", + " \n", + " \n", + " plt.legend(loc='upper left', fontsize=12)\n", + " plt.title(\"STAR Architecture: Normalized Logical Error vs. Rotation Angle\", fontsize=14, fontweight='bold', pad=15)\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "if __name__ == \"__main__\":\n", + " run_tsim_star_benchmark()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "999de294", + "metadata": {}, + "outputs": [ + { + "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", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RZ-0.1562Ď€\n", + "\n", + "RZ-0.1562Ď€\n", + "\n", + "RZ-0.1562Ď€\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "\n", + "DEP2\n", + "0.001\n", + "\n", + "DEP2\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "DEP1\n", + "0.001\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "R\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "RX\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "M\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "MX\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "RZ-0.01Ď€\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "MPPX\n", + "\n", + "MPPX\n", + "\n", + "MPPX\n", + "\n", + "Tick 0\n", + "\n", + "Tick 1\n", + "\n", + "Tick 2\n", + "\n", + "Tick 3\n", + "\n", + "Tick 4\n", + "\n", + "Tick 5\n", + "\n", + "Tick 6\n", + "\n", + "Tick 7\n", + "\n", + "Tick 8\n", + "\n", + "Tick 9\n", + "\n", + "Tick 10\n", + "\n", + "Tick 11\n", + "\n", + "Tick 12\n", + "\n", + "Tick 13\n", + "\n", + "Tick 14\n", + "\n", + "Tick 15\n", + "\n", + "Tick 16\n", + "\n", + "Tick 17\n", + "\n", + "Tick 18\n", + "\n", + "Tick 19\n", + "\n", + "Tick 20\n", + "\n", + "Tick 21\n", + "\n", + "Tick 22\n", + "\n", + "Tick 23\n", + "\n", + "Tick 24\n", + "\n", + "Tick 25\n", + "\n", + "Tick 26\n", + "\n", + "Tick 27\n", + "\n", + "Tick 28\n", + "\n", + "Tick 29\n", + "\n", + "Tick 30\n", + "\n", + "Tick 31\n", + "\n", + "Tick 32\n", + "\n", + "Tick 33\n", + "\n", + "Tick 34\n", + "\n", + "Tick 35\n", + "\n", + "Tick 36\n", + "\n", + "Tick 37\n", + "\n", + "Tick 38\n", + "\n", + "Tick 39\n", + "\n", + "Tick 40\n", + "\n", + "Tick 41\n", + "\n", + "Tick 42\n", + "\n", + "Tick 43\n", + "\n", + "Tick 44\n", + "\n", + "Tick 45\n", + "\n", + "Tick 46\n", + "\n", + "Tick 47\n", + "\n", + "Tick 48\n", + "\n", + "Tick 49\n", + "\n", + "Tick 50\n", + "\n", + "Tick 51\n", + "\n", + "Tick 52\n", + "\n", + "Tick 53\n", + "\n", + "Tick 54\n", + "\n", + "Tick 55\n", + "\n", + "Tick 56\n", + "\n", + "Tick 57\n", + "\n", + "Tick 58\n", + "\n", + "Tick 59\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from tsim import Circuit \n", + "\n", + "c = Circuit.from_file(\"assets/star_circuits/star_d=3.stim\")\n", + "\n", + "c.diagram(\"timeslice-svg\",height=1800)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "24aef4e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Graph(1947 vertices, 2108 edges)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c.diagram(\"pyzx\", scale_horizontally=1.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "23b17b36", + "metadata": {}, + "outputs": [], + "source": [ + "sampler = c.compile_detector_sampler()\n", + "detectors, observables = sampler.sample(shots=100_000, separate_observables=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "ccc1c760", + "metadata": {}, + "outputs": [], + "source": [ + "# Find the bad shots. \n", + "# .any(axis=1) checks horizontally across the 24 detectors for each shot. \n", + "# If EVEN ONE detector is True, the whole shot is marked True (bad).\n", + "bad_shots_mask = detectors.any(axis=1)\n", + "clean_shots_mask = ~bad_shots_mask\n", + "\n", + "\n", + "surviving_logical_measurements = observables[clean_shots_mask]\n", + "\n", + "logical_error_rate = np.mean(surviving_logical_measurements)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "eth-quantum-hackathon-2026-challenge (3.12.3)", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/2026/Bruno_minions/Synthesis.ipynb b/2026/Bruno_minions/Synthesis.ipynb new file mode 100644 index 0000000..60b8b9f --- /dev/null +++ b/2026/Bruno_minions/Synthesis.ipynb @@ -0,0 +1,5024 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "31d9d5e0", + "metadata": {}, + "source": [ + "# Team Synthesis" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46abab0d", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Any\n", + "\n", + "from kirin.ir import Method\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from bloqade import squin, tsim\n", + "from bloqade.cirq_utils import emit_circuit, load_circuit, noise\n", + "from bloqade.pyqrack import StackMemorySimulator\n", + "from bloqade.types import MeasurementResult, Qubit\n", + "from kirin.dialects.ilist import IList\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# this will help us have return types for our methods that have more intuitive names\n", + "Register = IList[Qubit, Any]\n", + "Measurement = IList[MeasurementResult, Any]\n", + "\n", + "# this function will help us visualize some circuits\n", + "def show_circuit(squin_kernel):\n", + " @squin.kernel\n", + " def _to_visualize():\n", + " _ = squin_kernel()\n", + "\n", + " return tsim.Circuit(_to_visualize).diagram(height=400)" + ] + }, + { + "cell_type": "markdown", + "id": "a36a2bb9", + "metadata": {}, + "source": [ + "## Part 1: Learn the language of Clifford+$T$\n", + "\n", + "\n", + "Learn how to build and simulate simple circuits using Bloqade Squin and Bloqade PyQrack.\n", + "\n", + "Build a few small 1-qubit and 2-qubit examples. Confirm that you understand how $H, S, $ and $CNOT$ act on simple input states. Use this part to get comfortable creating, simulating, and visualizing circuits constructed from the Clifford+$T := {H, S, CNOT, T}$ gateset.\n", + "\n", + "Goal: Build intuition for Clifford+T circuits and the simulation workflow." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8c4ee188", + "metadata": {}, + "outputs": [], + "source": [ + "@squin.kernel\n", + "def bell_state() -> Measurement:\n", + " qubits = squin.qalloc(2)\n", + " squin.h(qubits[0])\n", + " squin.cx(qubits[0], qubits[1])\n", + " bits = squin.broadcast.measure(qubits)\n", + " return bits" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "41b70fa4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "q1\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "M\n", + "0\n", + "rec[0]\n", + "\n", + "M\n", + "0\n", + "rec[1]\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_circuit(bell_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d987c807", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "IList([, ])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=2)\n", + "task = pyqrack_target.task(bell_state)\n", + "\n", + "single_shot = task.run()\n", + "single_shot" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4f0b6fc2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(, ): 0.496,\n", + " (, ): 0.504}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "batch_results = task.batch_run(shots=2000)\n", + "batch_results" + ] + }, + { + "cell_type": "markdown", + "id": "0e5a9519", + "metadata": {}, + "source": [ + "## Part 2: Synthesize the rotation family\n", + "\n", + "Focus on the family\n", + "\n", + "$$\n", + "R_z\\left(\\pi / 2^n\\right), \\qquad n \\in 0,1,2,3,4,5\n", + "$$\n", + "\n", + "How can we implement these “dyadic” Z-rotations using only Clifford+$T$?\n", + "\n", + "Try synthesizing these rotations as well as you can using only our chosen gate set for one qubit (yes, only 1 qubit), and different values of \\(n\\). Some implementations may be exact while others may involve approximations, that is okay. It is up to you to explore different synthesis strategies and compare the circuits you find.\n", + "\n", + "We suggest spending time on finding ways to visualize how your approximations act on different initial states, and reflecting on what you tried, how you judged quality, and what changed as the target angle became smaller.\n", + "\n", + "**Goal**: Explore how small Z-rotations can be built from Clifford+ \\(T\\) and explain the synthesis strategies you explored.\n", + "\n", + "**Distance metric**: When comparing a target gate \\(U\\) to an implementation \\(V\\), use the following global-phase-invariant distance:\n", + "\n", + "$$\n", + "d(U,V) = \\sqrt{1 - \\frac{|\\mathrm{Tr}(U^\\dagger V)|}{2}}\n", + "$$\n", + "\n", + "**Interpretation**\n", + "- \\(d = 0\\) means exact agreement up to global phase,\n", + "- larger \\(d\\) means a worse approximation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3e1904e2", + "metadata": {}, + "outputs": [], + "source": [ + "H = np.array([[1, 1], [1, -1]]) / np.sqrt(2)\n", + "T = np.array([[1, 0], [0, np.exp(1j * np.pi / 4)]])\n", + "HT = H @ T\n", + "TT = T @ T\n", + "TTTT = TT @ TT\n", + "HTHT = HT @ HT\n", + "\n", + "gates = {\n", + " \"H\": H,\n", + " \"T\": T,\n", + " \"HT\": HT, \n", + " \"TT\": TT,\n", + " \"TTTT\": TTTT,\n", + " \"HTHT\": HTHT\n", + "}\n", + "\n", + "def rz(theta):\n", + " return np.array([[np.exp(-1j * theta / 2), 0], [0, np.exp(1j * theta / 2)]])\n", + "\n", + "def distance(U, V):\n", + " return np.sqrt(1 - abs(np.trace(U.conj().T @ V)) / 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "33b363e2", + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import product\n", + "\n", + "def brute_force(n, max_depth):\n", + " best_seq = None\n", + " best_d = float('inf') #distance(np.eye(2), rz(np.pi / 8))\n", + " best_U = None\n", + "\n", + " U = rz(np.pi / (2**n))\n", + "\n", + " #for depth in range(1, max_depth + 1):\n", + " for seq in product(gates.keys(), repeat=max_depth):\n", + " if any(a == \"H\" and b == \"H\" for a, b in zip(seq, seq[1:])):\n", + " continue\n", + " if \"T\" * 8 in \"\".join(seq):\n", + " continue\n", + " V = np.eye(2, dtype=complex)\n", + " for gate in seq: V = gates[gate] @ V\n", + " d = distance(U, V)\n", + "\n", + " if d < best_d:\n", + " best_d = d\n", + " best_seq = seq\n", + " best_U = V\n", + "\n", + " return best_seq, best_d, best_U" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a9580ec7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Depth: 1, Sequence: ('T',), Distance: 0.241777\n", + "Depth: 2, Sequence: ('HT', 'H'), Distance: 0.241777\n", + "Depth: 3, Sequence: ('HT', 'HTHT', 'HTHT'), Distance: 0.167024\n", + "Depth: 4, Sequence: ('H', 'HTHT', 'HTHT', 'T'), Distance: 0.167024\n", + "Depth: 5, Sequence: ('H', 'T', 'TT', 'TTTT', 'HT'), Distance: 0.034707\n" + ] + } + ], + "source": [ + "for depth in range(1, 6):\n", + " seq, d, U = brute_force(5, max_depth=depth)\n", + " print(f\"Depth: {depth}, Sequence: {seq}, Distance: {d:.6f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "339731ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing n=1...\n", + " Depth: 1...\n", + " Depth: 2...\n", + " Depth: 3...\n", + " Depth: 4...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Mar Li\\AppData\\Local\\Temp\\ipykernel_25508\\3145263358.py:21: RuntimeWarning: invalid value encountered in sqrt\n", + " return np.sqrt(1 - abs(np.trace(U.conj().T @ V)) / 2)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Depth: 5...\n", + " Depth: 6...\n", + " Depth: 7...\n", + " Depth: 8...\n", + " Depth: 9...\n", + "Processing n=2...\n", + " Depth: 1...\n", + " Depth: 2...\n", + " Depth: 3...\n", + " Depth: 4...\n", + " Depth: 5...\n", + " Depth: 6...\n", + " Depth: 7...\n", + " Depth: 8...\n", + " Depth: 9...\n", + "Processing n=3...\n", + " Depth: 1...\n", + " Depth: 2...\n", + " Depth: 3...\n", + " Depth: 4...\n", + " Depth: 5...\n", + " Depth: 6...\n", + " Depth: 7...\n", + " Depth: 8...\n", + " Depth: 9...\n", + "Processing n=4...\n", + " Depth: 1...\n", + " Depth: 2...\n", + " Depth: 3...\n", + " Depth: 4...\n", + " Depth: 5...\n", + " Depth: 6...\n", + " Depth: 7...\n", + " Depth: 8...\n", + " Depth: 9...\n", + "Processing n=5...\n", + " Depth: 1...\n", + " Depth: 2...\n", + " Depth: 3...\n", + " Depth: 4...\n", + " Depth: 5...\n", + " Depth: 6...\n", + " Depth: 7...\n", + " Depth: 8...\n", + " Depth: 9...\n" + ] + } + ], + "source": [ + "data = {\"1\": None, \"2\": None, \"3\": None, \"4\": None, \"5\": None}\n", + "for n in data.keys():\n", + " print(f\"Processing n={n}...\")\n", + " data[n] = dict()\n", + " for depth in range(1, 10):\n", + " print(f\" Depth: {depth}...\")\n", + " seq, d, U = brute_force(int(n), max_depth=depth)\n", + " data[n][len(\"\".join(seq))] = d, seq" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3ab595ae", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-10T10:00:20.287645\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 5))\n", + "color = ['tab:orange', 'tab:green', 'tab:blue', 'tab:cyan', 'tab:magenta']\n", + "for n, results in data.items():\n", + " if n == \"1\" or n == \"2\":\n", + " continue\n", + " plt.axhline(y=distance( rz(np.pi/(2**int(n))) , np.eye(2) ), linestyle='--', color=color[int(n)-3])\n", + " depths = sorted(results.keys())\n", + " distances = [results[d][0] for d in depths]\n", + " plt.plot(depths, distances, marker='o', label=f\"n={n}\", color=color[int(n)-3])\n", + "\n", + "plt.title(\"Brute-force search for single-qubit $R_z$ synthesis\")\n", + "plt.xlabel(\"Depth of sequence (number of gates)\")\n", + "plt.ylabel(\"Distance to target unitary\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a23410cc", + "metadata": {}, + "source": [ + "## Team Synthesis Part 3: Non-Clifford gates are expensive\n", + "\n", + "How would you approximate the family of rotations above if I now suddenly told you that $T$ gates can no longer be applied to your qubit? If you spent enough time thinking about part 1, the correct answer should be somewhere in the realm of \"not good.\" Unfortunately, this is what often happens in reality (you will learn more about why this happens in the next part). It is up to you to find and implement a protocol to \"inject\" the effect of $T$ gates onto the main qubit.\n", + "\n", + "To counteract this not-good news, you will now have access to auxiliary qubits on which you will be allowed to apply $T$ gates. You will now also be able to apply $CNOT$ gates using your main qubit as either target or control, as well as across auxiliary qubits. Other than that, it should be just $S$ or $H$ gates on your main qubit. We want you to approximate the rotations on your main qubit and benchmark them using the previous distance metric, working within the bounds of the simulators (i.e. if the circuit cannot be simulated the approximation does not count).\n", + "\n", + "Track the new costs that appear: ancilla count, 2-qubit gate count, circuit depth, repeated trials, feed-forward, or any other relevant overhead.\n", + "\n", + "Goal: Rebuild the same 1-qubit rotations in a setting where the non-Clifford gates in the Clifford+$T$ set must be supplied indirectly.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "156177ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "\n", + "RY0.7546Ď€\n", + "\n", + "RZ1.227Ď€\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ry_angle = np.random.uniform(0, 2 * np.pi)\n", + "rz_angle = np.random.uniform(0, 2 * np.pi)\n", + "\n", + "def make_psi(ry_angle, rz_angle):\n", + " \n", + " @squin.kernel\n", + " def psi() -> Register:\n", + " qubits = squin.qalloc(1)\n", + " squin.ry(ry_angle, qubits[0])\n", + " squin.rz(rz_angle, qubits[0])\n", + " return qubits \n", + " return psi\n", + "\n", + "\n", + "show_circuit(make_psi(ry_angle, rz_angle))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "47e4fda4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "\n", + "H\n", + "\n", + "T\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def make_magic_state():\n", + " @squin.kernel\n", + " def magic_state() -> Register:\n", + " qubits = squin.qalloc(1)\n", + " squin.h(qubits[0])\n", + " squin.t(qubits[0])\n", + " return qubits \n", + " return magic_state\n", + "\n", + "show_circuit(make_magic_state())" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c2af8d09", + "metadata": {}, + "outputs": [], + "source": [ + "def make_injection(psi):\n", + " aux_kernel = make_magic_state()\n", + " \n", + " @squin.kernel\n", + " def injection() -> Register:\n", + " main = psi()\n", + " aux = aux_kernel()\n", + " \n", + " squin.cx(main[0], aux[0])\n", + " \n", + " measurement = squin.broadcast.measure([aux[0]]) \n", + " if measurement[0]: \n", + " squin.s(main[0])\n", + " bits = squin.broadcast.measure(main)\n", + " return bits\n", + " \n", + " return injection" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b4899f5d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(,): 0.262, (,): 0.738}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=1)\n", + "task = pyqrack_target.task(make_injection(make_psi(np.random.uniform(0, 2 * np.pi), np.random.uniform(0, 2 * np.pi))))\n", + "batch_results = task.batch_run(shots=500)\n", + "batch_results" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "0583b27c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "\n", + "RY0.06388Ď€\n", + "\n", + "RZ1.432Ď€\n", + "\n", + "T\n", + "M\n", + "0\n", + "rec[0]\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def make_T_circuit(psi):\n", + " \n", + " @squin.kernel\n", + " def T_circuit() -> Measurement:\n", + " qubits = psi()\n", + " squin.t(qubits[0])\n", + " bits = squin.broadcast.measure(qubits)\n", + " return bits\n", + " \n", + " return T_circuit\n", + "\n", + "psi = make_psi(np.random.uniform(0, 2 * np.pi), np.random.uniform(0, 2 * np.pi))\n", + "show_circuit(make_T_circuit(psi))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "02c458d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(,): 0.966, (,): 0.034}\n", + "{'0': 0.966, '1': 0.034}\n" + ] + } + ], + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=1)\n", + "task = pyqrack_target.task(make_T_circuit(make_psi(np.random.uniform(0, 2 * np.pi), np.random.uniform(0, 2 * np.pi))))\n", + "batch_results = task.batch_run(shots=500)\n", + "print(batch_results)\n", + "def outcome_to_bitstring(outcome):\n", + " return \"\".join(\"1\" if getattr(x,\"value\",None)==1 or \"One\" in repr(x) else \"0\" for x in outcome)\n", + "counts = { outcome_to_bitstring(k): v for k,v in batch_results.items() }\n", + "print(counts) " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "65b99647", + "metadata": {}, + "outputs": [], + "source": [ + "data = {\"T\": [], \"Injection\": []}\n", + "\n", + "for _ in range(15):\n", + " ry_angle = np.random.uniform(0, 2*np.pi)\n", + " rz_angle = np.random.uniform(0, 2*np.pi)\n", + " psi = make_psi(ry_angle, rz_angle)\n", + "\n", + " pyqrack_target_T = StackMemorySimulator(min_qubits=1)\n", + " task_T = pyqrack_target_T.task(make_T_circuit(psi))\n", + " batch_results_T = task_T.batch_run(shots=1000)\n", + " batch_results_T = { outcome_to_bitstring(k): v for k,v in batch_results_T.items() }\n", + " if \"0\" not in batch_results_T:\n", + " batch_results_T[\"0\"] = 0.0\n", + " if \"1\" not in batch_results_T:\n", + " batch_results_T[\"1\"] = 0.0\n", + " a_T, b_T = batch_results_T[\"0\"], batch_results_T[\"1\"]\n", + " data[\"T\"].append((a_T, b_T))\n", + "\n", + " pyqrack_target_injection = StackMemorySimulator(min_qubits=2)\n", + " task_injection = pyqrack_target_injection.task(make_injection(psi))\n", + " batch_results_injection = task_injection.batch_run(shots=1000)\n", + " batch_results_injection = { outcome_to_bitstring(k): v for k,v in batch_results_injection.items() }\n", + " if \"0\" not in batch_results_injection:\n", + " batch_results_injection[\"0\"] = 0.0\n", + " if \"1\" not in batch_results_injection:\n", + " batch_results_injection[\"1\"] = 0.0\n", + " a_injection, b_injection = batch_results_injection[\"0\"], batch_results_injection[\"1\"]\n", + " data[\"Injection\"].append((a_injection, b_injection))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "cf57ed3d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-10T10:10:59.095781\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 5))\n", + "for method, results in data.items():\n", + " if method == \"T\": \n", + " colors = [\"tab:blue\", \"tab:cyan\"]\n", + " size = 75\n", + " if method == \"Injection\": \n", + " colors = [\"tab:orange\", \"tab:red\"]\n", + " size = 20\n", + " a_values = [res[0] for res in results]\n", + " b_values = [res[1] for res in results]\n", + " plt.scatter([t for t in range(len(a_values))], a_values, color=colors[0], s=size, label=fr\"{method} ($|0\\rangle$)\")\n", + " plt.scatter([t for t in range(len(b_values))], b_values, color=colors[1], s=size, label=fr\"{method} ($|1\\rangle$)\")\n", + "\n", + "plt.xlabel(\"Trial\")\n", + "plt.ylabel(\"Coefficients\")\n", + "plt.title(\"Measurement outcomes for $T$ gate vs. injection method\")\n", + "plt.legend(loc=\"center right\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "cb7a4adb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "\n", + "RY0.9091Ď€\n", + "\n", + "RZ1.892Ď€\n", + "\n", + "H\n", + "\n", + "H\n", + "\n", + "T\n", + "H\n", + "\n", + "T\n", + "H\n", + "\n", + "T\n", + "H\n", + "\n", + "T\n", + "T\n", + "T\n", + "M\n", + "0\n", + "rec[0]\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def brute_force_circuit_with_T(psi, sequence):\n", + " @squin.kernel\n", + " def brute_force_circuit() -> Register:\n", + " qubits = psi()\n", + " for gate in sequence:\n", + " if gate == \"H\": squin.h(qubits[0])\n", + " elif gate == \"T\": squin.t(qubits[0])\n", + "\n", + " mid_circuit_measurement = squin.broadcast.measure(qubits)\n", + " \n", + " return mid_circuit_measurement\n", + " return brute_force_circuit\n", + "\n", + "show_circuit(brute_force_circuit_with_T(make_psi(ry_angle, rz_angle), sequence=seq))" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "22719581", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(,): 0.934, (,): 0.066}\n" + ] + } + ], + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=1)\n", + "psi = make_psi(np.random.uniform(0, 2 * np.pi), np.random.uniform(0, 2 * np.pi))\n", + "task = pyqrack_target.task(brute_force_circuit_with_T(psi, sequence=seq))\n", + "batch_results = task.batch_run(shots=500)\n", + "print(batch_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "287adf4a", + "metadata": {}, + "outputs": [], + "source": [ + "def brute_force_circuit_without_T(psi, sequence):\n", + " @squin.kernel\n", + " def brute_force_circuit() -> Register:\n", + " main = psi()\n", + " \n", + " # Allocate exactly one ancilla and recycle it for every injected T.\n", + " aux = squin.qalloc(1)\n", + " \n", + " for gate in sequence:\n", + " if gate == \"H\":\n", + " squin.h(main[0])\n", + " elif gate == \"T\":\n", + " # Re-prepare |A> = T|+> on the same ancilla.\n", + " squin.h(aux[0])\n", + " squin.t(aux[0])\n", + " squin.cx(main[0], aux[0])\n", + " measurement = squin.broadcast.measure([aux[0]])\n", + " if measurement[0]:\n", + " squin.s(main[0])\n", + " # Return ancilla to |0> so it can be reused.\n", + " if measurement[0]:\n", + " squin.x(aux[0])\n", + " \n", + " bits = squin.broadcast.measure(main)\n", + " return bits\n", + " \n", + " return brute_force_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cc1b1b1c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(,): 0.728, (,): 0.272}\n" + ] + } + ], + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=1)\n", + "psi = make_psi(np.random.uniform(0, 2 * np.pi), np.random.uniform(0, 2 * np.pi))\n", + "task = pyqrack_target.task(brute_force_circuit_with_T(psi, sequence=seq))\n", + "batch_results = task.batch_run(shots=500)\n", + "print(batch_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "7ccae1f1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + " \n", + "\n", + "\n", + "q0\n", + "\n", + "\n", + "RY0.8961Ď€\n", + "\n", + "RZ0.7748Ď€\n", + "\n", + "RZ0.125Ď€\n", + "\n", + "M\n", + "0\n", + "rec[0]\n", + "\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def rz_circuit(psi, n):\n", + " @squin.kernel\n", + " def circuit() -> Measurement:\n", + " qubits = psi()\n", + " squin.rz(np.pi/(2**n), qubits[0])\n", + " bits = squin.broadcast.measure(qubits)\n", + " return bits\n", + " return circuit\n", + "\n", + "show_circuit(rz_circuit(make_psi(np.random.uniform(0, 2*np.pi), np.random.uniform(0, 2*np.pi)), 3))" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "25c58a20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing n=3...\n", + "Sequence: HTHTTTHTHTHTHTTTHTHT, Distance: 0.039721\n", + " Trial 1...\n", + "{'0': 0.995, '1': 0.005}\n", + "{'0': 0.99, '1': 0.01}\n", + "{'0': 0.99, '1': 0.01}\n", + " Trial 2...\n", + "{'1': 0.978, '0': 0.022}\n", + "{'1': 0.99, '0': 0.01}\n", + "{'1': 0.995, '0': 0.005}\n", + " Trial 3...\n", + "{'0': 0.999, '1': 0.001}\n", + "{'0': 0.999, '1': 0.001}\n", + "{'0': 0.999, '1': 0.001}\n", + " Trial 4...\n", + "{'1': 0.888, '0': 0.112}\n", + "{'1': 0.898, '0': 0.102}\n", + "{'1': 0.9, '0': 0.1}\n", + " Trial 5...\n", + "{'0': 0.111, '1': 0.889}\n", + "{'1': 0.905, '0': 0.095}\n", + "{'1': 0.921, '0': 0.079}\n", + "Processing n=4...\n", + "Sequence: TTTTHTTTTTTTHTTTTT, Distance: 0.069392\n", + " Trial 1...\n", + "{'0': 0.99, '1': 0.01}\n", + "{'1': 0.205, '0': 0.795}\n", + "{'1': 0.24, '0': 0.76}\n", + " Trial 2...\n", + "{'0': 0.807, '1': 0.193}\n", + "{'1': 0.31, '0': 0.69}\n", + "{'0': 0.67, '1': 0.33}\n", + " Trial 3...\n", + "{'0': 0.786, '1': 0.214}\n", + "{'1': 0.326, '0': 0.674}\n", + "{'0': 0.7, '1': 0.3}\n", + " Trial 4...\n", + "{'1': 0.703, '0': 0.297}\n", + "{'1': 0.974, '0': 0.026}\n", + "{'0': 0.032, '1': 0.968}\n", + " Trial 5...\n", + "{'0': 0.367, '1': 0.633}\n", + "{'0': 0.742, '1': 0.258}\n", + "{'0': 0.732, '1': 0.268}\n", + "Processing n=5...\n", + "Sequence: TTTTHTTTTTTTHTTTTT, Distance: 0.034707\n", + " Trial 1...\n", + "{'1': 0.986, '0': 0.014}\n", + "{'1': 0.921, '0': 0.079}\n", + "{'1': 0.914, '0': 0.086}\n", + " Trial 2...\n", + "{'1': 0.974, '0': 0.026}\n", + "{'1': 0.804, '0': 0.196}\n", + "{'1': 0.83, '0': 0.17}\n", + " Trial 3...\n", + "{'1': 0.998, '0': 0.002}\n", + "{'1': 0.832, '0': 0.168}\n", + "{'0': 0.166, '1': 0.834}\n", + " Trial 4...\n", + "{'0': 0.384, '1': 0.616}\n", + "{'1': 0.299, '0': 0.701}\n", + "{'1': 0.313, '0': 0.687}\n", + " Trial 5...\n", + "{'1': 0.99, '0': 0.01}\n", + "{'1': 0.824, '0': 0.176}\n", + "{'1': 0.84, '0': 0.16}\n" + ] + } + ], + "source": [ + "data = {\"RZ\": {}, \"T\": {}, \"Injection\": {}}\n", + "\n", + "for n in range(3, 6):\n", + " print(f\"Processing n={n}...\")\n", + "\n", + " data[\"T\"][n] = []\n", + " data[\"Injection\"][n] = []\n", + " data[\"RZ\"][n] = []\n", + "\n", + " theta = np.pi / (2**n)\n", + " seq, d, U = brute_force(n, max_depth=7)\n", + " seq = \"\".join(seq)\n", + " print(f\"Sequence: {seq}, Distance: {d:.6f}\")\n", + "\n", + " for _ in range(5):\n", + " print(f\" Trial {_+1}...\")\n", + " ry_angle = np.random.uniform(0, 2*np.pi)\n", + " rz_angle = np.random.uniform(0, 2*np.pi)\n", + " \n", + " psi = make_psi(ry_angle, rz_angle)\n", + " pyqrack_target_exact = StackMemorySimulator(min_qubits=2)\n", + " task_exact = pyqrack_target_exact.task(rz_circuit(psi, n))\n", + " batch_results_exact = task_exact.batch_run(shots=1000)\n", + " batch_results_exact = { outcome_to_bitstring(k): v for k,v in batch_results_exact.items() }\n", + " if \"0\" not in batch_results_exact:\n", + " batch_results_exact[\"0\"] = 0.0\n", + " if \"1\" not in batch_results_exact:\n", + " batch_results_exact[\"1\"] = 0.0\n", + " print(batch_results_exact)\n", + " a_exact, b_exact = batch_results_exact[\"0\"], batch_results_exact[\"1\"]\n", + " data[\"RZ\"][n].append((a_exact, b_exact))\n", + "\n", + " psi = make_psi(ry_angle, rz_angle)\n", + " pyqrack_target_T = StackMemorySimulator(min_qubits=1)\n", + " task_T = pyqrack_target_T.task(brute_force_circuit_with_T(psi, sequence=seq))\n", + " batch_results_T = task_T.batch_run(shots=1000)\n", + " batch_results_T = { outcome_to_bitstring(k): v for k,v in batch_results_T.items() }\n", + " if \"0\" not in batch_results_T:\n", + " batch_results_T[\"0\"] = 0.0\n", + " if \"1\" not in batch_results_T:\n", + " batch_results_T[\"1\"] = 0.0\n", + " print(batch_results_T)\n", + " a_T, b_T = batch_results_T[\"0\"], batch_results_T[\"1\"]\n", + " data[\"T\"][n].append((a_T, b_T))\n", + "\n", + " psi = make_psi(ry_angle, rz_angle)\n", + " pyqrack_target_injection = StackMemorySimulator(min_qubits=2)\n", + " task_injection = pyqrack_target_injection.task(brute_force_circuit_without_T(psi, sequence=seq))\n", + " batch_results_injection = task_injection.batch_run(shots=1000)\n", + " batch_results_injection = { outcome_to_bitstring(k): v for k,v in batch_results_injection.items() }\n", + " if \"0\" not in batch_results_injection:\n", + " batch_results_injection[\"0\"] = 0.0\n", + " if \"1\" not in batch_results_injection:\n", + " batch_results_injection[\"1\"] = 0.0\n", + " print(batch_results_injection)\n", + " a_injection, b_injection = batch_results_injection[\"0\"], batch_results_injection[\"1\"]\n", + " data[\"Injection\"][n].append((a_injection, b_injection))" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "594ffd9e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-10T11:32:52.287768\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 5))\n", + "for method, results in data.items():\n", + " if method == \"T\": \n", + " colors = [\"tab:blue\", \"tab:cyan\"]\n", + " #size = 50\n", + " if method == \"Injection\": \n", + " colors = [\"tab:orange\", \"tab:red\"]\n", + " #size = 20\n", + " if method == \"RZ\":\n", + " colors = [\"tab:green\", \"tab:olive\"]\n", + " #size = 75\n", + " \n", + " for n, res in results.items():\n", + " a_values = [r[0] for r in res]\n", + " b_values = [r[1] for r in res]\n", + " plt.scatter(np.linspace(n, n+1-0.3, len(a_values)), a_values, color=colors[0], label=fr\"{method} ($|0\\rangle$)\")\n", + " plt.scatter(np.linspace(n, n+1-0.3, len(b_values)), b_values, color=colors[1], label=fr\"{method} ($|1\\rangle$)\")\n", + " plt.axvline(x=n-0.15, linestyle='--', color='gray', alpha=0.5)\n", + " plt.axvline(x=n+1-0.15, linestyle='--', color='gray', alpha=0.5)\n", + "\n", + "plt.title(\"Comparison of $R_z$ synthesis methods\")\n", + "plt.xlabel(\"n\")\n", + "plt.ylabel(\"Coefficients\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5675149", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37c44b16", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "eth-quantum-hackathon-2026-challenge (3.12.13)", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/2026/Bruno_minions/report.pdf b/2026/Bruno_minions/report.pdf new file mode 100644 index 0000000..2c14a3c Binary files /dev/null and b/2026/Bruno_minions/report.pdf differ diff --git a/2026/bloqade_tutorial_eth.ipynb b/2026/bloqade_tutorial_eth.ipynb index 56a0a62..8648d42 100644 --- a/2026/bloqade_tutorial_eth.ipynb +++ b/2026/bloqade_tutorial_eth.ipynb @@ -1,22 +1,23 @@ { "cells": [ { - "metadata": {}, "cell_type": "markdown", + "id": "5981812ea24a6423", + "metadata": {}, "source": [ "# Disclaimer\n", "\n", "This is an early version of a Chapter on gate-based quantum computing with neutral-atoms that we are currently developing. As participants of ETH Hack, you are getting early access to it.\n", "\n", "If something is not clear, it is probably our fault. Come talk to the team about and we will be happy to help you out!" - ], - "id": "5981812ea24a6423" + ] }, { + "cell_type": "markdown", + "id": "38b4de169afe5f48", "metadata": { "collapsed": true }, - "cell_type": "markdown", "source": [ "# Quantum Circuits with Bloqade\n", "\n", @@ -27,11 +28,11 @@ "- **Remember** the hierarchy of error sources in neutral-atom programs\n", "- **Reflect** on the design principles for efficient neutral-atom programs\n", "- **Execute** noisy simulations with hardware-aware heuristic noise models" - ], - "id": "38b4de169afe5f48" + ] }, { "cell_type": "code", + "execution_count": 1, "id": "0af162e8", "metadata": { "ExecuteTime": { @@ -39,6 +40,7 @@ "start_time": "2026-03-30T14:31:26.178423Z" } }, + "outputs": [], "source": [ "from typing import Any\n", "\n", @@ -64,9 +66,7 @@ " _ = squin_kernel()\n", "\n", " return tsim.Circuit(_to_visualize).diagram(height=400)" - ], - "outputs": [], - "execution_count": 1 + ] }, { "cell_type": "markdown", @@ -113,6 +113,7 @@ }, { "cell_type": "code", + "execution_count": 2, "id": "1a9300ff95653986", "metadata": { "ExecuteTime": { @@ -120,6 +121,7 @@ "start_time": "2026-03-30T14:32:04.020905Z" } }, + "outputs": [], "source": [ "@squin.kernel\n", "def bell_state() -> Measurement:\n", @@ -128,9 +130,7 @@ " squin.cx(qubits[0], qubits[1])\n", " bits = squin.broadcast.measure(qubits)\n", " return bits" - ], - "outputs": [], - "execution_count": 3 + ] }, { "cell_type": "markdown", @@ -151,6 +151,7 @@ }, { "cell_type": "code", + "execution_count": 3, "id": "00f8dbdf", "metadata": { "ExecuteTime": { @@ -158,18 +159,12 @@ "start_time": "2026-03-30T14:32:05.083150Z" } }, - "source": [ - "show_circuit(bell_state)" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -196,14 +191,19 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "source": [ + "show_circuit(bell_state)" + ] }, { "cell_type": "markdown", @@ -217,10 +217,13 @@ "cell_type": "markdown", "id": "7c4bd7b0", "metadata": {}, - "source": "---" + "source": [ + "---" + ] }, { "cell_type": "code", + "execution_count": 4, "id": "f775231e", "metadata": { "ExecuteTime": { @@ -228,13 +231,6 @@ "start_time": "2026-03-30T14:32:06.711633Z" } }, - "source": [ - "pyqrack_target = StackMemorySimulator(min_qubits=2)\n", - "task = pyqrack_target.task(bell_state)\n", - "\n", - "single_shot = task.run()\n", - "single_shot" - ], "outputs": [ { "data": { @@ -242,12 +238,18 @@ "IList([, ])" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 5 + "source": [ + "pyqrack_target = StackMemorySimulator(min_qubits=2)\n", + "task = pyqrack_target.task(bell_state)\n", + "\n", + "single_shot = task.run()\n", + "single_shot" + ] }, { "cell_type": "markdown", @@ -259,6 +261,7 @@ }, { "cell_type": "code", + "execution_count": 5, "id": "c6ee61ac", "metadata": { "ExecuteTime": { @@ -266,30 +269,31 @@ "start_time": "2026-03-30T14:32:07.836776Z" } }, - "source": [ - "batch_results = task.batch_run(shots=200)\n", - "batch_results" - ], "outputs": [ { "data": { "text/plain": [ - "{(, ): 0.52,\n", - " (, ): 0.48}" + "{(, ): 0.465,\n", + " (, ): 0.535}" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 6 + "source": [ + "batch_results = task.batch_run(shots=200)\n", + "batch_results" + ] }, { "cell_type": "markdown", "id": "4a98b345", "metadata": {}, - "source": "---" + "source": [ + "---" + ] }, { "cell_type": "markdown", @@ -305,6 +309,7 @@ }, { "cell_type": "code", + "execution_count": 6, "id": "268f6bd5", "metadata": { "ExecuteTime": { @@ -312,25 +317,12 @@ "start_time": "2026-03-30T14:32:09.369393Z" } }, - "source": [ - "@squin.kernel\n", - "def bell_state_prep() -> Register:\n", - " qubits = squin.qalloc(2)\n", - " squin.h(qubits[0])\n", - " squin.cx(qubits[0], qubits[1])\n", - " return qubits\n", - "\n", - "show_circuit(bell_state_prep)" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -349,14 +341,26 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 7 + "source": [ + "@squin.kernel\n", + "def bell_state_prep() -> Register:\n", + " qubits = squin.qalloc(2)\n", + " squin.h(qubits[0])\n", + " squin.cx(qubits[0], qubits[1])\n", + " return qubits\n", + "\n", + "show_circuit(bell_state_prep)" + ] }, { "cell_type": "markdown", @@ -368,6 +372,7 @@ }, { "cell_type": "code", + "execution_count": null, "id": "4e7f018b", "metadata": { "ExecuteTime": { @@ -375,26 +380,12 @@ "start_time": "2026-03-30T14:32:10.503233Z" } }, - "source": [ - "@squin.kernel\n", - "def psi() -> Register:\n", - " qubits = squin.qalloc(1)\n", - " # these are just some example operations with random parameters\n", - " squin.ry(0.67, qubits[0])\n", - " squin.rz(0.42, qubits[0])\n", - " return qubits\n", - "\n", - "show_circuit(psi)" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -409,14 +400,27 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 8 + "source": [ + "@squin.kernel\n", + "def psi() -> Register:\n", + " qubits = squin.qalloc(1)\n", + " # these are just some example operations with random parameters\n", + " squin.ry(np.random.uniform(0, 1), qubits[0])\n", + " squin.rz(0.42, qubits[0])\n", + " return qubits\n", + "\n", + "show_circuit(psi)" + ] }, { "cell_type": "markdown", @@ -428,6 +432,7 @@ }, { "cell_type": "code", + "execution_count": 8, "id": "775f57dd", "metadata": { "ExecuteTime": { @@ -435,6 +440,7 @@ "start_time": "2026-03-30T14:32:11.680741Z" } }, + "outputs": [], "source": [ "@squin.kernel\n", "def teleport() -> Register:\n", @@ -455,9 +461,7 @@ "\n", "# the function we created for you cannot visualize mid-circuit\n", "# measurements but you will soon see why this is not a problem" - ], - "outputs": [], - "execution_count": 9 + ] }, { "cell_type": "markdown", @@ -469,6 +473,7 @@ }, { "cell_type": "code", + "execution_count": 9, "id": "82bea1f4", "metadata": { "ExecuteTime": { @@ -476,6 +481,23 @@ "start_time": "2026-03-30T14:32:12.685944Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Density matrix of psi:\n", + "[[0.8919109 +0.j 0.28350775-0.12660677j]\n", + " [0.28350775+0.12660677j 0.10808918+0.j ]]\n", + "\n", + "Density matrix of psi_prime:\n", + "[[0.89191122+0.j 0.28350787-0.12660683j]\n", + " [0.28350787+0.12660683j 0.10808924+0.j ]]\n", + "\n", + "Do the two states match? True\n" + ] + } + ], "source": [ "psi_simulator = StackMemorySimulator(min_qubits=1)\n", "psi_task = psi_simulator.task(psi)\n", @@ -494,25 +516,7 @@ "print(rho_psi_prime)\n", "print()\n", "print(\"Do the two states match?\", np.allclose(rho_psi, rho_psi_prime))" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Density matrix of psi:\n", - "[[0.89191084-0.j 0.28350771-0.12660677j]\n", - " [0.28350771+0.12660677j 0.10808916-0.j ]]\n", - "\n", - "Density matrix of psi_prime:\n", - "[[0.89191097+0.j 0.28350776-0.12660677j]\n", - " [0.28350776+0.12660677j 0.10808918-0.j ]]\n", - "\n", - "Do the two states match? True\n" - ] - } - ], - "execution_count": 10 + ] }, { "cell_type": "markdown", @@ -539,6 +543,7 @@ }, { "cell_type": "code", + "execution_count": 10, "id": "e3a4e83a", "metadata": { "ExecuteTime": { @@ -546,32 +551,12 @@ "start_time": "2026-03-30T14:32:14.248596Z" } }, - "source": [ - "@squin.kernel\n", - "def teleport_postselect() -> int:\n", - " # same code as before\n", - " input_register = psi()\n", - " bell_register = bell_state_prep()\n", - "\n", - " squin.cx(input_register[0], bell_register[0])\n", - " squin.h(input_register[0])\n", - "\n", - " mid_circuit_measurement = squin.broadcast.measure([input_register[0], bell_register[0]])\n", - " \n", - " # now we skip the correction step and return the bitwise OR of the measurement outcomes\n", - " return mid_circuit_measurement[0] | mid_circuit_measurement[1]\n", - "\n", - "show_circuit(teleport_postselect)" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -610,14 +595,33 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 11 + "source": [ + "@squin.kernel\n", + "def teleport_postselect() -> int:\n", + " # same code as before\n", + " input_register = psi()\n", + " bell_register = bell_state_prep()\n", + "\n", + " squin.cx(input_register[0], bell_register[0])\n", + " squin.h(input_register[0])\n", + "\n", + " mid_circuit_measurement = squin.broadcast.measure([input_register[0], bell_register[0]])\n", + " \n", + " # now we skip the correction step and return the bitwise OR of the measurement outcomes\n", + " return mid_circuit_measurement[0] | mid_circuit_measurement[1]\n", + "\n", + "show_circuit(teleport_postselect)" + ] }, { "cell_type": "markdown", @@ -631,6 +635,7 @@ }, { "cell_type": "code", + "execution_count": 11, "id": "b13d3103", "metadata": { "ExecuteTime": { @@ -638,6 +643,7 @@ "start_time": "2026-03-30T14:32:15.279329Z" } }, + "outputs": [], "source": [ "def estimate_postselected_rate_and_density_matrix(postselect_task, shots: int):\n", " successful_density_matrices = []\n", @@ -657,18 +663,19 @@ " postselection_rate = len(successful_density_matrices) / shots\n", " rho_postselected = np.mean(successful_density_matrices, axis=0)\n", " return postselection_rate, rho_postselected" - ], - "outputs": [], - "execution_count": 12 + ] }, { "cell_type": "markdown", "id": "fd3bd00c", "metadata": {}, - "source": "---\n" + "source": [ + "---\n" + ] }, { "cell_type": "code", + "execution_count": 12, "id": "aea717d6", "metadata": { "ExecuteTime": { @@ -676,6 +683,26 @@ "start_time": "2026-03-30T14:32:16.276091Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Postselection rate: 27.00%\n", + "Postselected shots: 54 out of 200\n", + "\n", + "Density matrix of psi:\n", + "[[0.8919109 +0.j 0.28350775-0.12660677j]\n", + " [0.28350775+0.12660677j 0.10808918+0.j ]]\n", + "\n", + "Density matrix of postselected psi_prime:\n", + "[[0.89191082+0.j 0.28350771-0.12660676j]\n", + " [0.28350771+0.12660676j 0.10808916-0.j ]]\n", + "\n", + "Do the two states match? True\n" + ] + } + ], "source": [ "postselect_simulator = StackMemorySimulator(min_qubits=3)\n", "postselect_task = postselect_simulator.task(teleport_postselect)\n", @@ -692,34 +719,15 @@ "print(rho_postselected)\n", "print()\n", "print(\"Do the two states match?\", np.allclose(rho_psi, rho_postselected))" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Postselection rate: 24.00%\n", - "Postselected shots: 48 out of 200\n", - "\n", - "Density matrix of psi:\n", - "[[0.89191084-0.j 0.28350771-0.12660677j]\n", - " [0.28350771+0.12660677j 0.10808916-0.j ]]\n", - "\n", - "Density matrix of postselected psi_prime:\n", - "[[0.89191084+0.j 0.28350772-0.12660676j]\n", - " [0.28350772+0.12660676j 0.10808917+0.j ]]\n", - "\n", - "Do the two states match? True\n" - ] - } - ], - "execution_count": 13 + ] }, { "cell_type": "markdown", "id": "61d4e75f", "metadata": {}, - "source": "---" + "source": [ + "---" + ] }, { "cell_type": "markdown", @@ -772,6 +780,7 @@ }, { "cell_type": "code", + "execution_count": 13, "id": "5e5a6dad", "metadata": { "ExecuteTime": { @@ -779,29 +788,12 @@ "start_time": "2026-03-30T14:32:18.878887Z" } }, - "source": [ - "def make_noisy_bell_state_prep(noise_probability: float):\n", - " @squin.kernel\n", - " def noisy_bell_state_prep() -> Register:\n", - " qubits = squin.qalloc(2)\n", - " squin.h(qubits[0])\n", - " squin.depolarize(p=noise_probability, qubit=qubits[0])\n", - " squin.cx(qubits[0], qubits[1])\n", - " squin.depolarize2(p=noise_probability, control=qubits[0], target=qubits[1])\n", - " return qubits\n", - " return noisy_bell_state_prep\n", - "\n", - "show_circuit(make_noisy_bell_state_prep(noise_probability=0.1))" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -829,14 +821,30 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 14 + "source": [ + "def make_noisy_bell_state_prep(noise_probability: float):\n", + " @squin.kernel\n", + " def noisy_bell_state_prep() -> Register:\n", + " qubits = squin.qalloc(2)\n", + " squin.h(qubits[0])\n", + " squin.depolarize(p=noise_probability, qubit=qubits[0])\n", + " squin.cx(qubits[0], qubits[1])\n", + " squin.depolarize2(p=noise_probability, control=qubits[0], target=qubits[1])\n", + " return qubits\n", + " return noisy_bell_state_prep\n", + "\n", + "show_circuit(make_noisy_bell_state_prep(noise_probability=0.1))" + ] }, { "cell_type": "markdown", @@ -848,6 +856,7 @@ }, { "cell_type": "code", + "execution_count": 14, "id": "7a5e5683", "metadata": { "ExecuteTime": { @@ -855,32 +864,12 @@ "start_time": "2026-03-30T14:32:19.912755Z" } }, - "source": [ - "def make_teleport_postselect_noisy(noise_probability: float):\n", - " noisy_bell_state_prep = make_noisy_bell_state_prep(noise_probability)\n", - " @squin.kernel\n", - " def teleport_postselect_noisy() -> int:\n", - " input_register = psi()\n", - " bell_register = noisy_bell_state_prep()\n", - " squin.cx(input_register[0], bell_register[0])\n", - " squin.h(input_register[0])\n", - "\n", - " measurement = squin.broadcast.measure([input_register[0], bell_register[0]])\n", - " return measurement[0] | measurement[1]\n", - " \n", - " return teleport_postselect_noisy\n", - "\n", - "show_circuit(make_teleport_postselect_noisy(noise_probability=0.1))\n" - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -928,14 +917,33 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 15 + "source": [ + "def make_teleport_postselect_noisy(noise_probability: float):\n", + " noisy_bell_state_prep = make_noisy_bell_state_prep(noise_probability)\n", + " @squin.kernel\n", + " def teleport_postselect_noisy() -> int:\n", + " input_register = psi()\n", + " bell_register = noisy_bell_state_prep()\n", + " squin.cx(input_register[0], bell_register[0])\n", + " squin.h(input_register[0])\n", + "\n", + " measurement = squin.broadcast.measure([input_register[0], bell_register[0]])\n", + " return measurement[0] | measurement[1]\n", + " \n", + " return teleport_postselect_noisy\n", + "\n", + "show_circuit(make_teleport_postselect_noisy(noise_probability=0.1))\n" + ] }, { "cell_type": "markdown", @@ -947,6 +955,7 @@ }, { "cell_type": "code", + "execution_count": 15, "id": "9e4fefe5", "metadata": { "ExecuteTime": { @@ -954,6 +963,15 @@ "start_time": "2026-03-30T14:32:42.670564Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overlap with psi: 94.34%\n" + ] + } + ], "source": [ "postselect_simulator = StackMemorySimulator(min_qubits=3)\n", "postselect_task = postselect_simulator.task(teleport_postselect)\n", @@ -971,17 +989,7 @@ "\n", "overlap = estimate_postselected_overlap(noise_probability=0.1, shots=200, rho=rho_psi)\n", "print(f\"Overlap with psi: {100 * overlap:.2f}%\")" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overlap with psi: 93.42%\n" - ] - } - ], - "execution_count": 17 + ] }, { "cell_type": "markdown", @@ -993,6 +1001,7 @@ }, { "cell_type": "code", + "execution_count": 16, "id": "55551b8d", "metadata": { "ExecuteTime": { @@ -1000,6 +1009,1603 @@ "start_time": "2026-03-30T14:32:44.298034Z" } }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-09T14:58:58.111705\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "noise_values = np.linspace(0.0, .5, 10)\n", "overlaps = []\n", @@ -1020,23 +2626,7 @@ "plt.grid(alpha=0.3)\n", "plt.legend()\n", "plt.show()" - ], - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/png": "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" - }, - "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } - } - ], - "execution_count": 18 + ] }, { "cell_type": "markdown", @@ -1071,6 +2661,7 @@ }, { "cell_type": "code", + "execution_count": 17, "id": "684348f9", "metadata": { "ExecuteTime": { @@ -1078,6 +2669,7 @@ "start_time": "2026-03-30T14:32:50.463808Z" } }, + "outputs": [], "source": [ "noise_model = noise.GeminiOneZoneNoiseModel()\n", "teleport_cirq = emit_circuit(teleport_postselect, ignore_returns=True) # the flag will ignore the return value of the original kernel\n", @@ -1100,9 +2692,7 @@ " register = noisy_teleport_squin(register) # we are loading the noisy kernel as a subroutine\n", " measurement = squin.broadcast.measure([register[0], register[1]])\n", " return measurement[0] | measurement[1]\n" - ], - "outputs": [], - "execution_count": 19 + ] }, { "cell_type": "markdown", @@ -1116,6 +2706,7 @@ }, { "cell_type": "code", + "execution_count": 18, "id": "ecc9fa28", "metadata": { "ExecuteTime": { @@ -1123,13 +2714,6 @@ "start_time": "2026-03-30T14:32:50.552728Z" } }, - "source": [ - "print(\"STEP 1: Emit Squin kernel to cirq\")\n", - "print(teleport_cirq)\n", - "print()\n", - "print(\"STEP 2: Transform circuit\")\n", - "print(noisy_teleport_cirq)" - ], "outputs": [ { "name": "stdout", @@ -1143,15 +2727,21 @@ "2: ────────────────X────────────────────────\n", "\n", "STEP 2: Transform circuit\n", - "0: ─────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────A(0.000515,0.000515,0.00218)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=0.213,z=0)────────A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000806,0.000806,0.00246)────@───A(II:0.993, IX:0.000227, IY:0.000227, IZ:0.00151, XI:0.000227, XX:0.000143, XY:0.000143, XZ:0.000143, YI:0.000227, YX:0.000143, YY:0.000143, YZ:0.000143, ZI:0.00151, ZX:0.000143, ZY:0.000143, ZZ:0.00143)───A(0.000806,0.000806,0.00246)────────────────────PhXZ(a=-0.634,x=0.5,z=-0.866)───A(0.00041,0.00041,0.000411)───────────────────────────────────────────BF(0)───────M───────\n", - " │ │ │\n", - "1: ───PhXZ(a=0.5,x=0.5,z=0)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000806,0.000806,0.00246)────@───A(II:0.993, IX:0.000227, IY:0.000227, IZ:0.00151, XI:0.000227, XX:0.000143, XY:0.000143, XZ:0.000143, YI:0.000227, YX:0.000143, YY:0.000143, YZ:0.000143, ZI:0.00151, ZX:0.000143, ZY:0.000143, ZZ:0.00143)───A(0.000806,0.000806,0.00246)────────────────────PhXZ(a=0.5,x=0.5,z=8.88e-16)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───@───(1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=0.5,z=0)───────────A(0.00041,0.00041,0.000411)───────────────────────────────────────────BF(0)───────M───────\n", - " │ │\n", - "2: ───PhXZ(a=0.5,x=0.5,z=0)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───@───(1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=0.5,z=-1.0)───────A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───────A(0.000515,0.000515,0.00218)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" + "0: ──────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────A(0.000515,0.000515,0.00218)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=-0.787,z=0)───────A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000806,0.000806,0.00246)────@───A(II:0.993, IX:0.000227, IY:0.000227, IZ:0.00151, XI:0.000227, XX:0.000143, XY:0.000143, XZ:0.000143, YI:0.000227, YX:0.000143, YY:0.000143, YZ:0.000143, ZI:0.00151, ZX:0.000143, ZY:0.000143, ZZ:0.00143)───A(0.000806,0.000806,0.00246)────────────────────PhXZ(a=-0.366,x=0.5,z=-0.134)───A(0.00041,0.00041,0.000411)───────────────────────────────────────────BF(0)───────M───────\n", + " │ │ │\n", + "1: ───PhXZ(a=0.5,x=-0.5,z=0)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000806,0.000806,0.00246)────@───A(II:0.993, IX:0.000227, IY:0.000227, IZ:0.00151, XI:0.000227, XX:0.000143, XY:0.000143, XZ:0.000143, YI:0.000227, YX:0.000143, YY:0.000143, YZ:0.000143, ZI:0.00151, ZX:0.000143, ZY:0.000143, ZZ:0.00143)───A(0.000806,0.000806,0.00246)────────────────────PhXZ(a=-0.5,x=0.5,z=-1)────────A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───@───(1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=0.5,z=-1)──────────A(0.00041,0.00041,0.000411)───────────────────────────────────────────BF(0)───────M───────\n", + " │ │\n", + "2: ───PhXZ(a=0.5,x=-0.5,z=0)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───@───(1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)───────────────────PhXZ(a=0.5,x=0.5,z=2.22e-16)───A(0.00041,0.00041,0.000411)───────────────────────────────────A(0.000307,0.000307,0.000464)───────A(0.000515,0.000515,0.00218)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────A(0.000307,0.000307,0.000464)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], - "execution_count": 20 + "source": [ + "print(\"STEP 1: Emit Squin kernel to cirq\")\n", + "print(teleport_cirq)\n", + "print()\n", + "print(\"STEP 2: Transform circuit\")\n", + "print(noisy_teleport_cirq)" + ] }, { "cell_type": "markdown", @@ -1171,7 +2761,9 @@ "cell_type": "markdown", "id": "af4f4f57", "metadata": {}, - "source": "---" + "source": [ + "---" + ] }, { "cell_type": "markdown", @@ -1185,6 +2777,7 @@ }, { "cell_type": "code", + "execution_count": 19, "id": "f4c32b8b", "metadata": { "ExecuteTime": { @@ -1192,6 +2785,16 @@ "start_time": "2026-03-30T14:32:51.237953Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Postselection rate: 22.00%\n", + "Overlap with psi: 96.29%\n" + ] + } + ], "source": [ "noisy_squin_simulator = StackMemorySimulator(min_qubits=3)\n", "noisy_squin_task = noisy_squin_simulator.task(one_zone_noisy_teleport)\n", @@ -1205,18 +2808,7 @@ "\n", "print(f\"Postselection rate: {100 * postselection_rate:.2f}%\")\n", "print(f\"Overlap with psi: {100 * overlap:.2f}%\")" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Postselection rate: 26.10%\n", - "Overlap with psi: 96.64%\n" - ] - } - ], - "execution_count": 21 + ] }, { "cell_type": "markdown", @@ -1240,6 +2832,7 @@ }, { "cell_type": "code", + "execution_count": 20, "id": "89445b60", "metadata": { "ExecuteTime": { @@ -1247,18 +2840,6 @@ "start_time": "2026-03-30T14:32:54.219866Z" } }, - "source": [ - "@squin.kernel\n", - "def heuristic_model_circuit():\n", - " qubits = squin.qalloc(4)\n", - " squin.phased_xz(-np.pi/4, np.pi/2, np.pi/4, qubits[2])\n", - " squin.cz(qubits[0], qubits[1])\n", - " squin.phased_xz(-np.pi/4, np.pi/2, np.pi/2, qubits[3]) # this gate is different from the previous one\n", - " squin.cz(qubits[1], qubits[2])\n", - "\n", - "cirq_heuristic_model_circuit = emit_circuit(heuristic_model_circuit)\n", - "print(cirq_heuristic_model_circuit)" - ], "outputs": [ { "name": "stdout", @@ -1272,7 +2853,18 @@ ] } ], - "execution_count": 22 + "source": [ + "@squin.kernel\n", + "def heuristic_model_circuit():\n", + " qubits = squin.qalloc(4)\n", + " squin.phased_xz(-np.pi/4, np.pi/2, np.pi/4, qubits[2])\n", + " squin.cz(qubits[0], qubits[1])\n", + " squin.phased_xz(-np.pi/4, np.pi/2, np.pi/2, qubits[3]) # this gate is different from the previous one\n", + " squin.cz(qubits[1], qubits[2])\n", + "\n", + "cirq_heuristic_model_circuit = emit_circuit(heuristic_model_circuit)\n", + "print(cirq_heuristic_model_circuit)" + ] }, { "cell_type": "markdown", @@ -1307,6 +2899,7 @@ }, { "cell_type": "code", + "execution_count": 21, "id": "7df12964", "metadata": { "ExecuteTime": { @@ -1314,14 +2907,6 @@ "start_time": "2026-03-30T14:32:55.448077Z" } }, - "source": [ - "print(\"Original circuit:\")\n", - "print(cirq_heuristic_model_circuit)\n", - "print()\n", - "noisy_cirq_circuit = noise.transform_circuit(cirq_heuristic_model_circuit, model=noise.GeminiOneZoneNoiseModel(),to_native_gateset=False)\n", - "print(\"Noisy circuit:\")\n", - "print(noisy_cirq_circuit)\n" - ], "outputs": [ { "name": "stdout", @@ -1343,7 +2928,14 @@ ] } ], - "execution_count": 23 + "source": [ + "print(\"Original circuit:\")\n", + "print(cirq_heuristic_model_circuit)\n", + "print()\n", + "noisy_cirq_circuit = noise.transform_circuit(cirq_heuristic_model_circuit, model=noise.GeminiOneZoneNoiseModel(),to_native_gateset=False)\n", + "print(\"Noisy circuit:\")\n", + "print(noisy_cirq_circuit)\n" + ] }, { "cell_type": "markdown", @@ -1400,6 +2992,7 @@ }, { "cell_type": "code", + "execution_count": 22, "id": "89dbe5a1", "metadata": { "ExecuteTime": { @@ -1407,14 +3000,6 @@ "start_time": "2026-03-30T14:32:56.986302Z" } }, - "source": [ - "print(\"Original circuit:\")\n", - "print(cirq_heuristic_model_circuit)\n", - "print()\n", - "noisy_cirq_circuit = noise.transform_circuit(cirq_heuristic_model_circuit, model=noise.GeminiTwoZoneNoiseModel(),to_native_gateset=False)\n", - "print(\"Noisy circuit:\")\n", - "print(noisy_cirq_circuit)\n" - ], "outputs": [ { "name": "stdout", @@ -1436,7 +3021,14 @@ ] } ], - "execution_count": 24 + "source": [ + "print(\"Original circuit:\")\n", + "print(cirq_heuristic_model_circuit)\n", + "print()\n", + "noisy_cirq_circuit = noise.transform_circuit(cirq_heuristic_model_circuit, model=noise.GeminiTwoZoneNoiseModel(),to_native_gateset=False)\n", + "print(\"Noisy circuit:\")\n", + "print(noisy_cirq_circuit)\n" + ] }, { "cell_type": "markdown", @@ -1471,6 +3063,7 @@ }, { "cell_type": "code", + "execution_count": 23, "id": "87a35f18", "metadata": { "ExecuteTime": { @@ -1478,38 +3071,12 @@ "start_time": "2026-03-30T14:32:58.747049Z" } }, - "source": [ - "def make_ghz_circuit(n_qubits: int):\n", - " layers = int(np.floor(np.log2(n_qubits)))\n", - " qubits_entangled_in_parallel = 2**layers\n", - " sequential_qubits = n_qubits - qubits_entangled_in_parallel\n", - " @squin.kernel\n", - " def ghz_circuit():\n", - " qubits = squin.qalloc(n_qubits)\n", - " \n", - " squin.h(qubits[0])\n", - " for layer in range(layers):\n", - " offset = 2**layer\n", - " for index in range(offset):\n", - " squin.cx(qubits[index], qubits[index + offset])\n", - " for extra_index in range(sequential_qubits):\n", - " squin.cx(qubits[0 + extra_index], qubits[2**layers + extra_index])\n", - " return qubits\n", - " return ghz_circuit\n", - "\n", - "ghz_circuit = make_ghz_circuit(n_qubits=6)\n", - "show_circuit(ghz_circuit)\n", - " " - ], "outputs": [ { "data": { - "text/plain": [ - "" - ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", " \n", "\n", @@ -1552,14 +3119,39 @@ "
\n", "
\n", " " + ], + "text/plain": [ + "" ] }, - "execution_count": 25, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 25 + "source": [ + "def make_ghz_circuit(n_qubits: int):\n", + " layers = int(np.floor(np.log2(n_qubits)))\n", + " qubits_entangled_in_parallel = 2**layers\n", + " sequential_qubits = n_qubits - qubits_entangled_in_parallel\n", + " @squin.kernel\n", + " def ghz_circuit():\n", + " qubits = squin.qalloc(n_qubits)\n", + " \n", + " squin.h(qubits[0])\n", + " for layer in range(layers):\n", + " offset = 2**layer\n", + " for index in range(offset):\n", + " squin.cx(qubits[index], qubits[index + offset])\n", + " for extra_index in range(sequential_qubits):\n", + " squin.cx(qubits[0 + extra_index], qubits[2**layers + extra_index])\n", + " return qubits\n", + " return ghz_circuit\n", + "\n", + "ghz_circuit = make_ghz_circuit(n_qubits=6)\n", + "show_circuit(ghz_circuit)\n", + " " + ] }, { "cell_type": "markdown", @@ -1573,6 +3165,7 @@ }, { "cell_type": "code", + "execution_count": 24, "id": "e4c3395b", "metadata": { "ExecuteTime": { @@ -1580,6 +3173,7 @@ "start_time": "2026-03-30T14:33:00.130241Z" } }, + "outputs": [], "source": [ "def make_noisy_ghz_circuit(n_qubits: int, noise_model):\n", " ghz_circuit = make_ghz_circuit(n_qubits)\n", @@ -1597,9 +3191,7 @@ "# TSIM has to support PhasedXZ gates\n", "noisy_ghz_circuit = make_noisy_ghz_circuit(n_qubits=4, noise_model=noise.GeminiOneZoneNoiseModel())\n", "# show_circuit(noisy_ghz_circuit)" - ], - "outputs": [], - "execution_count": 26 + ] }, { "cell_type": "markdown", @@ -1613,6 +3205,7 @@ }, { "cell_type": "code", + "execution_count": 25, "id": "d0f54638", "metadata": { "ExecuteTime": { @@ -1620,6 +3213,7 @@ "start_time": "2026-03-30T14:33:01.259457Z" } }, + "outputs": [], "source": [ "def estimate_ghz_overlap(n_qubits: int, noise_model, shots: int):\n", " noisy_ghz_simulator = StackMemorySimulator(min_qubits=n_qubits)\n", @@ -1641,9 +3235,7 @@ " # we are using einsum to compute the trace of the product of the two density matrices\n", " overlap = float(np.clip(np.einsum(\"ij,ji->\", noiseless_ghz_rho, noisy_ghz_rho, optimize=True).real, 0.0, 1.0))\n", " return overlap" - ], - "outputs": [], - "execution_count": 27 + ] }, { "cell_type": "markdown", @@ -1659,6 +3251,7 @@ }, { "cell_type": "code", + "execution_count": 26, "id": "c1809457", "metadata": { "ExecuteTime": { @@ -1666,6 +3259,16 @@ "start_time": "2026-03-30T14:33:02.434728Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Noisy GHZ state preparation (8 qubits) overlap with ideal state: 88.50%\n", + "Noisy GHZ state preparation (8 qubits) overlap with ideal state (no move noise): 87.00%\n" + ] + } + ], "source": [ "one_noise_model = noise.GeminiOneZoneNoiseModel()\n", "one_noise_model_no_moves = noise.GeminiOneZoneNoiseModel(\n", @@ -1683,18 +3286,7 @@ "\n", "print(f\"Noisy GHZ state preparation ({number_of_qubits} qubits) overlap with ideal state: {100 * overlap:.2f}%\")\n", "print(f\"Noisy GHZ state preparation ({number_of_qubits} qubits) overlap with ideal state (no move noise): {100 * overlap_no_moves:.2f}%\")" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Noisy GHZ state preparation (8 qubits) overlap with ideal state: 84.00%\n", - "Noisy GHZ state preparation (8 qubits) overlap with ideal state (no move noise): 92.50%\n" - ] - } - ], - "execution_count": 28 + ] }, { "cell_type": "markdown", @@ -1710,6 +3302,7 @@ }, { "cell_type": "code", + "execution_count": 27, "id": "4e7d8912", "metadata": { "ExecuteTime": { @@ -1717,6 +3310,1449 @@ "start_time": "2026-03-30T14:33:05.510520Z" } }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-05-09T15:02:00.161097\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.8, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "qubit_numbers = np.arange(4, 11, 1)\n", "fidelities = []\n", @@ -1739,23 +4775,7 @@ "plt.grid(alpha=0.3)\n", "plt.legend()\n", "plt.show()" - ], - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/png": "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" - }, - "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } - } - ], - "execution_count": 29 + ] }, { "cell_type": "markdown", @@ -1781,7 +4801,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "eth-quantum-hackathon-2026-challenge (3.12.13)", "language": "python", "name": "python3" }, @@ -1795,7 +4815,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.13" } }, "nbformat": 4, diff --git "a/Computaci\303\263n_cu\303\241ntica (1).pdf" "b/Computaci\303\263n_cu\303\241ntica (1).pdf" new file mode 100644 index 0000000..b2ffe48 Binary files /dev/null and "b/Computaci\303\263n_cu\303\241ntica (1).pdf" differ