{
"cells": [
{
"cell_type": "markdown",
"id": "180029ee",
"metadata": {},
"source": [
"# Controlled\n",
"\n",
"The controlled protocol lets you request a *controlled* version of a bloq: a bloq that is only active based on the status of another quantum bit or register.\n",
"\n",
"A key feature of any program is the ability to do branching. That is, choosing what operations to do based on input. Controlled bloqs give the quantum programmer access to branching.\n",
"\n",
"In its simplest form, a control bit is specified as an (additional) input to a bloq and the bloq is active when the control input is in the $|1\\rangle$ state. Otherwise, the bloq's operation is not performed. Equivalently, the control bit toggles between the bloq and the `Identity` operation.\n",
"\n",
"Control bits can be in quantum superposition. The result is a wavefunction containaing simultaneous branches where the controlled operation was performed and not performed. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "344b415f",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from qualtran.drawing import show_bloq\n",
"from qualtran.bloqs.basic_gates import XGate\n",
"\n",
"x = XGate()\n",
"\n",
"show_bloq(x)\n",
"show_bloq(x.controlled())"
]
},
{
"cell_type": "markdown",
"id": "455f4c8a",
"metadata": {},
"source": [
"## Interface\n",
"\n",
"The method for accessing the controlled version of a bloq is calling `Bloq.controlled(ctrl_spec)`. `ctrl_spec` is an instance of `qualtran.CtrlSpec` which specifies the condition under which the bloq is active. \n",
"\n",
"`CtrlSpec` supports $|1\\rangle$-state individual control bits, as well as:\n",
" 1. 'negative' controls where the bloq is active if the input is |0>.\n",
" 2. integer-equality controls where an input of an arbitrary `QCDType` must match a compile-time control value.\n",
" 3. ndarrays of control values, where the bloq is active if **all** inputs are active.\n",
" 4. Multiple control registers, control values for each of which can be specified\n",
" using 1-3 above.\n",
"\n",
"For example:\n",
" \n",
" 1. `CtrlSpec(qdtypes=QUInt(4), cvs=0b0110)`: Ctrl for a single register, of type `QUInt(4)` and shape `()`, is active when the soquet of the input register takes value 6."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7f55acb5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from qualtran import CtrlSpec, QUInt, QBit\n",
"\n",
"ctrl_spec = CtrlSpec(qdtypes=QUInt(4), cvs=0b0110)\n",
"assert ctrl_spec.is_active(6)\n",
"cx = x.controlled(ctrl_spec=ctrl_spec)\n",
"show_bloq(cx, type='musical_score')"
]
},
{
"cell_type": "markdown",
"id": "95a4c968-dea5-4f8e-9752-68e13224bf4c",
"metadata": {},
"source": [
" 2. `CtrlSpec(cvs=[0, 1, 1, 0])`: Ctrl for a single register, of type `QBit()` and shape `(4,)`, is active when soquets of input register take values `[0, 1, 1, 0]`."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "4e2b1bb0-2e68-4f3e-a05c-0bfe7c822ab2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ctrl_spec = CtrlSpec(cvs=[0, 1, 1, 0])\n",
"assert ctrl_spec.is_active([0, 1, 1, 0])\n",
"cx = x.controlled(ctrl_spec=ctrl_spec)\n",
"show_bloq(cx, type='musical_score')"
]
},