{ "cells": [ { "cell_type": "markdown", "id": "6cf1c4f8", "metadata": {}, "source": [ "# ErrorChannelV0" ] }, { "cell_type": "markdown", "id": "ccb1c6a5", "metadata": {}, "source": [ "![image](../images/error_channelv0.png)" ] }, { "cell_type": "markdown", "id": "8d4c9259", "metadata": {}, "source": [ "## Description\n", "\n", "The **ErrorChannelV0** environment simulates a **multi-qubit noisy quantum system** where different qubits\n", "may be subject to error channels (bitflip errors) with varying probabilities. It is based on the `QuantumEnv` base class. \n", "The agent's task is to identify and apply corrective single-qubit gates to mitigate the effects of these noise processes and restore the system state\n", "to the computational basis state **|0...0⟩**.\n", "\n", "This environment models the challenge of **quantum error mitigation/correction** in the presence of **Bit-flip errors**.\n", "\n", "The agent interacts by applying X gate to specific qubits. Rewards are based\n", "on the probability that the corrected quantum state has returned to the target basis state.\n", "\n", "The environment includes a rendering mode that provides a **bar plot animation** comparing the noisy,\n", "corrected, and ideal probability distributions, along with the evolving circuit diagram.\n" ] }, { "cell_type": "markdown", "id": "c4d10643", "metadata": {}, "source": [ "## Action Space\n", "\n", "The action space is a **Discrete( [n_qubits] )** space, meaning the agent chooses:\n", "\n", "1. A **target qubit**: index in `[0, n_qubits-1]` to apply the PauliX correction on.\n", "\n", "Example (for 3 qubits): \n", "- `0` → Apply `X` gate on qubit 0 \n", "- `2` → Apply `X` gate on qubit 2 \n" ] }, { "cell_type": "markdown", "id": "9174d2e4", "metadata": {}, "source": [ "## Observation Space\n", "\n", "The observation is a probability distribution over all computational basis states\n", "of the `n_qubits` system:\n", "\n", "obs $\\in [0, 1]^{2^{n_{qubits}}}$\n", "\n", "with the constraint:\n", "\n", "$\\sum_{i} obs_i = 1$\n", "\n", "For example, with 3 qubits, the observation is a length-8 vector:\n", "\n", "| Index | Basis State | Probability |\n", "|-------|-------------|-------------|\n", "| 0 | \\|000> | [0, 1] |\n", "| 1 | \\|001> | [0, 1] |\n", "| ... | ... | ... |\n", "| 7 | \\|111> | [0, 1] |\n" ] }, { "cell_type": "markdown", "id": "f284396f", "metadata": {}, "source": [ "## Rewards\n", "\n", "The reward is the mean squared error between the target state and the corrected state multiplied by -1:\n", "\n", "reward = -MSE(|0...0⟩, |corrected_state⟩)\n", "\n", "- Maximum reward = 0.0 (perfect correction). \n", "- Minimum reward = -(2/2**num_qubits) (highly corrupted)." ] }, { "cell_type": "markdown", "id": "ccbc113e", "metadata": {}, "source": [ "## Starting State\n", "\n", "At the start of each episode:\n", "- A set of **faulty qubits** is defined to apply bit flip errors with varying probabilities. \n", "(If not specified, a random qubit is chosen.)\n", "- The agent begins with no corrections applied.\n", "\n", "The first observation is the noisy probability distribution before any corrections.\n" ] }, { "cell_type": "markdown", "id": "e35f1a61", "metadata": {}, "source": [ "## Episode End\n", "\n", "The episode ends if one of the following occurs:\n", "\n", "1. **Termination**: \n", "The obtained reward is 0.0.\n", "2. **Truncation**: \n", "The system reaches the maximum number of steps (`max_steps`, default=10)" ] }, { "cell_type": "markdown", "id": "e3c2ca8f", "metadata": {}, "source": [ "## Rendering\n", "\n", "The rendering shows a **side-by-side animation** with:\n", "\n", "1. **Left panel**: Bar chart of probabilities for each basis state: \n", "- Gray = Ideal noiseless target (|0...0⟩) \n", "- Orange = Noisy distribution \n", "- Blue = Corrected distribution \n", "\n", "The chart title updates with **step number, chosen correction, and reward**.\n", "\n", "2. **Right panel**: A dynamically drawn ASCII-style **quantum circuit** reflecting\n", "the applied corrections.\n", "\n", "The animation can be displayed interactively or saved as an MP4 file.\n" ] }, { "cell_type": "markdown", "id": "6757f2c9", "metadata": {}, "source": [ "## Arguments\n", "\n", "- **`n_qubits`** (`int`, default=3): Number of qubits in the system. \n", "- **`faulty_qubits`** (`dict`, optional): Mapping of faulty qubit indices to their noise probabilities. \n", "- **`max_steps`** (`int`, default=10): Maximum number of agent actions per episode. \n", "- **`seed`** (`int`, optional): Random seed for reproducibility. \n", "- **`ffmpeg`** (`bool`, default=False): If `True`, uses FFmpeg for saving animations; otherwise uses Pillow (GIF)." ] }, { "cell_type": "code", "execution_count": 1, "id": "253e93a6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "step=1 act=0 reward=-0.250 errors={0: 1.0, 2: 1.0}\n", "step=2 act=1 reward=-0.250 errors={0: 1.0, 2: 1.0}\n", "step=3 act=2 reward=-0.250 errors={0: 1.0, 2: 1.0}\n", "step=4 act=0 reward=-0.250 errors={0: 1.0, 2: 1.0}\n", "step=5 act=1 reward=-0.250 errors={0: 1.0, 2: 1.0}\n", "step=6 act=0 reward=-0.000 errors={0: 1.0, 2: 1.0}\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABK4AAAH7CAYAAADl4decAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB39klEQVR4nO3dd3xO9///8eeVyJaIFTEiMWpVapYaKW2jQSg6KB81i36sEqOlKrF12KvVlpR+lapRiigqqqU1Squ2GlG1YiRmQnL9/vDL9XFJkHEl1yGP++2W2y3X+7zPOa/3dY648sw572Mym81mAQAAAAAAAAbjYO8CAAAAAAAAgLQQXAEAAAAAAMCQCK4AAAAAAABgSARXAAAAAAAAMCSCKwAAAAAAABgSwRUAAAAAAAAMieAKAAAAAAAAhkRwBQAAAAAAAEMiuAIAAAAAAIAhEVwBj7Hjx4/LZDIpOjraLvsPCAhQs2bNHtovOjo6S3WmjDPl69tvv83Udry9vS3b6N2790P7d+rUSQ0bNszUvh51WT1mAADA+AICAtSpU6cc32/KZ7vIyMgc3zcA4yG4Qq60Z88evfrqq/L395erq6uKFy+uRo0aadq0aVb9xo4dq+XLl9unyLv8/vvveumll1SgQAG5u7urcuXKmjp1qr3LylYLFizQ5MmTM7RO9+7dNX/+fNWqVcuqPSEhQe+8846KFSsmNzc31a5dW+vWrUu1/uzZszV//vyslA0b27Jli+rXry93d3f5+vqqb9++unr1arrX/+KLL1SxYkW5urrqiSeeSPVvPMWpU6fUunVreXt7y8vLSy1atNDRo0eztE0AAIzs77//Vo8ePVS6dGm5urrKy8tL9erV05QpU3Tjxg17l5fK6tWrFRERYe8yANhBHnsXAOS0LVu26LnnnlPJkiXVrVs3+fr66uTJk/r11181ZcoU9enTx9J37NixevXVV9WyZUu71fvDDz+oefPmqlatmt5//33lzZtXf//9t/755x+71WRrzz77rG7cuCFnZ2dL24IFC/TXX3+pX79+6d5OnTp11L59+1TtnTp10rfffqt+/frpiSeeUGRkpJo2baqNGzeqfv36ln6tW7eWJL3xxhuZHwxsZvfu3XrhhRdUsWJFTZw4Uf/8848+/vhjHT58WGvWrHno+p9++qneeustvfLKKwoLC9PmzZvVt29fXb9+Xe+8846l39WrV/Xcc88pLi5OQ4cOlZOTkyZNmqQGDRpo9+7dKliwYIa3CQCAka1atUqvvfaaXFxc1KFDB1WuXFmJiYn6+eefNWjQIO3du1ezZ8/WwYMH5eCQ89c6+Pv768aNG3JycrK0rV69WjNmzCC8AnIhgivkOmPGjFG+fPm0fft2eXt7Wy07d+6cfYq6j/j4eHXo0EGhoaH69ttv7fLBISc4ODjI1dU1W7a9bds2LVy4UB999JEGDhwoSZYPaIMHD9aWLVuyZb8Pc+3aNXl4eNhl3+lhNpt18+ZNubm52a2GoUOHKn/+/IqOjpaXl5ekO7csdOvWTT/88INefPHF+65748YNvffee5Z/O5LUrVs3JScna9SoUerevbvy588vSZo5c6YOHz6sbdu26emnn5YkNWnSRJUrV9aECRM0duzYDG8TAACjOnbsmF5//XX5+/vrxx9/VNGiRS3LevXqpSNHjmjVqlWSJBcXl4duLzs+05hMpmz7bAjg0fN4/hYMPMDff/+tJ598MlVoJUk+Pj6W700mk65du6Yvv/zSMu/R3ff4nzp1Sl26dFGRIkXk4uKiJ598UnPmzLHaXso8QIsWLdLQoUPl6+srDw8PvfTSSzp58uRDa12wYIHOnj2rMWPGyMHBQdeuXVNycnKmx/4gZrNZo0ePVokSJeTu7q7nnntOe/fuTTW3QUREhEwmU6r1IyMjZTKZdPz48VTLfvjhB1WtWlWurq6qVKmSli5darX83vmSGjZsqFWrVunEiROW9z4gICBT4/r222/l6Oio7t27W9pcXV3VtWtXbd26NV3HIatS3ptNmzapZ8+e8vHxUYkSJSzL16xZo6CgIHl4eMjT01OhoaHau3evZfmKFStkMpn0559/WtqWLFkik8mkl19+2WpfFStWVJs2bSyv586dq+eff14+Pj5ycXFRpUqVNGvWrFQ1psxHtnbtWtWsWVNubm769NNPJUn//POPWrZsKQ8PD/n4+Kh///5KSEiw2fuTlvj4eK1bt07t27e3hFbSndAxb968+uabbx64/saNG3XhwgX17NnTqr1Xr166du2a5QO5dOccefrppy2hlSRVqFBBL7zwgtV+MrJNAACM6sMPP9TVq1f1xRdfWIVWKcqWLau3335bUuo5rtLzmaZBgwby9PSUl5eXnn76aS1YsMCy/H5zZjVs2NBq3tB757jq1KmTZsyYIUlW85oCyB244gq5jr+/v7Zu3aq//vpLlStXvm+/+fPn680331StWrUsoUeZMmUkSWfPntUzzzxjmcS7cOHCWrNmjbp27ar4+PhUt7eNGTNGJpNJ77zzjs6dO6fJkycrODhYu3fvfuAVLevXr5eXl5dOnTqlli1b6tChQ/Lw8NAbb7yhSZMm2fQvUcOHD9fo0aPVtGlTNW3aVL///rtefPFFJSYmZmm7hw8fVps2bfTWW2+pY8eOmjt3rl577TVFRUWpUaNGaa7z3nvvKS4uTv/8848mTZokScqbN2+m9r9r1y6VK1fOKvyQZJkHa/fu3fLz88vUtjOqZ8+eKly4sIYPH65r165JunOedezYUSEhIfrggw90/fp1zZo1S/Xr19euXbsUEBCg+vXry2Qy6aefftJTTz0lSdq8ebMcHBz0888/W7Z//vx5HThwwGpi+VmzZunJJ5/USy+9pDx58mjlypXq2bOnkpOT1atXL6v6Dh48qLZt26pHjx7q1q2bypcvrxs3buiFF15QTEyM+vbtq2LFimn+/Pn68ccfU43v+vXrun79+kPfB0dHx4dembRnzx7dvn1bNWvWtGp3dnZW1apVtWvXrgeun7L83vVr1KghBwcH7dq1S+3bt1dycrL+/PNPdenSJdU2atWqpR9++EFXrlyRp6dnurcJAICRrVy5UqVLl1bdunUzvY20PtNERkaqS5cuevLJJzVkyBB5e3tr165dioqKUrt27bJUc48ePfTvv/9q3bp1zEcK5EIEV8h1Bg4cqCZNmqhq1aqqVauWgoKC9MILL+i5556zuo++ffv2euutt1S6dOlUv4y+9957SkpK0p49eyzz37z11ltq27atIiIi1KNHD6tA6uLFi9q/f788PT0lSdWrV1fr1q312WefqW/fvvet9fDhw7p9+7ZatGihrl27aty4cYqOjta0adN0+fJlff311zZ5T86fP68PP/xQoaGhWrlypeUvWO+9957lNqnMOnTokJYsWWK5Mqhr166qUKGC3nnnnfsGV40aNVLx4sV16dKlLAcBp0+fTvOviSlt//77b5a2nxEFChTQhg0b5OjoKOnO3Ep9+/bVm2++qdmzZ1v6dezYUeXLl9fYsWM1e/ZsFShQQJUqVdLmzZstodTmzZv1yiuvaPHixTpw4IAqVKhgCbGCgoIs29q0aZPVudi7d281btxYEydOTBVcHTlyRFFRUQoJCbG0TZkyRYcOHdI333yj1157TdKd2+OqVKmSanwffvihRowY8dD3wd/fP80r8+52+vRpSbrvsdu8efND13d0dLS6ilK6E3wVLFjQctwvXryohISEh54j5cuXT/c2AQAwqvj4eJ06dUotWrTI0nbu/UwTFxenvn37qlatWoqOjrb646rZbM7SvqQ785iWK1fOcjU2gNyFWwWR6zRq1Ehbt27VSy+9pD/++EMffvihQkJCVLx4ca1YseKh65vNZi1ZskTNmzeX2WxWbGys5SskJERxcXH6/fffrdbp0KGDJbSSpFdffVVFixbV6tWrH7ivq1ev6vr16+rQoYOmTp2ql19+WVOnTlWPHj20cOFCHT58OHNvwj3Wr1+vxMRE9enTx+qy64xMjH4/xYoVU6tWrSyvvby81KFDB+3atUtnzpzJ8vYf5saNG2nOz5DygSonn5rTrVs3ywc8SVq3bp0uX76stm3bWp1Hjo6Oql27tjZu3GjpGxQUZAlrrly5oj/++EPdu3dXoUKFLO2bN2+Wt7e31ZWEd4dWcXFxio2NVYMGDXT06FHFxcVZ1VeqVCmr0Eq6MxFq0aJF9eqrr1ra3N3drW69TNGhQwetW7fuoV//93//99D3KuW43O/YPey43TvZ//3Wf9h+7u6T3m0CAGBU8fHxkmT1uTQz0vpMc+XKFb377rup7gjglj4AWcUVV8iVnn76aS1dulSJiYn6448/tGzZMk2aNEmvvvqqdu/erUqVKt133fPnz+vy5cuaPXu21VUyd7t3kvcnnnjC6rXJZFLZsmUfetVJSujQtm1bq/Z27drp008/1datW1NtOzNOnDiRZp2FCxfO8mTTZcuWTfWBpVy5cpLuzF/g6+ubpe0/jJubW5rzMd28edOyPKeUKlXK6nVK8Pj888+n2f/u2xuDgoL0ySef6MiRI/r7779lMplUp04dS6DVrVs3bd68WfXq1bOaxP+XX35ReHi4tm7dmuo2vri4OOXLl+++9Ul3zo20jmH58uVT9S1durRKly59v+GnKS4uzirwcXZ2VoECBSzH5X7H7mHHzc3N7b63ud69/sP2c3ef9G4TAACjSvlsceXKlSxt597PDH///bckPXAaDgDILIIr5GrOzs6WSZnLlSunzp07a/HixQoPD7/vOimTo7dv314dO3ZMs0/KPERZVaxYMe3du1dFihSxak+5VenSpUs22U9G3O+vZklJSTlcSfoULVpUp06dStWecitasWLFcqyWe4ONlHNp/vz5aQZ4efL870d0/fr1JUk//fSTjh49qurVq8vDw0NBQUGaOnWqrl69ql27dmnMmDGWdf7++2+98MILqlChgiZOnCg/Pz85Oztr9erVmjRpUqqJ/rMavFy9elVXr159aD9HR0cVLlxYkvT222/ryy+/tCxr0KCBoqOjLbfppRynu50+ffqhx61o0aJKSkrSuXPnrG7tS0xM1IULFyzrFyhQQC4uLvfdj/S/cyS92wQAwKi8vLxUrFgx/fXXX1naTmY/Mzzoc+TdV3ABwN0IroD/L2XC5bt/gU3rP9fChQvL09NTSUlJCg4OTte2772lz2w268iRIw8NuGrUqKF169bp1KlTVle4pMylk/LLf1b5+/tb6rz7ipnz58+nCsdSrsC6fPmy1ZMZU67auteRI0dkNput3stDhw5J0gOfFGiry8qrVq2qjRs3Kj4+3uoKpt9++82y3F5SJvv38fF56LlUsmRJlSxZUps3b9bRo0ct81g9++yzCgsL0+LFi5WUlKRnn33Wss7KlSuVkJCgFStWqGTJkpb2u29BfBh/f3/99ddfqY7hwYMHU/X9+OOPMzzH1eDBg63mqkg5vypXrqw8efJox44dat26tWV5YmKidu/ebdWWlpTjumPHDjVt2tTSvmPHDiUnJ1uWOzg4KDAwUDt27Ei1jd9++02lS5e23E6R3m0CAGBkzZo10+zZs7V161bVqVPHJttM+Uzz119/qWzZsvftlz9/fl2+fDlV+4kTJx561Ta3HAK5F3NcIdfZuHFjmpNEpsw3dXdA5OHhkeo/V0dHR73yyitasmRJmn+tOn/+fKq2efPmWV2S/e233+r06dNq0qTJA2tN+eX8iy++sGr//PPPlSdPHqvHBmdFcHCwnJycNG3aNKv3ZvLkyan6pnww+emnnyxt165ds7pq5m7//vuvli1bZnkdHx+vefPmqWrVqg+8TdDDwyPVHEyZ8eqrryopKcnqts6EhATNnTtXtWvXzrEnCqYlJCREXl5eGjt2rG7dupVq+b3nUlBQkH788Udt27bNElxVrVpVnp6eGj9+vNzc3FSjRg1L/5S/XN59TOPi4jR37tx0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kyZMmKBdu3ZpwYIFOnbsmKZPn66BAweqTJky9i4PjyjOq8eHg4ODGjZsKEk6fvy41TKTyaSIiAgtX75cgYGBcnV1VZkyZbR69WpLn3379qlp06by9PSUp6enQkNDdeDAgTT3deDAAdWvX19ubm6qWLGili5dmqrP/v371aJFC/n4+MjDw0OVK1dWRESErYYLG0j35Ox//vmn5fu+ffvq7bff1pEjR/TMM89Ikn799VfNmDFD48ePt32VAAAAAFIxmUySZLkCxShCQ0MVEhKiYcOGqXr16vL19dXQoUPtXRYecZxXj4+///5b0p3bQO+1bds2TZkyRd27d1epUqW0a9cuS8B17tw5NWjQQCaTyXLsJ06cqAYNGmjv3r0qVKiQ1bbeeOMNtWjRQm3atNG8efPUunVrbdq0SfXq1ZMkJSYmqkmTJkpMTFRYWJgKFCiggwcPasWKFYRXBpLu4Kpq1aoymUxW/ykOHjw4Vb927dqpTZs2tqkOAAAAwCNp4sSJqlKlio4fP67FixfL3d3d3iXhMcB59WiKi4tTbGys4uLitHjxYi1fvlyVK1dW+fLlU/Vdu3atduzYoWrVqlnakpKSJEkzZ85UbGystmzZojp16kiSgoKCFBQUpJkzZ2r48OFW22revLk+//xzSVLHjh1VsmRJjRs3zjKZ//79+3XixAl99tlnevPNNy3r3b5927ZvALIk3cHVsWPHsrMOAAAAABmU1i996RUfH685c+akq5+rq6ucnZ0f2rddu3by8fGRJBUqVEhubm66cuWKSpcunW37pd/j3U/ivMpKv5s3b+rQoUNycPjfLEG//vqratas+cD1Mmr79u1WwY90Z0L2FMHBwVbLgoODNWvWrDS31ahRI6vQSpJlfu3o6GiVLl3aElpJUv369VWqVClFR0enCq7uvqjGy8tLTZo00apVqyxtHh4ekqRffvlFHTp0sLyfefKkOypBDkj30fD398/OOgAAAABk0P3mdUmPixcv2nwS+Pr161sChnfffVdJSUkqX768BgwYoI0bN2bbfvF447zKGg8PD5UtW9by+uLFizbfx8WLF7Vjxw6rths3bli+nzFjhsqVKydPT08FBASoSJEi991WhQoV7rvs9OnTKlmyZKr2kiVL6tSpU6naS5Qoker1lStXdOXKFXl6eqps2bLq3r27Zs+eraVLl6pevXp6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s0NW/q0b+bg/jC3/rT9qxzw90vv+PI5jT69bt27p1KlTCggIsHcpAAAAsDGCKzurU6eOLl++rJ07d1rafvzxRyUnJ6t27dqWPj/99JNu3bpl6bNu3TqVL19e+fPnt/TZsGGD1bbXrVunOnXqWLWtWLFCL730UnYNJ91sNe70WrFihZo2bao8efLYZgBZkJ6xp3c76T3mj9vY02vlypWqXbu2ChUqZPNtZ4c6depoz549VuHeunXr5OXlpUqVKln6PGrH/WHSM+70etSOeXqk92fh4zj29Nq0aZM8PT1VvXp1e5cCAAAAGyO4srOKFSuqcePG6tatm7Zt26ZffvlFvXv31uuvv65ixYpJktq1aydnZ2d17dpVe/fu1aJFizRlyhSFhYVZtvP2228rKipKEyZM0IEDBxQREaEdO3aod+/elj63b9/W6tWr1aJFixwf571sNe7ExETt3r1bu3fvVmJiok6dOqXdu3fryJEjVvtbsWKFIcYtpW/skrRv3z7t3r1bFy9eVFxcnGWcKd566y0dPXpUgwcP1oEDBzRz5kx988036t+/v9X+HsexS7K0Xb16VefPn9fu3bu1b98+qz5GGrskxcTEaPfu3YqJiVFSUpLVGCTpxRdfVKVKlfTGG2/ojz/+0Nq1azVs2DD16tVLLi4ukh7N426LcUuP5zGXpCNHjmj37t06c+aMbty4YfUzTUrfz0Lp8Ry7lL6fB0b5owwAAACygX0fapg73fvI8AsXLpjbtm1rzps3r9nLy8vcuXNn85UrV6zW+eOPP8z169c3u7i4mIsXL24eP358qu1+88035nLlypmdnZ3NTz75pHnVqlVWy3/88UdzsWLFzMnJydkyrofJjnEfO3bMLCnVV4MGDSx9jh49anZ2djbHx8dn5/AeKDNj9/f3T3Ns9263atWqZmdnZ3Pp0qXNc+fOtVr+OI89reV37+fatWtmNzc384EDB7JzeA9079g7duyYZt0bN2609Dl+/Li5SZMmZjc3N3OhQoXMAwYMMN+6dSvVdo183LNr3I/rMW/QoEGafY4dO2bp87CfhY/z2NPz88Df398cFRWVzSMEAACAPZjM5lw2S7cBREdHq1OnTjp+/HiO7rd///66fv26Pv300xzdbwp7jXvKlClavXq11q5dm6P7vRtjz/mxf/fddxo8eLAOHjyYo/u9W2497hxzxp6T/vjjDwUFBSk2NlbOzs45um8AAABkP24VzEVWrlyZK2+lyM23kDB2xp6b5NZxS4w9JCSE0AoAAOAxZfxZe2Ez9877lFvcO5F1bpKbx/7FF1/YuwS7ya3HPTcf89w89vfff9/eJQAAACAbccWVHQQEBKhfv372LiPH5dZxS4ydsecuuXXcEmPPrWMHAABA9mGOKwAAAAAAABgSV1wBAAAAAADAkAiuAAAAAAAAYEgEVwAAAAAAADAkgisAAAAAAAAYEsEVAAAAAAAADIngCgAAAAAAAIZEcAUAAAAAAABDIrgCAAAAAACAIf0/iILmdftT1eUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from qrl.env import ErrorChannelV0\n", "\n", "# set ffmpeg=True if you have ffmpeg installed to save as mp4, or ffmpeg=False to save as gif\n", "env = ErrorChannelV0(\n", " n_qubits=3,\n", " faulty_qubits={0: 1.0, 2: 1.0},\n", " max_steps=6,\n", " seed=42,\n", " ffmpeg=False\n", ")\n", "obs = env.reset()\n", "done = False\n", "while not done:\n", " action = env.action_space.sample()\n", " obs, reward, done, info = env.step(action)\n", " print(f\"step={len(env.corrections)} act={action} \"\n", " f\"reward={reward:.3f} errors={info['faulty_qubits']}\")\n", "env.render(save_path_without_extension=\"error_channelV0\", interval_ms=700)\n" ] } ], "metadata": { "kernelspec": { "display_name": "qrl_env (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 }