|
15 | 15 | "outputs": [],
|
16 | 16 | "source": [
|
17 | 17 | "import pygsti\n",
|
18 |
| - "import pygsti.modelpacks.legacy.std1Q_XYI as std1Q\n", |
| 18 | + "import pygsti.modelpacks.smq1Q_XYI as smq1Q\n", |
| 19 | + "from pygsti.baseobjs import Label\n", |
| 20 | + "from pygsti.circuits import Circuit\n", |
19 | 21 | "import numpy as np\n",
|
20 | 22 | "import scipy.linalg as sla\n",
|
21 | 23 | "#import pickle"
|
|
49 | 51 | "metadata": {},
|
50 | 52 | "outputs": [],
|
51 | 53 | "source": [
|
52 |
| - "mdl_2level_ideal = std1Q.target_model()\n", |
53 |
| - "mdl_2level_ideal.sim = \"matrix\" # so we can create reports later on" |
| 54 | + "mdl_2level_ideal = smq1Q.target_model(qubit_labels=[\"Qubit\"])" |
54 | 55 | ]
|
55 | 56 | },
|
56 | 57 | {
|
|
67 | 68 | " [0,1,0],\n",
|
68 | 69 | " [0,0,1]], complex)\n",
|
69 | 70 | "\n",
|
70 |
| - "sslbls = pygsti.baseobjs.ExplicitStateSpace(['Qubit+Leakage'],[3])\n", |
71 |
| - "mdl_3level_ideal = pygsti.models.ExplicitOpModel(sslbls, 'gm')\n", |
| 71 | + "sslbls = pygsti.baseobjs.ExplicitStateSpace(['Qubit_leakage'],[3])\n", |
| 72 | + "mdl_3level_ideal = pygsti.models.ExplicitOpModel(sslbls, 'gm', simulator='matrix')\n", |
72 | 73 | "mdl_3level_ideal['rho0'] = pygsti.tools.stdmx_to_gmvec(rho0)\n",
|
73 | 74 | "mdl_3level_ideal['Mdefault'] = pygsti.modelmembers.povms.TPPOVM([('0',pygsti.tools.stdmx_to_gmvec(E0)),\n",
|
74 | 75 | " ('1',pygsti.tools.stdmx_to_gmvec(E1))],\n",
|
75 | 76 | " evotype='default')\n",
|
76 | 77 | "\n",
|
77 |
| - "mdl_3level_ideal['Gi'] = unitary_to_gmgate( to_3level_unitary(Us['Gi']))\n", |
78 |
| - "mdl_3level_ideal['Gx'] = unitary_to_gmgate( to_3level_unitary(Us['Gxpi2']))\n", |
79 |
| - "mdl_3level_ideal['Gy'] = unitary_to_gmgate( to_3level_unitary(Us['Gypi2']))\n", |
80 |
| - "mdl_3level_ideal.sim = \"matrix\" # so we can create reports later on" |
| 78 | + "mdl_3level_ideal[tuple()] = unitary_to_gmgate( to_3level_unitary(Us['Gi']))\n", |
| 79 | + "mdl_3level_ideal['Gxpi2', 'Qubit_leakage'] = unitary_to_gmgate( to_3level_unitary(Us['Gxpi2']))\n", |
| 80 | + "mdl_3level_ideal['Gypi2', 'Qubit_leakage'] = unitary_to_gmgate( to_3level_unitary(Us['Gypi2']))" |
81 | 81 | ]
|
82 | 82 | },
|
83 | 83 | {
|
|
95 | 95 | "\n",
|
96 | 96 | "#Guess of a model w/just unitary leakage\n",
|
97 | 97 | "mdl_3level_guess = mdl_3level_ideal.copy()\n",
|
98 |
| - "mdl_3level_guess['Gi'] = np.dot(leakageOp, mdl_3level_guess['Gi'])\n", |
99 |
| - "#mdl_3level_guess['Gx'] = np.dot(leakageOp, mdl_3level_guess['Gx'])\n", |
100 |
| - "#mdl_3level_guess['Gy'] = np.dot(leakageOp, mdl_3level_guess['Gy'])\n", |
| 98 | + "mdl_3level_guess[tuple()] = np.dot(leakageOp, mdl_3level_guess[tuple()])\n", |
| 99 | + "#mdl_3level_guess['Gxpi2', 'Qubit_leakage'] = np.dot(leakageOp, mdl_3level_guess['Gxpi2', 'Qubit_leakage'])\n", |
| 100 | + "#mdl_3level_guess['Gypi2', 'Qubit_leakage'] = np.dot(leakageOp, mdl_3level_guess['Gypi2', 'Qubit_leakage'])\n", |
101 | 101 | "\n",
|
102 | 102 | "#Actual model used for data generation (some depolarization too)\n",
|
103 | 103 | "mdl_3level_noisy = mdl_3level_ideal.depolarize(op_noise=0.005, spam_noise=0.01)\n",
|
104 |
| - "mdl_3level_noisy['Gi'] = np.dot(leakageOp, mdl_3level_noisy['Gi'])\n", |
105 |
| - "#mdl_3level_noisy['Gx'] = np.dot(leakageOp, mdl_3level_noisy['Gx'])\n", |
106 |
| - "#mdl_3level_noisy['Gy'] = np.dot(leakageOp, mdl_3level_noisy['Gy'])" |
| 104 | + "mdl_3level_noisy[tuple()] = np.dot(leakageOp, mdl_3level_noisy[tuple()])\n", |
| 105 | + "#mdl_3level_noisy['Gxpi2', 'Qubit_leakage'] = np.dot(leakageOp, mdl_3level_noisy['Gxpi2', 'Qubit_leakage'])\n", |
| 106 | + "#mdl_3level_noisy['Gypi2', 'Qubit_leakage'] = np.dot(leakageOp, mdl_3level_noisy['Gypi2', 'Qubit_leakage'])" |
107 | 107 | ]
|
108 | 108 | },
|
109 | 109 | {
|
|
126 | 126 | "\n",
|
127 | 127 | "if find_fiducials:\n",
|
128 | 128 | " prepfids, measfids = pygsti.algorithms.find_fiducials(\n",
|
129 |
| - " mdl_3level_guess, omit_identity=False, max_fid_length=4, verbosity=4)\n", |
| 129 | + " mdl_3level_guess, omit_identity=False, candidate_fid_counts={4: \"all upto\"}, verbosity=4)\n", |
130 | 130 | " pygsti.io.write_circuit_list(\"example_files/leakage_prepfids.txt\", prepfids)\n",
|
131 | 131 | " pygsti.io.write_circuit_list(\"example_files/leakage_measfids.txt\", measfids)"
|
132 | 132 | ]
|
|
140 | 140 | "# If files missing, run previous cell at least once with find_fiducials = True\n",
|
141 | 141 | "prepfids = pygsti.io.read_circuit_list(\"example_files/leakage_prepfids.txt\")\n",
|
142 | 142 | "measfids = pygsti.io.read_circuit_list(\"example_files/leakage_measfids.txt\")\n",
|
143 |
| - "# HACK: Fix broken force empty labels\n", |
144 |
| - "prepfids[-1] = pygsti.circuits.Circuit([])\n", |
145 |
| - "measfids[-1] = pygsti.circuits.Circuit([])\n", |
146 |
| - "germs = std1Q.germs\n", |
| 143 | + "germs = smq1Q.germs(qubit_labels=[\"Qubit_leakage\"])\n", |
147 | 144 | "maxLengths = [1,]\n",
|
148 | 145 | "expList = pygsti.circuits.create_lsgst_circuits(mdl_3level_noisy, prepfids, measfids, germs, maxLengths)\n",
|
149 | 146 | "ds = pygsti.data.simulate_data(mdl_3level_noisy, expList, 1000, 'binomial', seed=1234)"
|
|
155 | 152 | "metadata": {},
|
156 | 153 | "outputs": [],
|
157 | 154 | "source": [
|
158 |
| - "results_2level = pygsti.run_stdpractice_gst(ds, mdl_2level_ideal, prepfids, measfids,\n", |
159 |
| - " germs, maxLengths, modes=\"CPTPLND\", verbosity=3)" |
| 155 | + "\n", |
| 156 | + "# We have found out prep fids, meas fids, and germs, as well as simulated noisy data, for the 3 level model\n", |
| 157 | + "# If we want to run GST on another model, we need to get versions of the circuits will the correct state space labels\n", |
| 158 | + "\n", |
| 159 | + "def map_2level_sslbls(circuit):\n", |
| 160 | + " sslbl_map = {'Qubit_leakage': 'Qubit'}\n", |
| 161 | + " return circuit.map_state_space_labels(sslbl_map)\n", |
| 162 | + "\n", |
| 163 | + "prepfids_2level = [map_2level_sslbls(c) for c in prepfids]\n", |
| 164 | + "measfids_2level = [map_2level_sslbls(c) for c in measfids]\n", |
| 165 | + "germs_2level = [map_2level_sslbls(c) for c in germs]\n", |
| 166 | + "ds_2level = ds.process_circuits(map_2level_sslbls)\n", |
| 167 | + "\n", |
| 168 | + "results_2level = pygsti.run_stdpractice_gst(ds_2level, mdl_2level_ideal, prepfids_2level, measfids_2level,\n", |
| 169 | + " germs_2level, maxLengths, modes=\"CPTPLND\", verbosity=3)" |
| 170 | + ] |
| 171 | + }, |
| 172 | + { |
| 173 | + "cell_type": "code", |
| 174 | + "execution_count": null, |
| 175 | + "metadata": {}, |
| 176 | + "outputs": [], |
| 177 | + "source": [ |
| 178 | + "pygsti.report.construct_standard_report(results_2level, \"2-level Leakage Example Report\").write_html('example_files/leakage_report_2level')" |
| 179 | + ] |
| 180 | + }, |
| 181 | + { |
| 182 | + "cell_type": "markdown", |
| 183 | + "metadata": {}, |
| 184 | + "source": [ |
| 185 | + "Open the report [here](example_files/leakage_report_2level/main.html)" |
160 | 186 | ]
|
161 | 187 | },
|
162 | 188 | {
|
|
168 | 194 | "outputs": [],
|
169 | 195 | "source": [
|
170 | 196 | "results_3level = pygsti.run_stdpractice_gst(ds, mdl_3level_ideal, prepfids, measfids,\n",
|
171 |
| - " germs, maxLengths, modes=[\"CPTP\",\"True\"],\n", |
| 197 | + " germs, maxLengths, modes=[\"CPTPLND\",\"True\"],\n", |
172 | 198 | " models_to_test={'True': mdl_3level_noisy}, \n",
|
173 | 199 | " verbosity=4, advanced_options={'all': {'tolerance': 1e-2}})"
|
174 | 200 | ]
|
|
179 | 205 | "metadata": {},
|
180 | 206 | "outputs": [],
|
181 | 207 | "source": [
|
182 |
| - "pygsti.report.construct_standard_report(\n", |
183 |
| - " {'two-level': results_2level, 'three-level': results_3level},\n", |
184 |
| - " \"Leakage Example Report\"\n", |
185 |
| - ").write_html('example_files/leakage_report')" |
| 208 | + "pygsti.report.construct_standard_report(results_3level, \"3-level Leakage Example Report\").write_html('example_files/leakage_report')" |
| 209 | + ] |
| 210 | + }, |
| 211 | + { |
| 212 | + "cell_type": "markdown", |
| 213 | + "metadata": {}, |
| 214 | + "source": [ |
| 215 | + "Open the report [here](example_files/leakage_report/main.html)" |
186 | 216 | ]
|
187 | 217 | },
|
188 | 218 | {
|
|
254 | 284 | "metadata": {},
|
255 | 285 | "outputs": [],
|
256 | 286 | "source": [
|
257 |
| - "pygsti.report.construct_standard_report(\n", |
258 |
| - " {'two-level': results_2level, 'three-level': results_3level_leakage_basis},\n", |
259 |
| - " \"Leakage Example Report\"\n", |
260 |
| - ").write_html('example_files/leakage_report')" |
| 287 | + "pygsti.report.construct_standard_report(results_3level_leakage_basis, \"3-level with Basis Change Leakage Example Report\"\n", |
| 288 | + " ).write_html('example_files/leakage_report_basis')" |
261 | 289 | ]
|
262 | 290 | },
|
263 | 291 | {
|
264 | 292 | "cell_type": "markdown",
|
265 | 293 | "metadata": {},
|
266 | 294 | "source": [
|
267 |
| - "Open the report [here](example_files/leakage_report/main.html)" |
| 295 | + "Open the report [here](example_files/leakage_report_basis/main.html)" |
268 | 296 | ]
|
269 | 297 | },
|
270 | 298 | {
|
|
288 | 316 | "E1 = np.concatenate( (mdl_2level_ideal.povms['Mdefault']['1'].to_dense(),[eps]), axis=0)\n",
|
289 | 317 | "\n",
|
290 | 318 | "\n",
|
291 |
| - "statespace = pygsti.baseobjs.ExplicitStateSpace([('Qubit',),('Leakage',)],[(2,),(1,)])\n", |
292 |
| - "mdl_2plus1_ideal = pygsti.models.ExplicitOpModel(statespace, 'gm')\n", |
| 319 | + "statespace = pygsti.baseobjs.ExplicitStateSpace([('Qubit',),('Leakage',)], [(2,), (1,)])\n", |
| 320 | + "mdl_2plus1_ideal = pygsti.models.ExplicitOpModel(statespace, 'gm', simulator='matrix')\n", |
293 | 321 | "mdl_2plus1_ideal['rho0'] = rho0\n",
|
294 | 322 | "mdl_2plus1_ideal['Mdefault'] = pygsti.modelmembers.povms.UnconstrainedPOVM([('0',E0),('1',E1)],\n",
|
295 | 323 | " evotype='default', state_space=statespace)\n",
|
296 | 324 | "\n",
|
297 |
| - "mdl_2plus1_ideal['Gi'] = to_2plus1_superop(mdl_2level_ideal['Gi'])\n", |
298 |
| - "mdl_2plus1_ideal['Gx'] = to_2plus1_superop(mdl_2level_ideal['Gx'])\n", |
299 |
| - "mdl_2plus1_ideal['Gy'] = to_2plus1_superop(mdl_2level_ideal['Gy'])" |
| 325 | + "mdl_2plus1_ideal[tuple()] = to_2plus1_superop(mdl_2level_ideal[tuple()])\n", |
| 326 | + "mdl_2plus1_ideal['Gxpi2'] = to_2plus1_superop(mdl_2level_ideal['Gxpi2', 'Qubit'])\n", |
| 327 | + "mdl_2plus1_ideal['Gypi2'] = to_2plus1_superop(mdl_2level_ideal['Gypi2', 'Qubit'])" |
300 | 328 | ]
|
301 | 329 | },
|
302 | 330 | {
|
|
305 | 333 | "metadata": {},
|
306 | 334 | "outputs": [],
|
307 | 335 | "source": [
|
308 |
| - "mdl_2plus1_ideal.sim = \"matrix\" # so we can construct report below\n", |
309 |
| - "results_2plus1 = pygsti.run_long_sequence_gst(ds, mdl_2plus1_ideal, prepfids, measfids,\n", |
310 |
| - " germs, maxLengths, verbosity=2,\n", |
| 336 | + "# We have found out prep fids, meas fids, and germs, as well as simulated noisy data, for the 3 level model\n", |
| 337 | + "# If we want to run GST on another model, we need to get versions of the circuits will the correct state space labels\n", |
| 338 | + "\n", |
| 339 | + "# We do this in a slightly different/awkward way here for this case since our state space labels are not a single entry\n", |
| 340 | + "# This would not be necessary if we were rebuilding the circuits/dataset from scratch, only hacky since we are reusing the 3-level information\n", |
| 341 | + "def map_2plus1_circuit_linelabels(circuit):\n", |
| 342 | + " return Circuit([Label(l.name) if l.name != \"COMPOUND\" else tuple() for l in circuit.layertup],\n", |
| 343 | + " \"*\", None, not circuit._static)\n", |
| 344 | + "\n", |
| 345 | + "prepfids_2plus1 = [map_2plus1_circuit_linelabels(c) for c in prepfids]\n", |
| 346 | + "measfids_2plus1 = [map_2plus1_circuit_linelabels(c) for c in measfids]\n", |
| 347 | + "germs_2plus1 = [map_2plus1_circuit_linelabels(c) for c in germs]\n", |
| 348 | + "ds_2plus1 = ds.process_circuits(map_2plus1_circuit_linelabels)\n", |
| 349 | + "\n", |
| 350 | + "results_2plus1 = pygsti.run_long_sequence_gst(ds_2plus1, mdl_2plus1_ideal, prepfids_2plus1, measfids_2plus1,\n", |
| 351 | + " germs_2plus1, maxLengths, verbosity=2,\n", |
311 | 352 | " advanced_options={\"starting_point\": \"target\",\n",
|
312 | 353 | " \"tolerance\": 1e-8, # (lowering tolerance from 1e-6 gave a better fit)\n",
|
313 | 354 | " \"estimate_label\": \"kite\"})"
|
|
324 | 365 | "outputs": [],
|
325 | 366 | "source": [
|
326 | 367 | "# TODO: This is currently broken\n",
|
327 |
| - "pygsti.report.construct_standard_report(\n", |
328 |
| - " {'two-level': results_2level, 'three-level': results_3level_leakage_basis,\n", |
329 |
| - " 'two+one level': results_2plus1},\n", |
330 |
| - " \"Leakage Example Report\"\n", |
331 |
| - ").write_html('example_files/leakage_report', autosize='none')" |
| 368 | + "pygsti.report.construct_standard_report(results_2plus1,\"2+1 Leakage Example Report\"\n", |
| 369 | + ").write_html('example_files/leakage_report_2plus1', autosize='none')" |
332 | 370 | ]
|
333 | 371 | },
|
334 | 372 | {
|
|
341 | 379 | ],
|
342 | 380 | "metadata": {
|
343 | 381 | "kernelspec": {
|
344 |
| - "display_name": "leakage_models", |
| 382 | + "display_name": "pygsti", |
345 | 383 | "language": "python",
|
346 |
| - "name": "leakage_models" |
| 384 | + "name": "python3" |
347 | 385 | },
|
348 | 386 | "language_info": {
|
349 | 387 | "codemirror_mode": {
|
|
355 | 393 | "name": "python",
|
356 | 394 | "nbconvert_exporter": "python",
|
357 | 395 | "pygments_lexer": "ipython3",
|
358 |
| - "version": "3.9.13" |
| 396 | + "version": "3.11.5" |
359 | 397 | }
|
360 | 398 | },
|
361 | 399 | "nbformat": 4,
|
|
0 commit comments