
{
"cell_type": "markdown",
"id": "a0c79e8f-991d-45a5-a628-6928b615bfc0",
"metadata": {},
"source": [
" 3. `CtrlSpec(qdtypes=[QBit(), QBit()], cvs=[[0, 1], [1, 0]]).is_active([0, 1], [1, 0])`:\n",
" Ctrl for 2 registers, each of type `QBit()` and shape `(2,)`, is active when the soquet for\n",
" each register takes values `[0, 1]` and `[1, 0]` respectively."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "dbbc994a-5a2d-42b7-998c-70a8b8b52f16",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATYAAAGuCAYAAAAaiSqHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAALGNJREFUeJzt3XtUVXXeP/A3HCQQxVtPcpFUCA+KeE6io2CkWd6F8VKPz2SOqTimppXmZazRtHHWKlejq/Keoq5pGlIfsCJUQmwcxEsKeVd00EDxiiCHu+d8fn/4cz9z4nDTAwe/vl9rnbXce3+/+3z26cObffberJxEREBEpBBnRxdARGRvDDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2CjeuPk5AQnJye0bNmyznM7dOigzc/Pz7d7baQ2Bhs9sKtXr2LGjBnw9/fHE088AT8/P0RGRiI5OVkbExMTg3PnzmnL8+bNQ4cOHVBYWGi1r8jISDz//POwWCwAgMOHD2P79u0NcyCkHAYbPZCLFy8iNDQUe/bswbJly3D8+HHs3LkTL7zwAqZPn66Na9myJZ566iltecmSJWjWrBlmzZqlrdu4cSNSUlIQExMDZ+d7Lflf//VfaN26dcMdECnFxdEF0KNp2rRpcHJywqFDh+Dh4aGtDw4OxsSJE6uc98QTT2Dz5s0ICwvD6NGj0aVLF7zzzjv4+OOPERAQ0BCl02OAwUZ1lpeXh507d2Lp0qVWoXZfTdfUQkND8cc//hHR0dEICAjAb37zG0ydOrWeqqXHEb+KUp2dP38eIoKgoKAH3sf7778PZ2dnHDx4EBs2bICTk5MdK6THHYON6kxEHnofSUlJuHr1KiwWCw4fPmyHqoj+D7+KUp0FBgbCyckJZ86ceaD5t2/fxuTJk/H+++9DRDBt2jT07dsXTz75pJ0rpccVz9iozlq3bo1BgwZh5cqVKCoqqrS9pufOZsyYAS8vLyxYsADvvfcefH19re6kEj0sBhs9kJUrV8JsNuM3v/kNtm/fjszMTJw+fRqffvopwsLCqpwXFxeHrVu3YvPmzXBxcYGLiws2b96M+Ph4PrdGdsNgowfi7++Po0eP4oUXXsDs2bPRtWtXDBgwAMnJyVi9erXNOTdv3sQbb7yBRYsWoWvXrtr6kJAQLFq0CNOmTcPNmzcb6hBIYU5ijyvBRDY4OTkhLi4OI0aMeKD5e/fuxQsvvIDbt28/0J9l0eOLwUb1xsnJCW5ubmjTpg1ycnLqNDc4OBj//ve/UVpaymCjOuNdUao3mZmZAACdTlfnud9//z0qKioAAJ6ennati9THMzYiUg5vHhCRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFy+L/fo3qVlZWFr776Crm5uQAAb29vvPrqq+jQoYNjCyOl8X+/R/Xi4MGD+Mtf/oJvv/0WzZo104IsKysLRUVFiIyMxIIFC9CrVy/HFkpK4ldRsrtt27bh+eefx4ULF7BmzRrk5ubi2LFjOHbsGK5evYo1a9bg/PnzeP7557Ft2zZHl0sK4hkb2VVKSgoGDhyI//7v/0ZMTAxcXV1tjisvL8frr7+OrVu3Yvfu3XjhhRcauFJSmTJnbCtWrMDVq1erHdOhQwdkZGQAADZu3IiQkBC4uLhgxYoVVuP69euHjh07YsmSJdq67777DkFBQQgMDMSoUaNw584dAMCFCxdgNBrh6uqq7RsAfvrpJwwZMgQAUFBQgClTpsDf3x96vR6hoaHYsWOHNnbv3r1wd3eH0WiE0WhEcHAw1q9fr22Pjo5GSkoKACA+Ph4HDhywqre4uBg9evRAYWEhAOCVV17B/v37a/Gp2ZfFYkF0dDQiIiKwadOmKkMNAFxdXbF582ZEREQgOjoaFoulASu1jT3k+B6yG1FE+/btJT093eY2s9ksZrPZakxGRoacOnVKxo0bJ8uXL7ca37dvX4mLi9OWCwsL5amnnpLTp0+LiMj06dPl3Xffrfb9FyxYIGvWrBGLxSLh4eEyffp0qaioEBGR9PR08fb2loSEBBERSUlJEYPBoM3Nzs4WV1dXuXPnTqVjGT9+fKV6P/roI1myZIm2nJ6eLhERETY/i/q0a9cuASCpqam1nvOvf/1LAMju3bvrsbLaYQ85vofs5ZEMtv3790ufPn2kW7duEhISIh988IE0adJEOnXqJAaDQdLT02XRokUyatQoGThwoHTu3FlycnJsNq6t/8i/bsqvv/5aBg0apC2fPHlSfH19reb8et9du3aV3NxcSUpKEl9fXykrK7Mav3LlSundu7eIVG7KkydPSqtWraSkpMSqnoSEBGnVqpX4+PiIwWCQ9evXi4iIv7+/nD9/3mr/QUFBcurUqRo/S3saPXq0dO3aVSwWS63nWCwWCQ4OltGjR9djZZWxhxpnD9nLI/e4R15eHkaMGIFt27YhIiICFosF+fn5iImJQWxsLIxGI4B7p9tpaWlIT09H27ZtH+o9f/nlF7Rv315b7tChA3Jzc3H37l24uFT+CDMzM+Hp6QkvLy9s2bIFoaGhlb6WhYWFYfbs2dry2bNnYTQaUV5ejgsXLuCzzz6Dm5ub1ZyhQ4ciKioKRqMRb7/9NgAgOzsbBQUFCAgIqLT/5ORkdO7cucrjKioqqvVnUBuHDh3Ca6+9Bicnp1rPcXJyQmRkJP7+97/bvR4PDw+b69lD9uuhxuqRC7a0tDTo9XpEREQAAJydndG6dWubY4cOHfrQDfkg4uLiMGLEiBrHubu7a//W6/Xa9ZWcnBz06dMHPXr0QPfu3avdR05Ojs1j9PLyQk5OTrVzmzVrVmONdeHi4oIWLVrUeV7Lli1x5coVu9cjVdwXYw9Ze5geaqyUuXlgi71+UJ5++mlcunRJW7548SK8vb1t/qYF7v2mv9+U3bt3x5EjR1BRUWE1Ji0tDeHh4Tbnt2vXDr169UJycnKNtTVt2hSlpaWV1peWllo1fUNwcnKCyWSq8zyTyVSns7yGxB5q2B6yl0cu2MLDw5GZmYl9+/YBuHcnLi8vD56enigoKKiX9xw8eDCOHj2KM2fOAABWrVqF//mf/7E5Njc3FyaTCYGBgQCA/v37w8/PD++88w7u3r0LAMjIyMDy5cuxdOlSm/soKCjAkSNHoNfrK2379XHq9Xpcv34dJSUlVuNOnz4Ng8FQ7XGZTCa7vvr3749du3ZV+5627Ny5Ey+++KLd66kKe8h+PdRoOfoi34NIS0uT8PBwCQkJEYPBIN98842sX79eAgMDrS78vvXWW1bz/vPibExMjPj6+krTpk2lRYsW4uvrK0ePHhWRyhd+RUR27Ngher1eAgIC5Le//a3k5+fb3Pfq1avlvffes9p2+/ZtiY6Olo4dO0rHjh3Fzc1Nfv75Z217SkqKuLm5icFgEIPBIEFBQbJw4UJt+3/Wc+jQIenSpYsYjUbtwu+oUaPku+++08abTCbx9fWVwsLCOn+2DyM+Pl4AaJ9jbRw5ckQAyI4dO+qxssrYQ42zh+zlkQy2+marKWtyvykHDRokhw8frnJcSUmJjB07VgYMGKDdsXpYBw8elGHDhmnLtn4wGkJFRYX4+vpKVFSUmM3mGsebzWaJiooSX19f7TEGVbCHHIvBZsPIkSMlKChIFi9eXOPY8+fPi8FgEB8fHzlx4kQDVGfbhg0btGeW1q5dKyaTySF1/O///q84OTnJjBkzqg03s9ksM2bMECcnpzoHwKOAPeRYDDayu9WrV4uTk5M8//zzEh8fL3fv3tW23b17V+Lj4yUiIkKcnJxkzZo1DqyUVMW/FaV6kZiYiCVLluDAgQPw8/PTLoSfO3cOOTk56N27NxYuXKj9yRCRPTHYqF799NNP2LhxI1avXg0AmDp1KiZOnIgePXo4uDJSGYON6l1RUZH2PJjJZKryLwKI7OWRe46NiKgmDDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNqo3586dw8yZM+Ht7a2t8/b2xsyZM3Hu3DkHVkaqcxIRcXQRpJbS0lJMnDgRX331FVxcXHD37l2r7ffXvfrqq9iwYQPc3NwcVCmpisFGdlVeXo7Bgwfjxx9/hMViqXass7Mz+vbti507d8LV1bWBKqTHAb+Kkl3NmjWrVqEGABaLBT/++CNmzZrVAJXR40SZYFuxYgWuXr1a7ZgOHTogIyMDALBx40aEhITAxcUFK1assBrXr18/dOzYEUuWLAEAmEwmDBo0CE8++SRatmxpNfbChQswGo1wdXXV9g0AP/30E4YMGQIAKCgowJQpU+Dv7w+9Xo/Q0FDs2LFDG7t37164u7vDaDTCaDQiODgY69ev17ZHR0cjJSUFABAfH48DBw5Y1VBcXIwePXqgsLAQAPDKK69g//791X9g9eDGjRtYu3ZtrULtPovFgrVr1+LmzZv1WFntsIcc30N2I4po3769pKen29xmNpvFbDZbjcnIyJBTp07JuHHjZPny5Vbj+/btK3FxcdpyaWmpJCcnS3p6urRo0aJW779gwQJZs2aNWCwWCQ8Pl+nTp0tFRYWIiKSnp4u3t7ckJCSIiEhKSooYDAZtbnZ2tri6usqdO3cqvc/48eMr1fvRRx/JkiVLtOX09HSJiIiwWWd9+vjjj8XZ2VkA1Onl7Owsy5Yta/B6f4095PgeshcXx8Tpw0lLS8OcOXNQWFgIEcHo0aNx5coVjBkzBu7u7ti0aRPi4+Nx/PhxmEwmZGdnIykpyWofBoMBwL3rPDV54okn0L9/f1y8eLHWNX7zzTdISkpCcnIyLl26hJSUFLi43Pu4jUYj3n//fXz44YcYOnRopbl37tyBh4cHmjRpAuDeb/+3334brq6u2n43bdqEN998E9HR0Vi7di12796tzTcajbhx4wZOnz6Nzp07V1ljUVFRrY+nNjZt2lSns7X7LBYLYmJiMHXqVLvW4+HhUeU29pB9eqixeuSCLS8vDyNGjMC2bdsQEREBi8WC/Px8xMTEIDY2FkajEcC90+20tDSkp6ejbdu2DVpjZmYmPD094eXlhS1btiA0NLTSxfGwsDDMnj1bWz579iyMRiPKy8tx4cIFfPbZZ5XuFg4dOhRRUVEwGo14++23AQDZ2dkoKChAQEBApf0nJydX25TNmjV7yCO1n1OnTtm9Hqnivhh7yH491Fg9csGWlpYGvV6PiIgIAPd+W7Zu3drm2KFDhzZ4QwJAXFwcRowYUeM4d3d37d96vV67vpKTk4M+ffqgR48e6N69e7X7yMnJsXmMXl5eyMnJqVPdjwv2kDUVe+iRC7a6cNQZSXx8PDZv3gwA6N69Oz799FNUVFRoXwuAez9c4eHhNue3a9cOvXr1QnJyco1N2bRpU5SWllZaX1paihYtWlQ712Qy1XQodRISEoKsrKwHmuvv749jx47ZtR57YA9V30ON1SN3VzQ8PByZmZnYt28fgHvXZ/Ly8uDp6YmCggIHVwfk5ubCZDIhMDAQANC/f3/4+fnhnXfe0R5UzcjIwPLly7F06VKb+ygoKMCRI0eg1+srbfv1cer1ely/fh0lJSVW406fPq1dA6qKh4eHXV9jxoyBTqer0+cFADqdDmPGjLF7PVVhD9mvhxqrRy7YWrVqhbi4OMyfPx/dunVD9+7dkZqaipkzZ2Ly5MkwGo1Wt8yrsmnTJrRr1w5bt27FBx98gHbt2iE9Pb3K8d26dUNYWBju3LmDdu3aYdy4cTbH7dixA1FRUdqys7MzEhMTUVZWhk6dOsHf3x9hYWHYvn27VdPcvz5iNBrRu3dvvPbaa1b7uW/cuHH4+uuv8eyzz+KLL76Am5sbBg4ciD179mhjioqKcPz4cbz00ks1fg72NHnyZJjN5jrPs1gsmDx5cj1UZBt7qPH2kN04+K5so/TrW/W1cf9W/aBBg+Tw4cNVjispKZGxY8fKgAEDpKSk5CErvefgwYMybNgwbXn16tXy3nvv2WXfdTV8+HDR6XS1ftRDp9PJ8OHDHVJrfWIPORaDzYaRI0dKUFCQLF68uMax58+fF4PBID4+PnLixIkGqM62DRs2aM8srV27Vkwmk0PquHnzpvj7+4uLi0uNoebi4iL+/v5y69Yth9Ran9hDjsW/FSW7u3r1KgYOHIjjx49Dp9NV+np6f11ISAh2794NLy8vB1VKqnrkrrFR4+fl5YWjR49i+/btNu/ahYeHY/v27Th69ChDjeoFz9io3p09exZBQUEAgDNnzti8U0dkTww2qndFRUXa82Amk6naRzGI7IFfRYlIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYqF7dvn0bmzdv1pY3b96M27dvO7Aiehw4iYg4ughSz7lz5/DJJ59gy5YtKC0ttdrm5uaG3//+95g9ezY6derkoApJZQw2srvk5GRERUWhvLwcd+/etTnGxcUFrq6u+Pbbb9G/f/8GrpBUx2Ajuzpy5Aj69OmDiooKWCyWasc6OzvD1dUVqamp6N69ewNVSI8DBhvZjYigc+fOOH/+PMxmc63m6HQ6BAYG4tSpU3BycqrnCulxoczNgxUrVuDq1avVjunQoQMyMjIAAAsWLEBQUBAMBgN69OiBXbt2aeNef/11+Pr64o033tDWHTx4EAaDAZ06dUL//v1x+fJlAEBJSQmMRiOaNWuG+Ph4bfz169cRHBwMACgvL8e8efPwzDPPoHPnzujatSs2bNigjb148SJ0Oh2MRiOMRiOCgoLw5z//Wdu+cOFCfPnllwCAvXv3YufOnVbHJSKIiIjApUuXAADvvvsu/v73v9f2o7Ob1NRUnD17ttahBgBmsxlnzpzB/v3767Gy2mEPOb6H7EYU0b59e0lPT7e5zWw2i9lsthrz/fffS3FxsYiIZGRkiKenp5hMJhERGT9+vCxfvtxqfkBAgOzZs0dERJYtWyYvv/yy1Xv07dtX4uLitOV169bJ/PnzRUTkd7/7nYwaNUrbf1ZWlgQFBcmqVau05RYtWmhz8/PzpW3btnLixIlKx7Jo0SJ56623rNbFxsbKxIkTteVr165JYGCg3L171+bnUV/Gjh0rLi4uAqBOLxcXF3nttdcatFZb2EOO7yF7eSSDbf/+/dKnTx/p1q2bhISEyAcffCBNmjSRTp06icFgkPT0dFm0aJGMGjVKBg4cKJ07d5acnJwqG9dsNkvz5s0lKytLRCo35aFDh0Sv12vLd+7ckSeeeEJKSkq0db9uyqFDh8rBgwfl3Llz4u7uLjdv3rR6z4SEBPH29haRyk15+fJleeqpp+SXX36xqic9PV3atm0rTz75pBgMBlm8eLGIiPTv319++OEHq/0PHjxYvv/++2o/R5PJZNeXt7d3nUPt/svb29vu9VSHPWSfHmqsXBrqzNBe8vLyMGLECGzbtg0RERGwWCzIz89HTEwMYmNjYTQaAQDx8fFIS0tDeno62rZtW+0+Y2Ji4O/vj/bt29vc/ssvv1hta968OTw9PXHlyhX4+/tXGl9YWIgzZ86gZ8+e2Lp1KwIDA9GmTRurMWFhYcjNzcW1a9e0OUajEWazGefOncPcuXPh5+dnNcdoNOKNN95Afn4+VqxYAQCoqKhAamoqevXqVWn/ycnJGDJkSJXH3axZs6o/lAaWm5tr93qkisvH7CH79VBj9cgFW1paGvR6PSIiIgDcu7PWunVrm2OHDh1aY0MmJydj8eLFSEpKstvF68TERAwePLhW+3N3d0dJSQmaN2+uXbvJy8vDiy++iJ49eyIqKqra+Tdv3oROp6sUCl5eXjh16tQDH4PK2EPWVOyhRy7Y6qKmM4Aff/wREyZMwLfffgu9Xl/luKefflq7qArc+81YUFAAHx8fm+Pj4uIwceJEAMCzzz6LzMxM3Lp1y+o3blpaGoKDg+Hp6Ym8vDyr+a1bt8aAAQOwa9euGpuyadOmKCsrg4hY/RCUlpbC3d292rkmk6na7XU1ePBgpKWl1enmAXDvzmh4eDgSExPtWo89sIeq76HG6pG7KxoeHo7MzEzs27cPAGCxWJCXlwdPT08UFBTUej///Oc/MW7cOOzYsQMGg6HasaGhoaioqEBKSgoAYO3atYiMjISbm1ulseXl5UhLS0O/fv0AAIGBgYiMjMQf/vAHFBcXA7h3B2vevHn45JNPbL5fWVkZUlNTbf6g/Po4W7RoAV9fX1y4cMFq3OnTp2s8Lg8PD7u+pk+fXudQA+7dGZ0+fbrd66kKe8h+PdRYPXLB1qpVK8TFxWH+/Pno1q0bunfvjtTUVMycOROTJ0+G0WjUTserM2nSJJSVlWHChAnaLfLjx4/bHOvs7Iy//e1veOutt9CpUyd89913WL58uc2xe/bswXPPPYcmTZpo67Zs2YKAgACEhIQgMDAQzzzzDJYtW4ZBgwZpY+5fH7n/MhgMmDp1aqX9jxw5EhkZGTAajViyZAkA4OWXX7Z61EBEkJycjJEjR9b4OdjTyJEj0bJlyzrPa9WqVYPWyh5qvD1kNw69ddFI/fqOVm3cv6M1ZcoU2bp1a5XjzGazzJkzR4xGo9y6deshK73n0qVL0rNnT7FYLCIikpiYKGPHjrXLvutqw4YNdb4junHjRofUWp/YQ47FYLNh5syZEhgYKFOmTKlxbHFxsRgMBvHz85PExMQGqM62bdu2SXZ2toiI/OMf/5DLly87rJbFixfXOtSWLFnisDrrE3vIsfgnVVQvtmzZgoULF+LSpUvQ6XTatbf7/27fvj0+/PBDjBs3zsGVkooYbFRvLBYLEhMTERMTg+3btwMARo8ejQkTJmDIkCFwdn7kLvHSI4LBRvWuqKhIe2zCZDJVe8eSyB74K5OIlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2AjIuUw2IhIOQw2IlIOg42IlMNgIyLlMNiISDkMNiJSDoONiJTDYCMi5TDYiEg5DDYiUg6DjYiUw2CjenP9+nUsXboUoaGh0Ol00Ol0CA0NxdKlS3Hjxg1Hl0cKcxIRcXQRpBaz2Yy5c+fi888/h7OzM8aMGYPg4GAAwMmTJxEbGwuLxYI333wTH3/8MXQ6nYMrJtUw2MiuzGYzXn31VWzfvh2LFi3CtGnT0KZNG6sxt27dwqpVq7B48WKMHj0aX331FZyd+eWB7MfF0QWQWhYtWoRt27Zh27ZtGDlypM0xbdq0wZ/+9Cd07doVL7/8MgIDA/HnP/+5gSslpYkili9fLrm5udWOad++vaSnp4uIyB//+EfR6/XSrVs3CQ0NlZ07d2rjxo8fLz4+PjJlyhRt3ejRo8Xb21sAyO3bt7X1xcXFYjAYxMPDQ+Li4rT1165dky5duoiISFlZmcydO1cCAgIkKChIgoOD5YsvvtDGZmVlibOzsxgMBjEYDKLX6+XDDz/Utv/pT3+Sv/3tbyIikpKSIomJiVbHZbFY5LnnnpOLFy+KiMjs2bPlyy+/rMWnZl/5+fnStGlTWbBgQa3nLFiwQJo2bSr5+fn1WFntsIcc30P2okyw/WfD/ZrZbBaz2Ww15vvvv5fi4mIREcnIyBBPT08xmUwicq8ply9fbrWPpKQkuXbtWqWmvK9v375WTblu3TqZP3++iIj87ne/k1GjRmn7z8rKkqCgIFm1apW23KJFC21ufn6+tG3bVk6cOFHpfRYtWiRvvfWW1brY2FiZOHGitnzt2jUJDAyUu3fv2vw86svnn38uOp1OLl++XOs5ly9fFp1OJytXrqzHymqHPeT4HrKXR/KraFpaGubMmYPCwkKICEaPHo0rV65gzJgxcHd3x6ZNmxAfH4/jx4/DZDIhOzsbSUlJVvsYMmSI9u+QkBCICG7cuAEPDw+b7/nSSy/Vqcb4+HgsWrQImZmZiI+PR3Z2trbvDh064JNPPkF0dDSmTp1aaW5RURFEBJ6engCA119/HUajEf369cOaNWtgNpuxd+9ejBo1CgsXLsTatWuxYMECbf5TTz2FgIAA7N692+o4bb2PPW3atAmRkZHw8fGp9RwfHx9ERkYiJiYG48ePt2s9Vf23BNhD9uqhxuqRC7a8vDyMGDEC27ZtQ0REBCwWC/Lz8xETE4PY2FgYjUYA95oiLS0N6enpaNu2bbX7jImJgb+/P9q3b2+XGgsLC3HmzBn07NkTW7duRWBgYKUL6GFhYcjNzcW1a9e0OUajEWazGefOncPcuXPh5+dnNcdoNOKNN95Afn4+VqxYAQCoqKhAamoqevXqVWn/ycnJ1TZls2bN7HC0/6dJkyaIioqq87xnn30WCQkJdq9Hqrgvxh6yXw81Vo9csKWlpUGv1yMiIgIA4OzsjNatW9scO3To0BobMjk5GYsXL0ZSUhKcnJzsUmNiYiIGDx5cq/25u7ujpKQEzZs3R0ZGBoB7P3gvvvgievbsWWNQ3Lx5EzqdrlIoeHl54dSpUw98DA9CRNCkSZM6z2vSpEmVIVQf2EPWGlMP2csjF2x1UdMZwI8//ogJEybg22+/hV6vt9v7xsXFYeLEiQDunY1kZmbi1q1bVr9x09LSEBwcDE9PT+Tl5VnNb926NQYMGIBdu3bV2JRNmzZFWVkZRMTqh6C0tBTu7u7VzjWZTHU9tGoZDAZcvny5zvOuXLmC9u3b4+eff7ZrPfbAHqq+hxqrR+7hofDwcGRmZmLfvn0AAIvFgry8PHh6eqKgoKDW+/nnP/+JcePGYceOHTAYDHarr7y8HGlpaejXrx8AIDAwEJGRkfjDH/6A4uJiAMDFixcxb948fPLJJzb3UVZWhtTUVJs/KL8+zhYtWsDX1xcXLlywGnf69Okaj8vDw8Our2HDhiE2Nhbl5eW1/rzKysoQGxuL4cOH272eqrCH7NdDjdUjF2ytWrVCXFwc5s+fj27duqF79+5ITU3FzJkzMXnyZBiNRu10vDqTJk1CWVkZJkyYAKPRCKPRiOPHj1c5ftiwYWjXrh0AIDg4WGu6X9uzZw+ee+45q69kW7ZsQUBAAEJCQhAYGIhnnnkGy5Ytw6BBg7Qx96+P3H8ZDAabF4VHjhyJjIwMGI1GLFmyBADw8ssvY9euXdoYEUFycnKVz5HVlylTpuDGjRuIi4ur9Zy4uDjcuHEDU6ZMqcfKrLGHGm8P2Y1D7sU2crZu1dfk/q36KVOmyNatW6scZzabZc6cOWI0GuXWrVsPWek9ly5dkp49e4rFYhERkcTERBk7dqxd9l1X/fv3Fz8/P7ly5UqNY69cuSJ+fn7Sv3//BqisYbGHHIvBZsPMmTMlMDDQ6uHKqtx/uNLPz6/SQ48Nadu2bZKdnS0iIv/4xz/q9CyZPWVnZ4uPj4/o9XrJzMysclxmZqbo9Xrx8fGRnJycBqywYbCHHIt/K0p2d/78eQwaNAgXL17EiBEjMG3aNHTp0gUAcOrUKaxatQrx8fHo0KEDdu3ahWeeecbBFZNqGGxUL0wmE7Zs2YLPP/8cp0+fttrWuXNnvPnmm/j9739v92fXiAAGG9UzEcG//vUvPP/88wCAffv2oU+fPnZ73ovIFgYb1buioiLtzMxkMlX7KAaRPTxyj3sQEdWEwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhvVm6KiInz66acYNmyYts7f3x8vvvgiPv30UxQXFzuwOlKZk4iIo4sg9SQkJCA6OhpXr161Wt+iRQsUFBQAALy8vPDFF19YBR+RPfCMjexu3bp1iIqKwo0bNxAdHY0DBw5o244cOYJjx45h8uTJuHHjBqKiorBu3ToHVktKEiI7Sk5OFp1OJ82bN5ekpCQRETGZTAJAAMisWbO0sUlJSdKsWTPR6XTaWCJ74BmbDT/99BOGDBkCACgoKMCUKVPg7+8PvV6P0NBQ7NixQxu7d+9euLu7w2g0wmg0Ijg4GOvXr9e2R0dHIyUlBQAQHx9vdfYCAMXFxejRowcKCwsBAK+88gr2799f34dYL+7evYvp06fDbDbjyy+/xEsvvVTt+JdeeglfffUVzGYzZsyYgbt37zZQpfWPPeRgjk7WxmjBggWyZs0asVgsEh4eLtOnT5eKigoREUlPTxdvb29JSEgQEZGUlBQxGAza3OzsbHF1dZU7d+5U2u/48eNl+fLlVus++ugjWbJkibacnp4uERER9j+oBrBz504BIJGRkVbrqzpjuy8yMlIAyK5duxqq1HrHHnKsxzbYduzYIUFBQRISEiJz5syRNm3aSFZWloiIdO3aVXJzcyUpKUl8fX2lrKzMau7KlSuld+/eIlK5KU+ePCmtWrWSkpISERHp27evxMXFSUJCgrRq1Up8fHzEYDDI+vXrRUTE399fzp8/b7X/oKAgOXXqVD0def159913BYB8/fXXVutrCrbY2FgBIO+++25DlWoX7KHGy8Vx54qOc/36dUyYMAH79u1Dly5dsG7dOty6dQsAkJmZCU9PT3h5eWHLli0IDQ2Fq6ur1fywsDDMnj1bWz579iyMRiPKy8tx4cIFfPbZZ3Bzc7OaM3ToUERFRcFoNOLtt98GAGRnZ6OgoAABAQGV9p+cnIzOnTtXeQxFRUUP8xHUi6ysLABA+/bt4evriytXrlQa89e//hV//etfteWnn34aX3/9tTa/sR2Xh4eHzfUq9JDKHstgO3DgALp164YuXboAACZNmoQZM2YAAOLi4jBixIga9+Hu7q79W6/XIyMjAwCQk5ODPn36oEePHujevXu1+8jJyUHbtm0rrffy8kJOTk61c5s1a1ZjjY7Sq1evWo/95Zdf0Lt3bwDA9u3bsX379voq64FIFU9DqdBDKuPNAwBOTk7av+Pj47Wm7N69O44cOYKKigqr8WlpaQgPD7e5r3bt2qFXr15ITk6u8X2bNm2K0tLSSutLS0utmp4aP/ZQ4/JYBltYWBiOHTuGM2fOAAA2btyI8vJy5ObmwmQyITAwEADQv39/+Pn54Z133tHu2GVkZGD58uVYunSpzX0XFBTgyJEj0Ov1lbZ5enpqD6cC935LX79+HSUlJVbjTp8+DYPBUO0xmEymRveKj48HAAwfPrzStpkzZwIAZs2aVWnb8OHDAQA7duxw+DH8+qVyDynN0Rf5HCU+Pl6CgoKkW7duMnfuXGnTpo2sXr1a3nvvPatxt2/flujoaOnYsaN07NhR3Nzc5Oeff9a2p6SkiJubmxgMBjEYDBIUFCQLFy7Utt+/8CsicujQIenSpYsYjUbtwu+oUaPku+++08abTCbx9fWVwsLCejz6+lFRUSFBQUECwOqYRERmz54tAGTevHlW6xMSEgSABAUFaXcNHxXsocbrsQ22X2vTpo0MGjRIDh8+XOWYkpISGTt2rAwYMEC7Y/WwDh48KMOGDdOWbf1gPEp++OEH7QHdH374QVtvK9h++OEHad68uTIP6LKHGg8G2//3n7fqG9qGDRu0Z5bWrl0rJpPJIXXYy5o1a8TZ2Vl0Op1MnTpVTpw4If/+979l3759kpWVJSdPnpRp06aJTqcTZ2dnWbNmjaNLtgv2UOPBP4KnepGQkIBJkybh2rVrAICWLVuidevWyMvLQ35+PgCgbdu22LBhA/8InuyOwUb1pqioCF988QW++eYbnDhxArdv30arVq3QtWtX/Pa3v8WkSZOqfE6M6GEw2IhIOY/l4x5EpDYGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMphsBGRchhsRKQcBhsRKYfBRkTKYbARkXIYbESkHAYbESmHwUZEymGwEZFyGGxEpBwGGxEph8FGRMr5f06s/lsSo12eAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"\n",
"ctrl_spec = CtrlSpec(qdtypes=[QBit(), QBit()], cvs=[[0, 1], [1, 0]])\n",
"assert ctrl_spec.is_active([0, 1], [1, 0])\n",
"cx = x.controlled(ctrl_spec=ctrl_spec)\n",
"show_bloq(cx, type='musical_score')"
]
},