|
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