Source code for oitg.circuits.protocols.gst.specs

r"""Predefined :class:`GSTSpec`\ s corresponding to commonly used gate sets."""

import numpy as np
from itertools import chain
from ...gate import Gate
from .generate import GSTSpec


[docs] def make_1q_xz_pi_2_spec() -> GSTSpec: """Return a single-qubit gate set using π/2 x- and z-rotations, corresponding to pyGSTi's `std1Q_XZ` model. """ x = Gate("rx", (np.pi / 2, ), (0, )) z = Gate("rz", (np.pi / 2, ), (0, )) prep = [(), (x, ), (x, z), (x, x), (x, x, x), (x, z, x, x)] meas = [seq[::-1] for seq in prep] germs = [(x, ), (z, ), (z, x, x), (z, z, x)] return GSTSpec(prep, meas, germs, "std1Q_XZ")
[docs] def make_2q_xy_pi_2_cphase_spec() -> GSTSpec: """Return a two-qubit gate set using a CPHASE (CZ) gate and local π/2 x- and y-rotations, corresponding to pyGSTi's `std2Q_XYCPHASE` model. """ xi = (Gate("rx", (np.pi / 2, ), (0, )), ) ix = (Gate("rx", (np.pi / 2, ), (1, )), ) yi = (Gate("ry", (np.pi / 2, ), (0, )), ) iy = (Gate("ry", (np.pi / 2, ), (1, )), ) cz = (Gate("cz", (), (0, 1)), ) prep = [(), (ix, ), (iy, ), (ix, ix), (xi, ), (xi, ix), (xi, iy), (xi, ix, ix), (yi, ), (yi, ix), (yi, iy), (yi, ix, ix), (xi, xi), (xi, xi, ix), (xi, xi, iy), (xi, xi, ix, ix)] meas = [(), (ix, ), (iy, ), (ix, ix), (xi, ), (yi, ), (xi, xi), (xi, ix), (xi, iy), (yi, ix), (yi, iy)] germs = [ (xi, ), (yi, ), (ix, ), (iy, ), (cz, ), (xi, yi), (ix, iy), (iy, yi), (ix, xi), (ix, yi), (iy, xi), (xi, cz), (yi, cz), (ix, cz), (iy, cz), (xi, xi, yi), (ix, ix, iy), (ix, iy, cz), (xi, yi, yi), (ix, iy, iy), (iy, xi, xi), (iy, xi, yi), (ix, xi, iy), (ix, yi, xi), (ix, yi, iy), (ix, iy, yi), (ix, iy, xi), (iy, yi, xi), (xi, cz, cz), (ix, xi, cz), (ix, cz, cz), (yi, cz, cz), (iy, xi, cz), (iy, yi, cz), (iy, cz, cz), (ix, yi, cz), (cz, ix, xi, xi), (yi, ix, xi, iy), (ix, iy, xi, yi), (ix, ix, ix, iy), (xi, yi, yi, yi), (yi, yi, iy, yi), (yi, ix, ix, ix), (xi, yi, ix, ix), (cz, ix, cz, iy), (ix, xi, yi, cz), (iy, yi, xi, xi, iy), (xi, xi, iy, yi, iy), (iy, ix, xi, ix, xi), (yi, iy, yi, ix, ix), (iy, xi, ix, iy, yi), (iy, iy, xi, yi, xi), (ix, yi, ix, ix, cz), (xi, ix, iy, xi, iy, yi), (xi, iy, ix, yi, ix, ix), (cz, ix, yi, cz, iy, xi), (xi, xi, yi, xi, yi, yi), (ix, ix, iy, ix, iy, iy), (yi, xi, ix, iy, xi, ix), (yi, xi, ix, xi, ix, iy), (xi, ix, iy, iy, xi, yi), (ix, iy, iy, ix, xi, xi), (yi, iy, xi, iy, iy, iy), (yi, yi, yi, iy, yi, ix), (iy, iy, xi, iy, ix, iy), (iy, ix, yi, yi, ix, xi, iy), (yi, xi, iy, xi, ix, xi, yi, iy), (ix, ix, yi, xi, iy, xi, iy, yi) ] def flatten(gs): return [tuple(chain.from_iterable(g)) for g in gs] return GSTSpec(flatten(prep), flatten(meas), flatten(germs), "std2Q_XYCPHASE")
[docs] def make_2q_xy_pi_2_wobble_spec() -> GSTSpec: """Return a two-qubit gate set using a wobble gate and local π/2 x- and y-rotations. Fiducial/germ selection is based on pyGSTi's `std2Q_XYCNOT` model, with CNOT replaced by the wobble gate. As suggested in the pyGSTi documentation, this still leads to a complete set of germs, but might not be optimal. (The CNOT construction was chosen over the CPHASE-based germ set as its germ score was slightly better after switching to the wobble gate; fiducials are only single-qubit and hence the same for both anyway.) """ xi = (Gate("rx", (np.pi / 2, ), (0, )), ) ix = (Gate("rx", (np.pi / 2, ), (1, )), ) yi = (Gate("ry", (np.pi / 2, ), (0, )), ) iy = (Gate("ry", (np.pi / 2, ), (1, )), ) w = (Gate("w", (), (0, 1)), ) prep = [(), (ix, ), (iy, ), (ix, ix), (xi, ), (xi, ix), (xi, iy), (xi, ix, ix), (yi, ), (yi, ix), (yi, iy), (yi, ix, ix), (xi, xi), (xi, xi, ix), (xi, xi, iy), (xi, xi, ix, ix)] meas = [(), (ix, ), (iy, ), (ix, ix), (xi, ), (yi, ), (xi, xi), (xi, ix), (xi, iy), (yi, ix), (yi, iy)] germs = [ (xi, ), (yi, ), (ix, ), (iy, ), (w, ), (xi, yi), (ix, iy), (iy, yi), (ix, xi), (ix, yi), (iy, xi), (iy, w), (yi, w), (xi, w), (ix, w), (xi, xi, yi), (ix, ix, iy), (xi, yi, yi), (ix, iy, iy), (iy, xi, xi), (iy, xi, yi), (ix, xi, iy), (ix, yi, xi), (ix, yi, iy), (ix, iy, yi), (ix, iy, xi), (iy, yi, xi), (iy, w, xi), (ix, ix, w), (xi, w, w), (iy, yi, w), (yi, w, w), (ix, iy, w), (iy, w, w), (w, ix, xi, xi), (yi, ix, xi, iy), (ix, iy, xi, yi), (ix, ix, ix, iy), (xi, yi, yi, yi), (yi, yi, iy, yi), (yi, ix, ix, ix), (xi, yi, ix, ix), (w, yi, w, xi), (w, ix, w, iy), (ix, xi, w, iy), (ix, iy, xi, w), (iy, yi, xi, xi, iy), (xi, xi, iy, yi, iy), (iy, ix, xi, ix, xi), (yi, iy, yi, ix, ix), (iy, xi, ix, iy, yi), (iy, iy, xi, yi, xi), (yi, w, iy, iy, xi), (xi, ix, iy, xi, iy, yi), (xi, iy, ix, yi, ix, ix), (yi, iy, xi, yi, xi, w), (xi, xi, yi, xi, yi, yi), (ix, ix, iy, ix, iy, iy), (yi, xi, ix, iy, xi, ix), (yi, xi, ix, xi, ix, iy), (xi, ix, iy, iy, xi, yi), (ix, iy, iy, ix, xi, xi), (yi, iy, xi, iy, iy, iy), (yi, yi, yi, iy, yi, ix), (iy, iy, xi, iy, ix, iy), (iy, ix, yi, yi, ix, xi, iy), (yi, xi, iy, xi, ix, xi, yi, iy), (ix, ix, yi, xi, iy, xi, iy, yi) ] def flatten(gs): return [tuple(chain.from_iterable(g)) for g in gs] return GSTSpec(flatten(prep), flatten(meas), flatten(germs), "wobble2Q_XYCNOT")
[docs] def make_2q_xz_pi_2_wobble_spec() -> GSTSpec: """Return a two-qubit gate set using a wobble gate and local π/2 x- and z-rotations. Fiducial/germ selection is based on pyGSTi's optimisation functions, run from scratch for the wobble gate. """ xi = (Gate("rx", (np.pi / 2, ), (0, )), ) ix = (Gate("rx", (np.pi / 2, ), (1, )), ) zi = (Gate("rz", (np.pi / 2, ), (0, )), ) iz = (Gate("rz", (np.pi / 2, ), (1, )), ) w = (Gate("w", (), (0, 1)), ) prep = [(), (ix, ), (xi, ), (ix, ix), (ix, iz), (ix, xi), (xi, xi), (xi, zi), (ix, iz, xi), (ix, xi, zi), (xi, ix, ix), (xi, ix, xi), (ix, xi, iz, zi), (ix, xi, xi, iz), (xi, ix, ix, xi), (xi, ix, ix, zi)] meas = [(), (ix, ), (xi, ), (ix, ix), (xi, xi), (iz, ix), (xi, ix), (zi, xi), (ix, zi, xi), (iz, ix, xi), (iz, ix, zi, xi)] germs = [(ix, ), (iz, ), (xi, ), (zi, ), (w, ), (xi, zi), (ix, zi), (iz, zi), (ix, iz, w), (xi, zi, w), (ix, ix, w), (xi, xi, w), (ix, w, zi), (iz, xi, w), (xi, w, zi), (iz, w, xi), (ix, w, iz), (xi, w, w), (ix, zi, w), (ix, iz, iz), (ix, w, w), (ix, iz, zi), (ix, iz, xi), (xi, xi, zi), (ix, zi, iz), (ix, xi, w), (ix, xi, iz), (ix, w, xi), (ix, iz, xi, w), (w, ix, xi, xi), (ix, xi, zi, w), (xi, ix, w, iz), (iz, zi, w), (ix, xi, w, iz), (iz, ix, xi, zi), (w, w, ix, ix), (w, ix, w, iz), (w, xi, zi, xi), (w, w, zi, zi), (zi, xi, xi, w), (xi, zi, zi, xi), (ix, ix, ix, iz), (xi, iz, iz, iz), (iz, iz, zi, iz), (w, zi, w, xi), (zi, zi, ix, xi), (iz, ix, ix, w), (xi, iz, zi, xi), (xi, w, xi, xi), (w, w, xi, w), (iz, ix, ix, zi), (zi, w, w, w), (xi, zi, ix, ix), (xi, zi, iz, iz), (iz, w, w, w), (iz, ix, w, ix), (zi, ix, iz, w, zi), (iz, w, xi, xi, iz), (xi, xi, zi, w, zi), (xi, ix, w, xi, iz), (zi, w, iz, iz, xi), (xi, ix, zi, ix, zi)] def flatten(gs): return [tuple(chain.from_iterable(g)) for g in gs] return GSTSpec(flatten(prep), flatten(meas), flatten(germs), "opt2Q_XZW")