
{
"cell_type": "markdown",
"id": "76350f9c",
"metadata": {},
"source": [
"The controlled bloq is defined by its decomposition in addition to its classical and quantum simulation protocols. For a general bloq, we can provide a decomposition of its controlled version by controlling each of the subbloqs."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ac9bf2ae",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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tX3Ly8uVjMlasVamY62oJWCwktWqvaKT7o21Mh1rRebGYG2iW7duoXv37qisrISIYPny5fD390fv3r3x6KOPYunSpdotAMDtX+Y+ffrAYDDA398fs2bNQnV1NQBg3bp1WLFiBQAgIyMDn332WZ3jjR07FmlpaQCAv/71r3j33Xeb4SyJqDXgfNXMLP0hr6XcunXrgfrv379fxo8fLyIib775poSGhkpBQYGIiBQUFEhoaKjMnTtX2x6AFBUViYhIRUWFBAUFyZ49e+rsd8OGDfLMM88YtR0+fFieeuop7XFFRYX4+PhIcXHxA52DOe3evVsASH5+fp11ZWVlMnHiRHF2dhZPT09ZuXKlREREyOzZs422y8/PFwCye/fuZhq1ZbBWpmurteJ81bK0qb9YdTodYmNj0a9fP7z55psoLS3F1KlT8fjjjyMoKAjTpk1DZWUlAODUqVPo378/AgMD8eyzz2Lo0KHYuHGjtq+EhASMHj0aZWVleO+99/DRRx+ha9euAICuXbvio48+wl/+8heUlpbWGccvv/yCiooKdOrUCQCwaNEizJkzB1evXsXChQuRkpICg8GAV199FQDw4Ycf4oUXXtD629vbY+jQodi6dau5SmVWMTEx+Pbbb/Hll19i//79OHDgAI4dO2bpYVkl1sp0ra1WnK9arjb3zUu2trY4cuQIAGDatGkIDw/Hxx9/DBHB1KlTsXr1asTExGDixIn43e9+h5deeglZWVkICQnRniwiguTkZCxduhSZmZlo164dAgICjI4TEBAABwcHZGZm4oknngBw+2pEGxsbnD17FmPGjMGAAQOM+ri7u+Ptt99GQkICEhIStPYDBw7gD3/4g9G2/fv3R2JiImbMmFHved64ceOB6vSgGrowpKysDJ988gk2b96MwYMHAwA+/fRTPPzww43uy9LnY06slelaW62cnZ0bXd9W5qvWps0F65QpU7R/JyQkIC0tDe+99x6A26/MbG1tUVJSgoyMDLz44osAgN69eyMsLEzrd+TIEfj7+6N9+/YAGr8YwtHRUfv3wYMH4erqips3b2LMmDH44IMPMGvWrHuO+eLFi/Dw8DBq8/T0xMWLFxvs4+Lics/9WsK5c+dQWVmp/fICQOfOndGrV68G+4wdO7Y5hmZ1WCvTtdRayT2+n6etzFetTZsL1jsDR0Swc+fOOl9tVlJSUqffnU/G+Ph4jBo1CsDtV3rl5eXIzMw0ehWYmZkJOzu7en+xnZycMGLECOzdu9ekJ6qTk1OdV+rl5eVGvwRE1PpwvmqZ2lyw3mnUqFFYtmwZPvzwQ+j1ehQVFaGwsBC+vr4IDg7G5s2bMWnSJJw+fRr//ve/MWHCBABAYmIiUlJSANx+4s+ePRvTp09HfHw8unbtisLCQkyfPh1Lly5Fu3bt6hy3uroaBw4cqPdJ3KFDB1y/ft2oLSgoCKdPn0a3bt20tqysLAQHBzd4bmVlZU2qiSpJSUn1/kXQs2dP2NnZ4fDhw3jkkUcAAEVFRcjOzkZERES9+/riiy8QFRVl1vFaEmtlurZcq9Y8X7U2bTpY4+LiMG/ePBgMBtjY2ECv12P58uXw9fXFpk2bMGXKFKxYsQK+vr7o168fXF1dcerUKXTq1Anu7u7afpYsWYLly5cjNDQUAJCTk4MPPvgAr7zyitHxwsPDYWtri8rKSgQHByM2NrbOmAYPHoyVK1ciKCgIAwYMwLp16/Dcc89h3759ePrpp7XtkpOTsXjx4gbP7V6f3Zibg4NDve0uLi54+eWXERMTgy5dusDd3R3z58+HjU3D19E5ODhY/HzMibUyXVuuVWuer1odC16RbNVKS0ulpqZGRER+/PFH8fDwkPPnz8uSJUtkxYoVjfaNi4uTHj16SE5OjrKx9OnTR8rKykRE5OTJkxIWFqZk3+bS2G0RpaWl8tvf/lacnJzEw8NDli9f3mpui2gK1sp0rFX9OF9ZFwZrA/bt2ydBQUESFBQkgYGBsnXrVouO56uvvpITJ06IiEhycrKcPHnSouO5l8YmwPq0lQmwPqyV6Vir+nG+si5t+q3gxgwdOhRDhw619DA0tbcQAEBkZKQFR0JE1obzlXVpU18QQS2L8L8KNhlrZTrWisyNf7GSWdReXXjz5k2Ttj9w4ECdttq+DV2w0lqwVqZjragl4F+sZBa198gdPHiwyfuo7du7d28lY7JWrJXpWCtqCXTC90XITMLCwlBQUIBvv/0Wnp6e99U3Pz8fERERcHd3f6BJtKVgrUzHWpG1Y7CS2WRnZ2PQoEEoLi5GVFQUevToAb2+8U8fqqqqkJOTg6SkJLi6uiIlJaXON820RqyV6VgrsnYMVjKrn376CZs2bcLevXtx9epVo//zsT42NjZwd3dHdHQ0XnzxRXh5eTXTSC2PtTIda0XWjMFKRESkEC9eIiIiUojBSkREpBCDlYiISCEGKxERkUIMViIiIoUYrERERAoxWImIiBRisBIRESnEYCUiIlKIwUpERKQQg5WIiEghBisREZFCDFYiIiKFGKxEREQKMViJiIgUYrASEREpxGAlIiJSiMFKRESkEIOViIhIIQYrERGRQgxWIiIihRisRERECjFYiYiIFGKwEhERKcRgJSIiUojBSkREpBCDlYiISCEGKxERkUIMViIiIoUYrERERAoxWImIiBT6Hwb/NXhIqL2OAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from qualtran.bloqs.for_testing import TestSerialCombo\n",
"\n",
"serial = TestSerialCombo()\n",
"cserial = serial.controlled()\n",
"show_bloq(serial.decompose_bloq(), type='musical_score')\n",
"show_bloq(cserial.decompose_bloq(), type='musical_score')"
]
},