{ "cells": [ { "cell_type": "markdown", "id": "dbtrc001", "metadata": {}, "source": [ "(debug-tracing)=" ] }, { "cell_type": "markdown", "id": "dbtrc002", "metadata": {}, "source": [ "# Debugging and Tracing\n", "\n", "The {func}`~.build` function transforms an annotated circuit into a template circuit and samplex pair.\n", "In a complex circuit it can be hard to tell which box in the original circuit corresponds to which\n", "barriers in the template, or which nodes in the samplex DAG.\n", "\n", "Samplomatic provides two complementary tracing tools:\n", "\n", "- **Barrier labels**: every barrier in the template circuit carries a label encoding its origin.\n", " These are always present regardless of whether `debug=True` is set.\n", "- **Trace info on samplex nodes**: when {func}`~.build` is called with `debug=True`, every samplex\n", " node carries a {class}`~.TraceInfo` object linking it back to the box or boxes that produced it.\n", "\n", "Both tools are most useful when boxes carry a {class}`~.Tag` annotation, which attaches a `ref` \n", "string to the box. Alternatively, {class}`~.InjectNoise` references are also attached." ] }, { "cell_type": "code", "execution_count": 1, "id": "dbtrc003", "metadata": { "tags": [ "remove-input", "remove-output" ] }, "outputs": [], "source": [ "# Without this cell, plotly outputs do not appear in the docs. We hide this cell from itself being\n", "# rendered in the docs by editing its metadata to contain the tags [\"remove-input\", \"remove-output\"]\n", "import plotly.io as pio\n", "\n", "pio.renderers.default = \"sphinx_gallery\"" ] }, { "cell_type": "markdown", "id": "dbtrc004", "metadata": {}, "source": [ "## Tagging boxes\n", "\n", "A {class}`~.Tag` annotation attaches a `ref` string to a box. The `ref` then appears in barrier\n", "labels and in trace info on samplex nodes.\n", "\n", "The example circuit below has three boxes: two tagged CX boxes on disjoint qubit pairs, and an\n", "untagged right-dressed measurement box. The second CX box also carries an {class}`~.InjectNoise`\n", "annotation — both its `tag` ref and its noise `ref` will appear in the barrier labels. The two CX\n", "boxes cover different qubits, which enables the samplex optimizer to merge their propagation nodes\n", "into shared nodes — as we will see in the trace info section." ] }, { "cell_type": "code", "execution_count": 2, "id": "dbtrc005", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit.circuit import QuantumCircuit\n", "\n", "from samplomatic import InjectNoise, Tag, Twirl, build\n", "\n", "circuit = QuantumCircuit(4, 4)\n", "\n", "with circuit.box([Twirl(), Tag(\"cx_ab\")]):\n", " circuit.cx(0, 1)\n", "\n", "with circuit.box([Twirl(), InjectNoise(\"cx_noise\"), Tag(\"cx_cd\")]):\n", " circuit.cx(2, 3)\n", "\n", "with circuit.box([Twirl(), Tag(\"meas_box\")]):\n", " circuit.measure(range(4), range(4))\n", "\n", "circuit.draw(\"mpl\")" ] }, { "cell_type": "markdown", "id": "dbtrc006", "metadata": {}, "source": [ "## Barrier labels in the template circuit\n", "\n", "Calling {func}`~.build` on the circuit above produces a template whose barriers carry identifying\n", "labels. Each label has the form `{side}{scope}@{key=value&...}` where:\n", "\n", "- **Side**: `L` = left-dressing boundary, `M` = inner box content boundary, `R` = right-dressing\n", " boundary.\n", "- **Scope**: an integer index (or underscore-separated list for nested boxes) distinguishing multiple\n", " boxes at the same nesting level.\n", "- **Annotations**: a `@`-prefixed, `&`-separated list of `key=value` pairs derived from the box's\n", " annotations. The `tag` key comes from a {class}`~.Tag` annotation and `inject_noise` from an\n", " {class}`~.InjectNoise` annotation.\n", "\n", "Barriers from untagged boxes carry only the side and scope (e.g. `L2`), with no `@` suffix." ] }, { "cell_type": "code", "execution_count": null, "id": "dbtrc007", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAADIIAAAFvCAYAAACMtIHSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAz0xJREFUeJzs3Qd0VNX69/EnhRACoffepShIERXEglhAsWEHlWtv1/oX67UrKlzlir2iooi9d7FgBRSkCtJ77z3tXb/te+IkJGESzmQyc76ftWYNmTkzc+aczZlnl2fvhJycnBwDAAAAAAAAAAAAAAAAAAAAAABAmZcY7R0AAAAAAAAAAAAAAAAAAAAAAABAeEgEAQAAAAAAAAAAAAAAAAAAAAAAiBEkggAAAAAAAAAAAAAAAAAAAAAAAMQIEkEAAAAAAAAAAAAAAAAAAAAAAABiBIkgAAAAAAAAAAAAAAAAAAAAAAAAMYJEEAAAAAAAAAAAAAAAAAAAAAAAgBhBIggAAAAAAAAAAAAAAAAAAAAAAECMIBEEAAAAAAAAAAAAAAAAAAAAAAAgRpAIAgAAAAAAAAAAAAAAAAAAAAAAECNIBAEAAAAAAAAAAAAAAAAAAAAAAIgRJIIAAAAAAAAAAAAAAAAAAAAAAADECBJBAAAAAAAAAAAAAAAAAAAAAAAAYgSJIAAAAAAAAAAAAAAAAAAAAAAAADGCRBAAAAAAAAAAAAAAAAAAAAAAAIAYQSIIAAAAAAAAAAAAAAAAAAAAAABAjCARBAAAAAAAAAAAAAAAAAAAAAAAIEaQCAIAAAAAAAAAAAAAAAAAAAAAABAjSAQBAAAAAAAAAAAAAAAAAAAAAACIESSCAAAAAAAAAAAAAAAAAAAAAAAAxAgSQQAAAAAAAAAAAAAAAAAAAAAAAGIEiSAAAAAAAAAAAAAAAAAAAAAAAAAxgkQQAAAAAAAAAAAAAAAAAAAAAACAGEEiCAAAAAAAAAAAAAAAAAAAAAAAQIwgEQQAAAAAAAAAAAAAAAAAAAAAACBGkAgCAAAAAAAAAAAAAAAAAAAAAAAQI0gEAQAAAAAAAAAAAAAAAAAAAAAAiBEkggAAAAAAAAAAAAAAAAAAAAAAAMQIEkEAAAAAAAAAAAAAAAAAAAAAAABiBIkgAAAAAAAAAAAAAAAAAAAAAAAAMYJEEAAAAAAAAAAAAAAAAAAAAAAAgBhBIggAAAAAAAAAAAAAAAAAAAAAAECMIBEEAAAAAAAAAAAAAAAAAAAAAAAgRpAIAgAAAAAAAAAAAAAAAAAAAAAAECNIBAEAAAAAAAAAAAAAAAAAAAAAAIgRJIIAQBxKSEiwQYMGRXs3AAAAAETZnXfe6eoHCxYsiPauAACAUkYcAACl79tvv3V1sJEjR3L4AQBAoB1++OHWtGnTaO8GAACIAuKA0kMiCBCwhudhw4YVuV12drY98sgj1qZNG0tNTbVGjRrZ9ddfb1u3bg37s/QemzdvDmtbDUZSh+TkyZPDfn8AAAAAxasH6HbllVcWuM2qVassJSXFbaMGmVCzZs2yk046yapVq2YVK1a0nj172tixY4t1+Ldt22YZGRlhbauBMsOHDy/W+wMAgOLFBN6tUqVK1rlzZ9cWmJmZudtriAMAILy+ldmzZ9vtt99uBx10kNWqVcvS09Nt//33t/vuu69YfSuivhX1sYRDfSvvvfcepwkAAJSJNuWcnBwbNWqUnXnmmdayZUtLS0uzxo0b2wknnGC//vprsfZB7clqVw53fxUXbdiwoVifAQAA/GtTJg4AoodEEAB5XHvttXbddddZu3btbMSIEXbaaafZo48+av369Suy80EJHUoYadu2ravwV65c2VXsu3XrZkOHDrVNmzYV+rq77rqLRBAAAAAggpTk/dprr9nOnTt3e+6VV15xjXPJycl5Hp87d651797dfv75Zxs8eLCL67ds2WLHHHOMffXVV4V+luoN+izVIapWreoSSMqXL2/16tVzq9Z9//33hb6WRBAAACLrrLPOcr/9L7/8st1xxx1ucI3aAi+//PI82xEHAED4XnjhBTcAokWLFi4hRHWnffbZx2677TZXp9q+fXuRiR/aXtup3qa+FdWfWrdubTfccIO7HhdGfSskggAAgLLSpqztzjnnHDepgJJBNN7k4osvtt9//90OPvhglyRSlB9//NHOO+88a9CggYuH1K6s9uW+ffvaq6++Wuh4FQ1SVVxEIggAANFrUyYOAKIn7ygPAIE2ffp0Vxk/5ZRT7O233859vFmzZnbVVVfZ66+/bmeffXae16hyf++999o999xjTZo0sf79+1unTp1cZ8WaNWvsl19+sf/+97+uE+S5555zlXQA2JOcHLMdWbF1nFKTzBIS/Hs/XV8zt+/esFpWJVco77L//RL0MhBr518oA/5fBwA/nXzyyTZ69Gh7//337fTTT8/z3Isvvuji9K+//jrP4zfffLPrPPvtt9/cbLZy7rnnWvv27e2KK66wP//8c7drvzr5lEyu++OOO87NgKt6wq5du1wS+EcffeRmiFNHoOoHSh4HAAClR7O1DRw4MPdvddZpZWD9Lut3WzPZC3EAAITv1FNPddfNKlWq5D526aWXWqtWrdy19fnnny9wNu0PP/zQ/vWvf7l2IL2HBkrWqVPHNm7caDNmzHD9NI899pgbZHHTTTdxShAoQW8flqC3EVMGYq8M0EcQf30ExW1TVlKIkjIOO+ywPNtedNFFrk1ZE4tqvEliYt45izWp6AUXXGBvvfWWS47997//7eqper9ly5a5z7jwwgvdmBONWdFqI0AQ6HcgKyu2AqKkpCRfxwwAiJ02ZeIAIHpIBAGQS5V4VSSuueaa3Srm6mTQDA35E0FU4dbsC1o1RJ0U+SvtmvHhoYcesv/85z920kknuY4LzQzszfarTg7RvfdvNQyogUAzOgwZMsQ+//xzt7T6unXrrG7dum5AmZJPatSokeeztDSoZtjS99CAtY4dO7pgQxmpL730kvtufpkzZ4577y+//NIte1qzZk074IAD3GxfXbp0sY8//th9T30ndfJ4NIOyntf+/fHHH+77hOuJJ55ws3spYWf16tXu+x955JHuWDRt2rTA12imZh2TKVOmuOScM844w+23lmkDyjJ18PT8xGLKuL5mFXyMrNS4/2qLfypSZd2AuaOsXFqqb+8X9DIQa+dfKAP+XwcAvxvoFEeqgy600278+PHuccWUoZ12W7dutQ8++MAlbXhJIKI4UnUAxb0TJkxwKwB6pk6daj179rQOHTq4RJCCYlTNDqOZ3VRPUFz/6aefupnlRNsvXLjQ/Tu0o+Cbb75x+6F9VUz8008/2ZIlS1yHgj7r//7v/1ynZH7fffedq8dMnjzZDchSLKw6y7777usGUt15552+HFvVM9TQqZuOpZdMr326++673bLIquNoP5RUo4ZRzzPPPGOXXHKJqy9p23ApCUd1MH3HRYsWuc4grc542WWXufNTEJ1TJfi/8cYbbmCZjt3999/v6hQAgODSDKsHHXSQG3CjWefVaUccED7iAADStWvXAg+E1x4/bdq03Z5Tn4X6D5Qw8uCDD1p6evpu22hma/WjKBFffQoPPPCAe1xJ9qpzeO+jW+h1ScaMGeP6blQPWblypXv/Qw45xNU7VBfI78knn7Thw4e7927cuLFdffXVrv6nffTqZHtLdTB9J9WbVBfSPqpuohnCVdfTKirvvPOOq5/OnDnTJcXccsstrh5XUN+H+p5UT9yxY4dbQUUDUXQ8Q33xxReuj0b11+XLl7vZxVWPvfXWW3cbpKr90j6qzqmJzqpVq+bqWapzqv5aEpp8TTfV23RcNbBVt/y0cqYmXNP30UQK+lyddw2KDS1P+r1W3T30fKgPrU+fPm5QjmZnjRdBbx+WoLcRUwZirwzQRxB/fQTFbVPWAND8v6+i33Q9rt95ja0IHSOh1dEOPfRQW7t2bYFJJKJYQL+l+l3U8/rd1EpsohWovVjIi4/Ea/9VIokmLtV+qu1ZK7U1b97crTyi33i1MYdSLKSEFY0DkSOOOMLFSLpX+7X20Q9q/9Y+aOIlxSUaO1K9enUXJ9x44422fv16t39KHNYYk169ern4qX79+nneR7GU2ng1Dmfx4sVuTEjv3r1dDKrvGXqcFXPqe6nur78bNWrkkpHV1h86YZPG6ajtWavezZ8/3+2rVvtWLPnUU09ZuXLliv19582bZ9dee607fopX1Sat8xK6j6L2CJUrtWGrD0Dx2NFHH507Ma1MmjTJxY/qi1Cs5/UlqI1c52nixImujKofINbpO4VO4hsLNHlw/tXnAQSjTZk4IHzEAcQBfuOXF0AuNYQrkSN0MJdoYJYGf+n5UE8//bRLshg7dqyr9IUmZKjyp5uW/VKj9cMPP+wqrt5SoKrsq0KvRnxVTFV5V0VN9JzodVoSXRWFE0880QUR2gc12v/www9uEFVKSkru52rm4U8++cQlnKhyq0qpBl+FVvhD91G3cOh7hM7kpYqjKqZa5kyNDapAKklFg7DUQaBED3UKKKFGs1IcddRRbsZjUUfEX3/95fazOEkgMmzYMBdEafCWjqU6jzTYTMdfg+7yJ8ZoiVUFXErkUQOCOmtUYdfrVMHPn7QDAACA+Hb++ee7RIylS5dagwYN3GPqzKldu7Ydf/zxebZVIrFieXWo5KeYVEITQTTwRjG7Ynx1THidQeo0UtztJSKrA0uDpBTP633UGecNZlKHmmbR1YAbxdEeDYCRd9991yVAqNNRnT7qHFQnn1Y01ACn0KR1vb86iNRRpGSQqlWrus4jJaEURJ8ZLtUNQju7VMfR5x944IGu006fpf1ULK5BVmr4fO2111ydSvWCX3/91Q0+Umep6gyqS6ljsjjUYaYOT5031XfUQfbmm2+62F9J4zqO+alOoI5NdSSqo0/1uWOPPdYl46j+BAAILnXWidqbhDigcMQBAIpDg9dC+zw8aqNXn4gmwlJ87lGfiAZ7VahQwdWl1O+gAYIadKj6jQb/K4bXAAv1zaguon6VghIltJKI+gz0nPoidK3X4MEePXq4vgOtVuLRoEDVmzTYU/ukOpz6ZrxVokKpX0QDDsOlSbTy03dSHVH9Q6q/aBDgMccc4wb4DR482CW4q/6qviAlzrdr1y5PH5S+hxI+VKdUHUx9R+rz0Ov0PbXvHiXS6DiqPtSwYUNXH1a/ivp41Gfi9UupfqkBlqL3Vp1T9UT1B6kOV5JEECWArFixwn0HJeJoEjP172h/QuuAGuCpviydJw081baa7VxJ/ho0qYGc3vdWPVwJH0rw0bHV++u7aWZ0JdMAABDNNuU9xUUa26G201CKVRRb6Dc3NGZS+6XiBQ2UVCKE6qsaY3HCCSe438Kff/7ZbaffWa0oorZjtSl7sYeX+Kr6rRJQ9Fur5BHFMp999pmLffQ7qzZSj+IBxQZKolU8oHbpcePGueQCtb/mp/3W+4VDiRb5V8dWQoPiAB0D/Z6r/Vr7pfE5avdWDKj2c01SqnEe2kbJsKGfrxVUlCSj86RVV5T4qphAbdU6pl7yhBcDaeyN2tHVZq3xLUqs1X4osdSj2EPJIZr4VMdBbcoae6OJo9RnUNxEEB07xbHaJ8WaGi+jffzll1/cZ3vjZnQsFROqDV8JKoqLtK0SlpXwoe+jeK5Tp05uv5W4rL4Fry1cCcc6X0pWiYckEACItTblohAHEAcQB0RWQo6fU+QDKLM0UEgVVDWAa+aAguy3335uBgZVbPPTYCsNLFLFThV0DfRSpVGVKzXWiwYyKTFCjeKqOKoSqYZ4bxYpXW5U4dbj3uy73n5pFgnN1hBK2+tz1OkRSo3/agDXbFHezBOq9KshXo8/++yzudt6j3vvl3/mqXB4K5R476HjpMq2ZhHIP3OWOme8BAt12qjircqpKrCqsKpyrgqrkjqKSxVkdWiE0swVGrSljhp1kHi8WQ/U4KHEGI/OlxoJ1OHgJacAZdH2TGb7yti2I9AzPQW9DMTa+RfKQPzN9oX4qwdoJlfNGKYBJ4rhNfuZZvJSDK34VB1rStLQa5TMoc4WdchoME2oGTNmuE4ldbAoqVuU+K3OF83aquQLxc1KgtDj6ojTzKf6t2JhxeKK/VW/0D6p/uHFueoQUt1Bt3DiYQ1QUsePOqO0Xx4lqKiTT495s4qpI0nvr+Tt/CuCFGep8tDZcNU5p1lZ1fmozrnQZOvQuoGow1F1Ic3qqvOhFQU1I50G8Oj4FEdBx0Kfp4FLqntowJLXIefVfXRM1BHmJdOr0VWrk2jmN503AEAwYgL9JmiiEv1Wa/CoBkjo916/E2rTE+KAwhEHAMETTt9KQZTQoYGEGrivxA+tduHRAEb1tXgD7jSIT4MYVWdQvUWd41rpW4PvNOhOgwBVj1AfTOgs1N4Mkkp2CKfOoLhfCerqx/GSBpSUoEGdSgxRn4e3YqN+I7TPqs+FXvu84xGugvplNGhUAwm9epj6LNR3oQQIfUfVUURJIvq3Bm6qT0M0uFHJ8JoQQAn3ofQeSoBRn4xXDyzoOKgOqjqtfvvUhyTaH01uENrvVFLeMVIdW8dcAxa9PiMltKjOpvOqx1VOtK8qA6q/erN8a1u9hwZIaqIBL3FHv9UqVxok+f7777t7TRKgwbBK5IknQW8flqC3EVMGYq8M0EcQP30EJW1TLow3ZkNJrKGrV2niT7WRalIfjavwxjdo8hwlN2h1C/2+ayUPxQ2KeZTQoFhAiQFefOLFGF7cFEr7q/gmf/uv9kWxhNpI9X1E4y30nUeNGmUDBgzI3dZ7PHTciOjzlUwRjoLao3XTb7hiP+/3X2NwFKtceeWVLkbyKBlHiS6KC7y4UsdGiaKKFzp27Ji7rY6XxrQoXvLiRL23Pi9/EodWqtYKHIoxvEmfFFNonE5oe3tJecdI+6pxQx6dZ+2fYmC1S4jG+Sgp5oYbbnB9DZ6PP/7YxY9qg1cytEexm8qW2ry1v0r0VdyoCZrihVYbZ0UQALHSplwY4gDiAOKAyIuDKggAv2gQlWamLYjX+K9tNHBIsytp5gV1PoTOAOxV0JTtqQZzdVZ4sy6oYqnBZHptaCW3MNreSwJRY7hmfVBFx5uVSYGE1yCvmRK8CnCovn37upka8g9sUkJG6AxSRdFANo8GaakjQjMfFLR8euhALx0nHQMNTFOFUzNKqBFEsxyUhNdZoQFeOhbqEFKFXjMRFhRUqQEgNAlENIOEGgxUsSYRBAAAIFg0G6wGHKnzR512GmSkwSaaLSw/b/W8guoHoXUDj1bE0GAiL3bW7GKK+ZVEoplr1XGnmU81q5pH+6L4Xp1d4axIETp4R5+tTjw1OKp+oAZHDVBS56A6yjTYSnWF0KXl1cmlhiYlguSnOkq4QjvV9L1FnZ75V9zL/7c6tnQ8Hn/8cTfwR/UKdeIUNwkk/7FQXUyDm3QsdKzVsaYOQXX2hbr22mvzrKioQUfq0FRnoepL3sorAID4psEn+Vei0m+Ufp88xAGFIw4AEC4NYFRdR8nzoUkgWiVRq/J5CQiiwRQa4KaBFUpQ0Os0ODGU6jeqNyn+9+pk4dQZVE9Qf4IG/2mFD+1LaH+C6kJ6T9VVQt9XMzOrvqAZmPNfB4tTfyqI6oahgzG9VTlUR/SSQMTbXyV2eDSwT0k0qn/mX9lRiTPq/9BM2d4qKaF1J/Vp6bWaSEADLjVo0uOtCq9zo1VXVLfcWzp+XhKIqD6meplm4Vaflo65BsCqvqzHvSQQb1sNOlUfjxI+vCQk7bcGa2olGa3IqQnINOlCvCWBAABis025IPodV1yjxFOtAhZKiRhakdpLAlHigSbd0W+cEi8Uvyj5YdasWW6cieh9tMKZfu+9RJCihE46qvdTPKDxFkqmVMKHVplQDCH6fVZSyFlnnZXnPfQ7HLrimEffR7FdOELbqT367l4SiPf7rwG1SlBVvBRK8ZKOhY6n4iPFeGqb1rHSMQmNixT/aMJWJcuEvrdHbfKKDzUGR/Fl/kQQxUWa5V0JOuGOqdkTjVMJpfEz+h7vvfdebiKIxrCoTT3/atdKIlIys2Ki0MmXNNmsYlOdL42dURypfgkAQHTalAtCHPA34gDigEgjEQRALi1FqRVBCqKOAG8bUUVQSQ1e47g6LVQZnD17du7MRPrBVyVcszKEdh4U9hkF0Qy7qkBroFT+ZTVDK9Wa3UEVPi1/nZ8qkPkTQfQDW9CP7J54HQ5K7giHlhdVI/xFF13kGhk0a1Vxl8r0jB071s2qrGPvnQ9PQQ0MBQ3kUsOFlltVUgoAAACCRzO4qeNEnTgvvPCC69xp167dbtt5cb8GyeypbqAONMXroavejRgxwg1u8WaZ9eJTJSp4lGSixJFw6wfaTonm6vAp6DUbNmxwg3VUN5DQwVaegh6TcBJRCqsfKMauU6dOWNurbqAOOCWjqI6gOlNJqMNSiTaqLy1evHi358OtH3jnXvUDEkEAIBg0MPa0005z7WxTp051q8xqBtTQwb/EAeEhDgBQGM2srJUpdM3NP5BNA/81cM9bVUPJ8hoEqQRt1RFEgy3V3+GtwOj1rWjQnlbwCE0YKIzqaNoPzd6pxPFQmkXbU9z6k+pwJa0/efL3zXgTCoTuV+hzmtXa4/X1FLUPoaveq9/q1ltvdauvqM4YKjQZRTN8awIxDXLVoErNTq7P0GDUgurM4dhTHSz0+CsBKD/vsfz9OZol+6OPPnKzX6uOraQjAADKQptyfvqd0yoN+s1VsqWSPENp3EPob7oSApREqbEnXuJCnz59dosRijPmRPHTAw884FYimTNnTp7Vygoac6Lvln+Cn9q1a7sxFvl16dLF9kZB41UKi4u8x72JlrRymv6ttub8x9WT/3uorV7HWBMUKaGisOOgGFTJqEo+UdyphBudfyXjhCaUhEvHTuesoFhJiSDeCm46/vq80IlaQ+MiTdqqhBedD9HktEoGOeqoo9zfKp8FnScAQOm0KedHHFA04gDiAD+RCAIglypVmmVBg73yz/yrZA6t7OFV7FSxDu1sUGO6KpheEohHiSAanORRg31hFdH8NJuEGtlV2f7f//7nMvgVQGhmAs3IlL9yKvmX9Cxq4JRu4dB3ViWypLzVSjRjsWarKChZZU80o7Ea9PVaNVSo4q/EEn1frexR0LEAAAAA8tNMZ5ohTDPNfvPNN7vN7urxYv3QpG6P95jeR9T5og60/PUDraKXv24QSvGx6hXh1A+81S406EerenhJ6ZrJVZ09Gji1NzGxljEOl+oGJenwkj/++MPN9irTpk1zHZHJycVvmlGSjQb+qOFVs75pZj4dC3WSamY46gcAgMKo7c4baKMBNZrdUzf9br/++uvuceKAwhEHANgTJWxrVmUNmPRmNw7l1YG8eoA3yD9/fSn/3+pbUcwfTl+F6hyqJyhRXskgSujQ4Dr1JyhpINy+kYJoIgAlo4SroEF/+h4FKezx0AGb3r81mFNJ+UUNptD31HHQ4EJ9b62amJ6e7gZFauV2Tb4V6qWXXnJJFhqoqiQLTVJ233332fDhw+3KK6+0smLBggU2ZcoU928NaNX31PcCACDabcr5f6+U+Krfqa+//nq31YsLG3Oidt/Qtle1e7Zp02a3uMhLqt2T6667zk1apHEnSg5VEoEm7vz999/dClt7046qmEixUTgqVarkbuHEPkU958VC3r3q9/oe4UxQdP3117s2dq02ouOu46y2/kGDBuU5DlqpROdCibQ637qp/V0xrpIt9mbsjN+0eopHiSL5Y2gAQOm1KYciDsiLOCAyiAP+QSIIgFya4UgzBowfPz53KW5vxl9VmtRg7tGgq9CZZ9XgroqubqEVPyU+eNTYrsb50AFhRSVuvPLKKy7xQxVLbyZC+fPPP3fbtmnTpq5yqpn48s+yFLoPHs1WrIaKcGgmKM2aJa1bt3b3Oh7hUKOCfnS01KUSW1SJVgN9YR0UhVHFWgkw6oAInf1Bx7Sw5Ubzr4Iiy5cvd7NelWQ1FAAAAMQ+dSBpllMNelFicf5l7j3qmFNy+M8//7zbc7/88ou7V6eceKsEhs6uqnjXW02vsLj86aefdg1f3bt332P9QDG0kihuv/323eL4/Mu9q25Q0OcV9pi3v+FS/USzoHn1A61Qohln97QqyKZNm9zxVoK9BhGp41HLKGtgUXHoOCsJ5JxzztltYNlXX31V6OtUP+jYsWOexzQRgFA/AIDg0u+wflPUZqfBIPqbOKBwxAEA9pQEovrKeeed5+opBdVvVH/auHHjbnUR1Z9CZ9bOX3fRgEvVQ4qabdPz7rvvukGX6pvIP0hSM0eHTgQWWn/q1avXHutPWt0w3IGXkn/W7b3lTUametWeVibRoNNly5a5mcuVmBNKq00WZN9993U3JYSo7nXggQe6/p0rrrgi7InIiuqjyV8H8+41M/eethVNJqB6pe4fffRRN1HCZZddZqNGjSrWvgEAEIk25dDBn4pbFPOovbJTp04Fbqe4KH+bslZPC6VJTPV+XpykVc/UPv3QQw+FPeZE41zyD1JVMmV+iov0uMadhK6moYSV/CuLiVZ7/u677ywcagdWrOgXJRZr9Qu1OYezWpuOg76fxpuEfrfPPvuswO3Vbt+/f39381YTUTz0/PPPuzipOHTsNBFT/gRhxUpKzFHCshfzaH+0ff6VPRQXKclZMaBHsa7G4yjO03n7v//7P3euC0o6AgBEvk3ZQxywO+IA4oBIIxEEQC7NgqBlHjW7UWgiyLPPPmvbtm2zAQMG5Fl6UY3nSk5QxV8rdKjidfrpp7vlv5QMMmbMGDdASbMJqIKvJdBVYVQA4PFmPShoBim9ryrtobMPqNNAMw3k169fPzeQTLPfagl1j2bELaixXQ0VykwNR+jSkxo45X13VXTzL9et/fMaGjRQTZVgdYpocJeOzUEHHeQCISXc5F+KsyjejA/5O010vgqbpUKdNFpKU8t2enRuJPQxAAAABIsSszXblzpWFMMXRHG6YmwlMyuu9RIINJhIA5o0+EYr94k6apo0aeIGBGmQjKgzUMnXipe1NLuSyJX8oFhZs4wpPlbH12OPPZbb0eN9rhKdQ+PqouJhraqhQU6h1KGkJBUlaGh2XW/QjJYr1kqDBfnyyy/DPn6hyRSqI+lzBg8e7FYmCY3x838Hrd6h2er0WRpgpU5LrfanjrriDKQq7Fgo6Tt/Ukwo1ZXUOenNqKclm5VwrtmB8yfTAwCCRbPFv/rqqy7hUm14xAGFIw4AUJi7777bJYGo/V/9B4W1/6uOpNURVR/QoMiGDRu6/phrr73WJWhokKMGN3oJ46qP6TqtPgXNwBxK1+vC+lYKqjOor0eD8FR/86i+ps9VookG0XmJJtpOvw0FXQeLU3/ym/pZbrnlFjeIQgNMNRg1lAac6jvoOxV2HHQsf/311zyP6ThqwGHoedPfmphLSTqaMC3/Z+2Jjp8STnSORTOGq16m/Tr++OPdY507d7bGjRu7+qTqld4ASdVfhw4d6uqUJ554Yu576v2079peE49p9RfVvXUelYAEAEA025RDV+vQYH7FDF26dCl0W8VFalP2qE1ZiQaKi5ToqN/De+65x61IrXZpJT5qVYszzzwzz1iP0DEnXpKrR7+7+WMBTbap3+T81B6u39XRo0fnGRujxwqi1cMKm7QzP78n4lHMon18/PHH7a233rJTTz11t22UwKJEi9CxN6HHQomlap/OT8c7NOHCi1mkOCvDhdLnaBySR236Gs+iNnOPxrBofI+2Dd0vJa8odh44cGBurKY+hvPPP9+1a6uPQcnOilNVNiZOnFjsuA0AsPdtykIcUDDiAOKASCMRBAgYzYCkBuv8VJFT5V3JDaooaYBQ3759XRKFZhXSqhhnn3127vZ67pJLLnGVYFW49HpleaqTw5sZWLPjaqYkJStoezXQq0Id2jCgTg0tWa0ZBLTqhxrWVRnVwChVVt9++233byVuqKKvxAYlpeSn99eSpOrIUMVUg6nmz5/vkkI6dOiQu0x26A9sSX5kVTlWA/uRRx7pBr5dcMEFbnYoNWRotgclxPz73/92jQeqZOq7qkFCFVJ16igRQw0XuldiTLhOPvlkd+z0PVUZViOLGk70vfJXwj2a6UDn5qKLLnID9TRjoRoBdC6V9APEo81Tv7XZt+UdSJmYWtHK129tNQ4/x2of/29LSCL8iWeUgWDj/APh0SCTcGYf0wxvqj9ouXjFsIptFW+rk+Xjjz/Ok+SgeFWxt2Lh5ORkNzBHA5YUi4riYa2AobhZA1datGjhZiFTzBxKidNKJlfSiGaPUQeV6gPq0FHHoGZ6U31AyQuzZ892yeCKe/PPFOcNhNF7XH755W52uTfeeMMNvClolrhwZk0ryGmnneZia9WFNDjohBNOcInk2rfPP//cJaqIOjCVKK/j4s2yq2M5YcIEF7Mrrq9Ro0ZYn6n6k86J6hnq0NLKjmpY1bHQICV1ehVEHXsaYKYO1c2bN7vVRDQATfU9AECwtWzZ0v0mq+Nu3Lhx7veCOGDPiAOAYCmqb0UTZikxQXUt1S2UcB1KqweqfiIanLj//vu7QXteIrcSRzTwsE+fPu5v1V+UWKLVHjQgTtdlXZ/zz6at+pMGW6i/QZ+teo6u53of9beov0Z1K9VRfvzxRzewTnUx1Q08qodo31VX6dGjh6ufqM6l+p36eDSQLrT+pPcqaf3JD0qqUNLKhRde6OqJ+o5KbFm9erVNnTrV9SFpxmgdZw0QVWKFBoxqRlK9Vqu9qy6qeqS296hOpz4Y1W31u1iuXDnX56N6nfq2SjKYUMdPkyWo7031OJUL1QE1WKZRo0ZuG9V51Senz1XdTv0/2lb1RyUE6bx4q6CoT0h1YvXVKQlE1P+m/fTq0N62QUb7ICgDwcb5j26bstoclQSi3121E2ugf/4VxhQTeSsr6/dPv7PeZD4ag6G4RBODekkDGh+hupfadseOHesmHVU7c/6YSG688UaXHKGkUG+VL405Ubup2nAVw2hlZ8VeBbXF6vX6vVZy7Pjx461NmzYuBlOyimK+/G3KRSW5lAYlDivG0zH0JiXVOBK1FSvu0/6NHDnSbavjoPEpihM1Fkgriei7KubJTzGW3ktxjCZ91QREig313vnb88OhY6cJp7RSmxJ51Y6u8UEqB6FlSvHNSy+95GJblSGt7qGVPrxtFfeIJkrVedaYHMVMint1Uxu8vts111zjzjkAoHTblNXWQRxQeogDiANCMRISCBgtpVjQ8o4aSKXGaFWo1UCuipwGd6lSpkq6Oh1CZ0JSsoaSRrS8ojoh1NCuGYw0KEwN6WoUV8a9ZhlQBV4JH6p85afttAynBoOpQqalPZWooMFRChbUWKDGd32OOhjUGaLs//wVc1W6lTSiSr+SUzQrgBJANJOAKoaqTPpFjfFqrNfsE2pw0AAqHSclhqijRLyGDW9FFI86btQxo2xYfUdvxuQ90fvq++kz1Umg46aGCjXwqwJcEM3K8PDDD7tjon3UwD11BqiCXJzVSIBYVO3Qs6xKl76a7s0y1q+wtd++bEteuM52LJlpTa74Z9UgxC/KQLBx/gH/GvDUkaTkbsXgSqJQjKn6RP6BP5q5VIkNiuu1reJVLc2uOFwzyWoAjDprlCihWF4JCwVRwok6/pTArBhWnTpKaFYHkeonqheoM0idPOrI07+VcJI/EUR1Cu2nBs0o/lXCuTr7NGBGnVh+zgimDjPVidTRpHqTBvLo+6mDUv7888/cZZE1Q7BH+6S6i+J5dS7qeIVLSSA6Lx9++KE7BhrsowY/ddzpvQqigU06pjo/SshRfUkdgd6ANABAsHltamqz0m8vcUB4iAOA4Ciqb8UbfKjVGQpalUH1k9C4W/UC9Zt4E3LpmqskctVtlGyivhXVK9QXoedq1apV4D6p70P9NKoLqC9F1K+iZA/1kXj1Ib2X+hi8hAENrAulQYHqP9AKiqpnaKCnVjvXjNFlcUZl1XlUx9QEABrkp/qN+mh0LtSH4q2qoTqXEjlUXx0xYoRLgNGASA2MVP0tNBFEdU7NNK0+HQ129Op1+gwds5JQP5EGWeqzVTZ0XNUHp36iUOr3UqKRBr1qFRDVvTUAU4lCmoxM1NemCdM0SFb1Oo/qgPr9VpKQkv41UNVbBTLoaB8EZSDYOP/RoQlqNFmn6PevIKpveokgaitWcqZ+25XwqN8wJQZoYh+1qWqchWIhjbvQGAn9PnorfoVSnKPkAf1GamIi/eYroUTtxxovoSRLjevQys5KxlTipeKs/G3ciie0ApuSSJUsojEoGtCqfdb2ZS0mUvKw2u+1Mon3/TRJk5JflRCrxFmPF9spBlIsonhJ7eU69hrLE0rfX/GSJhDSamsaG6R4VzFj6CqZ4dKK4EriUdu/Yk3thyZY1X7Xq1cvT1yj2E0xkRI8lDyieE7t7HrMS6TVvxXXKhZW+fEovlbZ0eOaSKl///4lPLIAgJK0KWtibeKA0kMcQBwQKiEn/xp4ABAmzQqlxnHNtKSBWoXNeKDtVFEsaDnK0qDKn1YTUWMBgNiwPdOs5ycln+mnwaChVvfk/8t9PGvHVpt+eRvLWLfUOry00spVKbjzdG+M62tWwccU24xtO+zVFgMtVgyYO8rKpaX69n5BLwOxdv7LShmI5vmPxHUAiDXqbNKgo+uuu87NIl7QbGKiWWHUGVVYMkgkKbla9RI1SpZk9jIAAFAw4gAAKB4lF2iQhBIZtApHUddXrQoSjcH9SmTQahVKjPCSK4DSEvT2YQl6GzFlIPbKAH0E9BGUhFZWPvjgg11SoxLtlXRQEK1yoWRWJdhGI8FFSSKXXHJJnoRMINKU1KQ+jViiBBwlJAFAOIgDAH/wywugxLTCh2bA0ixDWg1DmfgaVKWZFfScVgfRzA3qyNAKFKqUFzZzlR+2b9++2ywMmjVYM2mVdMYmAPEhKbWiVdznINvw01u2c8XciA0CL6sGLX/Lt/caWS86SX17izIQ7DIQ9PMPlBYtPy/nn3++SxTXioNKHNesXprVVisHqjNPM6xq1i7NIBYpmvNCqw2mpv4z+EDJ4ZoBTp0Q2i8AAOAf4gAAKB7NsKzZkc855xx78sknbdCgQa6fpXr16rZu3Tr7+eef3aqLM2bMcBNtaTbqSFF9LbTuJEr+0KqC6u8hCQTxIOjtg/QRUAaCXgaCfg0oy7TKl1bc0GoOWv1Dq1hoxTRNIqQxJhogqpWUtbKxVmWOdCJIQWNOtMKysLIygk4ruGsVeK3EBwB+IA4A/EEiCIC9ok4JLTH++uuvuyWt1ekbutBQgwYNXGVdyzxq2Ua/TZgwIfffjz/+uFsWVCuTVKpUyTUKfPjhh24prGOOOcZtu2bNGreEpJZc16wN4dAyn5GyYsWKPW6j/S9ry4wCsUgNu5JcqboFScUGNW38HSNtxjMfWdBRBoJdBoJ6/oHSpvqAlom/7777bNiwYXmSPbRCSK9eveyrr77ydRBTaJ3AoySQE0880dUDmjRp4pawV5L6nDlzrEOHDjZp0qSw6wORrhN4tmzZ4m5FSUpKimhyPQAAsRYHFBQLFBUHaCKb//znP8VqGyyNWIA4AAgeDWx88MEH3Wof999/v1111VUuIcOTnp7uJt5S30urVq0iui/ffvut3XDDDe7aqNUbNdu2klB0bfIGPha3TlaYkvTRlFadrChZWVm2evXqsPrMorF6C8IT1PZB+gj+QRmgjyCI14BYoPbaP/74wyXKPvfcc/bII4/keb5jx442YsQIO++88yK+L0pCUT2yc+fObtD7119/7SY26t69u4vb9jYWkrI2ZqW4VMdWwkxRFA8pLkL0bd261aZMmWLz5s1zt1WrVrlJs1Qf0biqpk2bWvPmza1t27au7BdG/x+eeeYZ++677+yyyy6zQw89tFS/B4D4FetxQNBiAeKAsolEEAB7TRWEs88+2900U9X8+fNt27ZtVr9+fWvRokWpHeH999/fBQajRo1yHRRKoFAHs5borFOnTu4PqYIGVUqK08kQKZodeU+0PLxmAwMQvuyd2yxz0xqXmJa5foWt/uwp2z5vkqW16mapDVoH6lA2OqqrLf5iogUNZSDYZYDzD0RX48aN3aqAmtVWAy7VsaDEZs3qosFMpUGrfvTo0cO+//57Vwfw9uvcc891s9rqsbJQHwilAbN33XVXkduo8VGDsgAAKKvKchwwePBgN7O94oGy0jboIQ4Aguvggw92E1ppMJ1m192wYYMbNNemTRt3PSsNmn1bfTlK/li7dq1bHaRr164uoa93796+flZZ66MJ1+LFi93M5HuiGc1ZgbJsoH0w2O3DQhkIdhng/MceDUi/5ZZb3E2/u0uWLHGP6/e3NFcnO/7441378bvvvuviMyXJXn/99XbHHXe4SXqCHA95rr76anvppZeK3EYrtyjZGNGjcVuaFOPHH390E2YUROO7Fi1a5NpPRHUCrXyjAc+hyc1eEoh3TvXvdu3axWT5BVA2BSkOiPVYgDigbApEIoj+4zz00EMui0oXCc2eqWwqb4adF154wWWNXXnlldHeVSDmqYMiWpn96uDVLZao4rUn7du3L5V9AeLJ8tF3uFuoqgefYo0vedyCpnLzuvbnyD2vPhRvKAPBLgOcf6DsJIxr0KdupU2NcZrtO78///zTNeCVRRqUesghhxS5DSsFAiW3cu12+2TcYluzfodVSE22/VpVs0O71LWEhAQOKxCQOMCLBcoi4gAAivU1C2Y0KBHkvffe4yQUQQNPwunP0UylKBtoHwx2+7BQBoJdBjj/sa1Ro0bu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jI6K8vI6vb9r164xc+bMNV6bNWvW6nn51LZN6/jc/nvWe7k9h28f/XpuFYUuKWJIPn9V65b1Wi4ZDeWQMbvXe3uXXXZZnH766XHvvffGmDFjoinYum+P2G2nwfVe7vAD9oqqVnX/3kpLS6N///6x/fbbx8knnxxnnHFGfP/736/3dgE2hUKQJmD48OHx0ksvpdWBq/6S/xh69OiRPh43bly+mwgAAAAAAAAAAAA08VExjjxo72jRvFmdlxmz59DotmXHOr9/jz32iAcffHCN1x544IHo1atX3keESOw4uH86MkZdbdmxfey/17AoFi1bNI+j6jEqRjL+xdENGA3lBz/4QZx33nlx3333NZkikFUOGrVrdGzfts7vH7rdwBgysPcmbbOmpiaWLl26SesAqK+6lXDSqFq1ahXbbrvtGq917tw5Kisr13odAAAAAAAAAAAAYF3aVrVKR4W47d4/bfQL6tVty9hr1x3q9UV+97vfjd133z0d/eD444+PZ555Jq6++uq44oormswOOWy/PeKdD2bEgkWfbHw0lIPrPhrKKosWLYo333wzfbx8+fJ0hJTkpt+tW7dOR4nIt4F9e8SInQfH0397ZaPvHbnL9tG3nqOhfOc734nrr78+brvttth6661XjxDTokWLaNu27gUYjaWysiKOPnh0/PSWe6KmtnaD723ftioO2bd+o6FMmDAhRo4cGX379o3q6up47LHH4uKLL46vfvWrm9hygPopqa3dSC9HXpx77rlxyy23rE4WAAAAAAAAAAAAAOoiKQR5ccpb651fWVEe4796ZHRo36beX+gf/vCHOPvss+PVV1+NLl26xPjx4+M//uM/mtSOeeOdqXHjr+/b4HsO3HuXGLXbjvVe96OPPhqjR49e6/W99947ndcULK9eEVfddGfM+Xj+et/TpdMWccqXPx/l5WX1WndJSTKOyNpOOOGEuOmmm6KpeOjx5+NPT/1tvfOTT3HSlw6JPj261rsY6ne/+11MmzYtmjdvnhaEnHjiiXHyySdHWVn9vkuATaEQpMB8MGN2dGjfNlrWY+g2AAAAAAAAAAAAIDs+WbosrrzxjliwaPE65x9+wMjYZcdBUczueejJePpvk9c7Gso3vnRIlJaWRrH6YPrsuG49o2Iko6F8+4TPx1adO0SxWrmyJv38U2d+uM75e++6Q4wdtetmbxdArhTv/2BFaMXKlXHLbx+Ki6/7Zbw/bVa+mwMAAAAAAAAAAAA0QcnNpo8at/c6523Tr2cM32GbKHbJj/w7bdF2rdcrKyvi6INHF3URSKLHVp1j9O47rXPe/nsNK+oikERZWWm6n9c14kkyGsp+ew7LS7sAcqW4/xcrMi+89FrMX7g4TUK6Fvl/wAAAAAAAAAAAAEDDDejdPXYfuu0ar7Vq0TyOOHCvKCkpKfqvtrKi/NOCj3/5rIfsMyI6tGsTWbDPiJ2je9dOa7zWu3uXGDl8+8iCzh3arTXqR1Ig8oX1FIgAFBKFIP9i5cqVcfPNN8f+++8fnTp1imbNmkXPnj3jwAMPjP/93/9N5+drNJBHnpqYPh61645RUVGel3YAAAAAAAAAAAAAhWHs3rtEpy3arX7++QNHRlXrlpEVPbp2jn322Hn180H9e8aw7beOrEiLHsaNjop/FD2ko6GMG1X0o6F81oidh8SA3t1WP99/5HA3YweKQnZ68jpYsGBB7LfffvHlL385HnrooaisrIwddtghampq4o9//GP827/9WyxcuDCvo4EkCdguGRiSDQAAAAAAAAAAANg0yU2nk9EPSktLYui2A2PbgX0y95WOHrFT9OjaKVq1bB6HZ2Q0lM/q1KFdHDR6t/TxIfuOiC0yMhrKKsmIMEceNCqaN6uMPj26xsjh2+W7SQA5UVJbW1ubm1UVvqOOOiruuOOO6N69e/ziF7+I0aNHr543a9asuPHGG2P8+PHRqlWreq336p/fFQsXLdmEltXGwsVLItlVyX9ElRUVm7AuAAAAAAAAAAAAIEuWV1dHRXl55oogVllZU5PeFDz5DrIo+f3p8uoVUVmR3RioXrEiykpLMzUaCtD0VbVuEf9+wuENWlYhyD+88MILMWzYsCgvL4+JEyfGtttum7MddMFPbo0FixbnbH0AAAAAAAAAAAAAAEDhatO6VZz97WMbtGw2SxvX4e67706n48aNy2kRyKpKnYYzGggAAAAAAAAAAAAAABSTqk2oM1AI8g+vvPJKOh0xYkTkWkOHa0k8M2lK/PbBx6Oqdcs446RjoqLCLgMAAAAAAAAAAAAAgKxSVfAPCxYsSKdt27bN+Zd89c/vioWLljR4NJBEdfWKuPSG23PeNgAAAAAAAAAAAAAAYPOPCNLQQScUgvxDmzZt0un8+fMj15IikAWLFm/SOpYuW57+AQAAAAAAAAAAAAAA2aUQ5B+GDBkSd911Vzz99NONUqnT0NFAamtro3mzyqisqMh5uwAAAAAAAAAAAAAAgM2vYXUGnyqpTSoNiIkTJ8bOO+8cFRUVMWnSpBg8eHBev5VnJk2J3z74eFS1bhlnnHRMVFSo2QEAAAAAAAAAAAAAgKwrzXcDmoqddtopjj766Kiuro6xY8fGX/7ylzXmz5o1Ky688MJYvHhxo7dlxcqV8eenJ6aPR+26oyIQAAAAAAAAAAAAAAAgZUSQz1iwYEEcdthh8eijj6bPu3XrFltttVXMmDEjpk2bFsngKXPnzo127dpFYzIaCAAAAAAAAAAAAAAAsC5GBPmMNm3axMMPPxw33nhjjBo1Kj755JN48cUXo7S0NA444ID09aqqqmhslRXl0aZ1K6OBAAAAAAAAAAAAAAAAazAiSBNVvWJFlERJlJeX5bspAAAAAAAAAAAAAABAE6EQBAAAAAAAAAAAAAAAoECU5rsBAAAAAAAAAAAAAAAA1I1CEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAAKBAKAQBAAAAAAAAAAAAAAAoEApBAAAAAAAAAAAAAAAACoRCEAAAAAAAAAAAAAAAgAKhEAQAAAAAAAAAAAAAACAKw/8HjF5SKM/iZfgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template, samplex = build(circuit)\n", "template.draw(\"mpl\", fold=100)" ] }, { "cell_type": "markdown", "id": "dbtrc008", "metadata": {}, "source": [ "The barrier labels can also be extracted programmatically:" ] }, { "cell_type": "code", "execution_count": 4, "id": "dbtrc009", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['L0@tag=cx_ab',\n", " 'M0@tag=cx_ab',\n", " 'R0@tag=cx_ab',\n", " 'L1@inject_noise=cx_noise&tag=cx_cd',\n", " 'M1@inject_noise=cx_noise&tag=cx_cd',\n", " 'R1@inject_noise=cx_noise&tag=cx_cd',\n", " 'L2@tag=meas_box',\n", " 'M2@tag=meas_box',\n", " 'R2@tag=meas_box']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "barrier_labels = [instr.operation.label for instr in template if instr.operation.name == \"barrier\"]\n", "barrier_labels" ] }, { "cell_type": "markdown", "id": "dbtrc010", "metadata": {}, "source": [ "## Trace info on samplex nodes\n", "\n", "Passing `debug=True` to {func}`~.build` attaches trace information to every samplex node. Each\n", "node's {attr}`~.Node.trace_info` attribute is a {class}`~.TraceInfo` object whose `trace_refs`\n", "dictionary maps annotation keys (e.g. `\"tag\"`, `\"inject_noise\"`) to sets of ref strings. Nodes\n", "without a corresponding box annotation have `trace_info=None`.\n", "\n", "When {meth}`~.Samplex.draw` is called on a debug-built samplex, hovering over any node in the\n", "interactive graph reveals its `trace_refs` inside of the hover tooltip." ] }, { "cell_type": "code", "execution_count": 5, "id": "dbtrc011", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "template, samplex = build(circuit, debug=True)\n", "samplex.draw()" ] }, { "cell_type": "markdown", "id": "dbtrc012", "metadata": {}, "source": [ "Trace info can also be inspected programmatically. Notice that some nodes carry refs from both\n", "`'cx_ab'` and `'cx_cd'` — the samplex optimizer merged their parallel propagation nodes because\n", "the two boxes cover disjoint qubits and share a common predecessor from the right-dressed\n", "measurement box's emission." ] }, { "cell_type": "code", "execution_count": 6, "id": "dbtrc013", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TwirlSamplingNode tags={'meas_box'}\n", "TwirlSamplingNode tags={'cx_cd'}\n", "InjectNoiseNode tags={'cx_cd'}\n", "CollectZ2ToOutputNode tags={'cx_cd'}\n", "CombineRegistersNode tags={'cx_cd'}\n", "CollectTemplateValues tags={'cx_cd'}\n", "TwirlSamplingNode tags={'cx_ab'}\n", "CombineRegistersNode tags={'cx_ab', 'cx_cd'} ← merged\n", "CollectTemplateValues tags={'cx_ab', 'cx_cd'} ← merged\n" ] } ], "source": [ "for node in samplex.graph.nodes():\n", " if node.trace_info is not None:\n", " tags = node.trace_info.trace_refs.get(\"tag\", set())\n", " merged = \" ← merged\" if len(tags) > 1 else \"\"\n", " print(f\"{type(node).__name__:40s} tags={tags}{merged}\")" ] }, { "cell_type": "markdown", "id": "dbtrc014", "metadata": {}, "source": [ "To find all nodes that originate from a specific box, filter by the `\"tag\"` key:" ] }, { "cell_type": "code", "execution_count": 7, "id": "dbtrc015", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nodes originating from box 'cx_ab':\n", " TwirlSamplingNode\n", " CombineRegistersNode\n", " CollectTemplateValues\n" ] } ], "source": [ "tag_ref = \"cx_ab\"\n", "matching_nodes = [\n", " node\n", " for node in samplex.graph.nodes()\n", " if node.trace_info is not None and tag_ref in node.trace_info.trace_refs.get(\"tag\", set())\n", "]\n", "\n", "print(f\"Nodes originating from box '{tag_ref}':\")\n", "for node in matching_nodes:\n", " print(f\" {type(node).__name__}\")" ] }, { "cell_type": "markdown", "id": "3ud115ryesy", "metadata": {}, "source": [ "## Understanding the samplex DAG\n", "\n", "The samplex returned by {func}`~.build` is a directed acyclic graph (DAG) where **edges denote\n", "register dependency**: an edge from node A to node B means B must wait for A to have acted on\n", "the shared virtual registers before B is allowed to act. This is not a temporal ordering like\n", "the DAG of a quantum circuit — instead the graph flows from nodes responsible for generating\n", "randomizations to nodes responsible for synthesizing them as outputs.\n", "\n", "There are three node types, each with a distinct visual style in the interactive plot:\n", "\n", "| Shape | Color | Type | Role |\n", "|---|---|---|---|\n", "| Star | Red | {class}`~.SamplingNode` | Instantiates new virtual registers from a distribution or input |\n", "| Circle | Green | {class}`~.EvaluationNode` | Transforms, combines, or propagates virtual registers |\n", "| Bowtie | Blue / Purple | {class}`~.CollectionNode` | Reads registers and writes to `sample()` outputs |\n", "\n", "Execution proceeds in three phases: all sampling nodes run first (in parallel), evaluation nodes\n", "run next in topological order (parallel within each generation), and collection nodes run last\n", "(in parallel). The graphviz layout reflects this — sampling nodes appear at the top, collection\n", "nodes at the bottom." ] }, { "cell_type": "markdown", "id": "n3iv2b0oct", "metadata": {}, "source": [ "## Reading hover tooltips\n", "\n", "Every node in the interactive visualization shows a tooltip when hovered. The tooltip contains:\n", "\n", "- **Node class name** and its integer graph index.\n", "- **Register manifests**: which registers the node instantiates, reads from, writes to, and\n", " removes. These tell you how data flows between nodes.\n", "- **Node-specific details**: the distribution type for sampling nodes, the operand for\n", " multiplication nodes, the template parameter indices for collection nodes, etc.\n", "- **Trace refs** (only when `debug=True`): the annotation keys and ref strings linking the\n", " node back to its originating box(es).\n", "\n", "Clicking the plot and then hovering over individual nodes is the fastest way to understand what\n", "a given node does without reading source code." ] }, { "cell_type": "markdown", "id": "niy0g8eq00l", "metadata": {}, "source": [ "## Orienting in a samplex\n", "\n", "Before diving into the visualization, `print(samplex)` gives a quick text summary of the node\n", "count, required inputs, and promised outputs." ] }, { "cell_type": "code", "execution_count": 8, "id": "jtmbwqb9a5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Samplex(<15 nodes>)\n", " Inputs:\n", " - 'pauli_lindblad_maps.cx_noise' : A PauliLindblad map acting on 2\n", " qubits, with 'num_terms_cx_noise' terms.\n", "\n", " Outputs:\n", " * 'measurement_flips.c' : Bit-flip corrections for\n", " measurement twirling.\n", " * 'parameter_values' : Parameter values valid for an\n", " associated template circuit.\n", " * 'pauli_signs' : Signs from sampled Pauli Lindblad\n", " maps, where boolean values represent the parity of the number of non-trivial factors in the\n", " sampled error that arise from negative rates. In other words, in order to implement basic\n", " PEC, the sign used to correct expectation values should be ``(-1)**bool_value``. The order\n", " matches the iteration order of boxes in the original circuit with noise injection\n", " annotations.\n", "\n" ] } ], "source": [ "template, samplex = build(circuit)\n", "print(samplex)" ] }, { "cell_type": "markdown", "id": "8qamjzj64z", "metadata": {}, "source": [ "## Inspecting registers with `keep_registers`\n", "\n", "Passing `keep_registers=True` to {meth}`~.Samplex.sample` retains the intermediate\n", "{class}`~.VirtualRegister` objects that are live at the end of sampling, storing them in\n", "`outputs.metadata[\"registers\"]`. Each register is a 2D array (shape\n", "`(num_subsystems, num_randomizations)`, with possible trailing gate-shape dimensions) of virtual\n", "group elements.\n", "\n", "This is useful for verifying that virtual gates were combined correctly, or for inspecting the\n", "raw Pauli or unitary samples before they are synthesized into rotation angles." ] }, { "cell_type": "code", "execution_count": 9, "id": "ymdq1ctyajk", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lhs_0: type=pauli, shape=(4, 3)\n", "rhs_0: type=pauli, shape=(4, 3)\n", "lhs_2: type=pauli, shape=(2, 3)\n", "rhs_2: type=pauli, shape=(2, 3)\n", "inject_noise_4: type=pauli, shape=(2, 3)\n", "sign_4: type=z2, shape=(1, 3)\n", "lhs_6: type=pauli, shape=(2, 3)\n", "rhs_6: type=pauli, shape=(2, 3)\n", "z2_collect_1: type=z2, shape=(4, 3)\n", "collect_7: type=u2, shape=(4, 3, 2, 2)\n", "collect_5: type=u2, shape=(2, 3, 2, 2)\n", "collect_9: type=u2, shape=(2, 3, 2, 2)\n" ] } ], "source": [ "from qiskit.quantum_info import PauliLindbladMap\n", "\n", "outputs = samplex.sample(\n", " {\"pauli_lindblad_maps.cx_noise\": PauliLindbladMap.identity(2)},\n", " num_randomizations=3,\n", " keep_registers=True,\n", ")\n", "for name, reg in outputs.metadata[\"registers\"].items():\n", " print(f\"{name}: type={reg.TYPE.value}, shape={reg.virtual_gates.shape}\")" ] }, { "cell_type": "markdown", "id": "e6909d68", "metadata": {}, "source": [ "You can view the contents of the end-state of a particular register. In the particular example below, the register has type {class}`~.PauliRegister`; see the API documentation for details about the storage format." ] }, { "cell_type": "code", "execution_count": 10, "id": "225eb830", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lhs_2: PauliRegister(<2, 3>)\n" ] }, { "data": { "text/plain": [ "array([[3, 2, 3],\n", " [1, 1, 2]], dtype=uint8)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"lhs_2:\", outputs.metadata[\"registers\"][\"lhs_2\"])\n", "outputs.metadata[\"registers\"][\"lhs_2\"].virtual_gates" ] }, { "cell_type": "markdown", "id": "mzjbvai206j", "metadata": {}, "source": [ "## How samplex nodes map to template parameters\n", "\n", "The `outputs[\"parameter_values\"]` array returned by {meth}`~.Samplex.sample` has shape\n", "`(num_randomizations, N)` where `N` matches `len(template.parameters)`. Each column corresponds\n", "to one parameter in the template circuit — the i-th column fills in `template.parameters[i]`.\n", "\n", "The {class}`~.CollectTemplateValues` collection nodes are the link between virtual registers and\n", "template parameters. Each such node holds index information that records which columns of the \n", "output array itwrites to. This makes it possible to trace which virtual-gate subsystems drive \n", "which template parameters.\n", "\n", "See the {doc}`samplex_io` guide for how to bind the sampled parameter values to the template\n", "circuit and run experiments." ] }, { "cell_type": "code", "execution_count": null, "id": "hkehuc4k579", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tags={'cx_cd'} → template param indices: [[6, 7, 8], [9, 10, 11]]\n", "tags={'cx_ab', 'cx_cd'} → template param indices: [[12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23]]\n", "tags=set() → template param indices: [[0, 1, 2], [3, 4, 5]]\n" ] } ], "source": [ "from samplomatic.samplex.nodes import CollectTemplateValues\n", "\n", "template, samplex = build(circuit, debug=True)\n", "for node in samplex.graph.nodes():\n", " if isinstance(node, CollectTemplateValues):\n", " tags = node.trace_info.trace_refs.get(\"tag\", set()) if node.trace_info else set()\n", " print(f\"tags={tags} → template param indices: {node.template_idxs.tolist()}\")" ] }, { "cell_type": "markdown", "id": "dbtrc016", "metadata": {}, "source": [ "## Automatic tagging via the transpiler\n", "\n", "When using {func}`~.generate_boxing_pass_manager`, the `add_tags` parameter automatically adds\n", "{class}`~.Tag` annotations to all boxes. Three modes are available:\n", "\n", "- **`\"unique_instance\"`**: assigns sequential refs `t0`, `t1`, ... to boxes in circuit order.\n", " Every box gets a distinct ref regardless of its structure.\n", "- **`\"unique_box\"`**: computes a structural hash of each box's content and assigns the same ref to\n", " all structurally equivalent boxes. Useful for grouping boxes by type rather than position.\n", "- **`\"noise_ref\"`**: copies the `ref` from each box's {class}`~.InjectNoise` annotation, and only\n", " tags boxes that have one. Useful when meaningful noise refs already exist.\n", "\n", "The example below applies `\"unique_instance\"` and `\"unique_box\"` to a circuit whose two CX boxes\n", "are structurally equivalent. With `\"unique_instance\"` each gets a distinct ref, while with\n", "`\"unique_box\"` they share one." ] }, { "cell_type": "code", "execution_count": 12, "id": "dbtrc017", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unique_instance barrier labels:\n", " L0@tag=t0\n", " M0@tag=t0\n", " R0@tag=t0\n", " L1@tag=t1\n", " M1@tag=t1\n", " R1@tag=t1\n", " L2@tag=t2\n", " M2@tag=t2\n", " R2@tag=t2\n" ] } ], "source": [ "from samplomatic.transpiler import generate_boxing_pass_manager\n", "\n", "base_circuit = QuantumCircuit(3)\n", "base_circuit.cx(0, 1)\n", "base_circuit.cx(1, 2)\n", "base_circuit.measure_all()\n", "\n", "# unique_instance: every box gets a distinct tag ref\n", "pm = generate_boxing_pass_manager(add_tags=\"unique_instance\")\n", "boxed = pm.run(base_circuit)\n", "template, _ = build(boxed)\n", "\n", "print(\"unique_instance barrier labels:\")\n", "for instr in template:\n", " if instr.operation.name == \"barrier\" and instr.operation.label:\n", " print(f\" {instr.operation.label}\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.1" } }, "nbformat": 4, "nbformat_minor": 5 }