
{
"cell_type": "markdown",
"id": "7f26d386",
"metadata": {},
"source": [
"## Implementation\n",
"\n",
"Bloq authors can override `Bloq.get_ctrl_system(...)` to provide a custom controlled version of a bloq. Please read the docstrings for this method to understand the required return values.\n",
"\n",
"We've already seen an example where `XGate().controlled()` will give the `CNOT` bloq. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2524c557",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CNOT\n"
]
}
],
"source": [
"cx = XGate().controlled()\n",
"print(cx)"
]
},
{
"cell_type": "markdown",
"id": "d7b490bb",
"metadata": {},
"source": [
"This behavior may depend on the control spec. For example, if we want to control on the input line being in the state corresponding to the unsigned integer `255`, we wouldn't get a `CNOT` bloq."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a42248a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"C[8][X]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from qualtran import QInt\n",
"c255x = XGate().controlled(CtrlSpec(QInt(8), cvs=255))\n",
"show_bloq(c255x, type='musical_score')\n",
"print(c255x)"
]
},
{
"cell_type": "markdown",
"id": "8603f99f",
"metadata": {},
"source": [
"## Default Fallback\n",
"\n",
"If a bloq does not override `get_ctrl_system`, the system will use the `qualtran.Controlled` meta-bloq to wrap the original bloq"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "6255dcc4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Controlled(subbloq=TestAtom(), ctrl_spec=CtrlSpec(qdtypes=(QBit(),), cvs=(array(1),)))"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from qualtran.bloqs.for_testing import TestAtom\n",
"\n",
"atom = TestAtom()\n",
"catom = atom.controlled()\n",
"catom"
]
},
{
"cell_type": "markdown",
"id": "1f0452eb",
"metadata": {},
"source": [
"This metabloq forms an important part of the 'controlled' protocol. It adapts the other qualtran protocols to handle controlled versions of arbitrary bloqs. It delegates its protocols to the wrapped bloq.\n",
"\n",
" - **Signature:** That of the wrapped bloq with new registers according to `ctrl_spec`.\n",
" - **Decomposition:** The controlled version of a composite bloq is formed by controlling each\n",
" of the subbloqs.\n",
" - **Classical simulation:** This uses the control spec’s activation method to check classical values.\n",
" If the gate is meant to be active, the wrapped classical simulation protocol is employed.\n",
" Otherwise: the input values are returned unchanged.\n",
" - **Tensor simulation:** Currently, tensor simulation will proceed via the decomposition.\n",
" - **Call graph:** The wrapped bloq's call graph with controlled versions of each subbloq.\n",
" - **Wire_symbol:** Existing registers delegate to the wrapped bloq. New control registers use the\n",
" wire symbol information provided by the control spec.\n",
" - **Names:** The wrapped bloq's names encased with \"C[...]\"\n",
" - **Adjoint:** Use the default fallback. The control lines are all symmetric.\n",
" - **Cirq**: Use the default fallback. No translation to `cirq.ControlledOperation` is done."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "12a460f0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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rAAAWESwSvrmm280bNgwSVJ+fr6efvppRUVFKSYmRr169dKKFSsuOWbRokVyOBxWV2Hef//92rx5syQpNTVV3bp1U3x8vLp27arZs2e72s2ZM0e//vWvrf1cAN6D+coLGJgpU6aY9957z5SVlZmEhAQzfvx4c+HCBWOMMdu3bzfXXnutWbVqVYVj+vbta+644w4zevRoKzVs2bLFDBgwwPX8zJkzrn/n5+eb8PBws23bNmOMMUVFRSYqKqpCG2/jdDqNJCPJOJ1OT5fjUZ988omRZPLy8i7Z53Q6zahRo0xwcLAJDQ0177zzjklMTDQvvPBChXZ5eXlGkvnkk0/qqOr6qTGMK+ar+q/RfPPSX/7yF02ePFn+/v4aOnSoFi5cqG+++UYRERH6y1/+onXr1ikzM1M//PCDsrKy5Od38a2Jj4/Xq6++qrfeekvJycmSpJycHB08eFBbt25Vly5d9OOPP6p58+aSpP79+6t3797asmWLjh49qkGDBum9997T0aNH1aNHDx08eNC10OShhx5Sv379NG7cOM2bN08PPfSQq94WLVq4/l1QUKALFy64ngcEBGjw4MH605/+pHHjxlX5mgsKCuy9gZb9tLb6XGddqG7B0csvv6zPP/9cK1asULt27TRlyhRt27ZN8fHxVfbVmN9PbxpX1d1j2xjnqwbF08leF44fP25at25tdu3aZYwxZt68eUaSOXjwoNm7d69JSEgwxhjzm9/8xowYMeKS47dt22YCAwNdz19++WUzefJkY4wxd999t5k3b55rX2JioklJSTEXLlwwhYWFJiIiwmzatMkYY8xDDz3kapuXl2fatm1rzp49a4wxJioqyuzYsaPCz/3oo49Mly5dTEBAgHnnnXcq7MvIyDD33ntvta9b//+XOw/vePz8jPXs2bMmICDALFmyxLXtn//8p2natGmVZ6w8vOdRlcY6XzUkjeIz1q+//lrdu3dXly5dJEljxoxRQECAJGnZsmVKSUm5bB9NmzaVJJWUlGjx4sV6/PHHJUlPPPGE0tPTK7T993//d/n5+alp06aKj4/XgQMHJEkvvPCCUlNTJUkLFizQyJEjXd8Sk5ubq/bt21fo57777tOuXbuUk5OjDz74QDk5Oa59oaGhys3NrelbAS9y4MABFRcX65ZbbnFta926tWJiYjxYFdyN+cr7NZpLwT/101sT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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Use the default fallback for `OnEach`; but the subbloqs all have custom\n",
"# controlled behavior: \n",
"# C^2[X] -> Toffoli\n",
"# C[Split/Join] -> Split/Join\n",
"from qualtran.bloqs.basic_gates import OnEach\n",
"\n",
"ccx3 = OnEach(n=3, gate=x).controlled(CtrlSpec(cvs=(1,1)))\n",
"show_bloq(ccx3.decompose_bloq(), type='musical_score')"
]
},
{
"cell_type": "markdown",
"id": "24aa3d20-7803-4480-b717-5e3a2d5e6ba3",
"metadata": {},
"source": [
"Only bloqs with all-THRU registers can be controlled. Otherwise, it's not clear what the equivalent \"identity\" operation is."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}