示例#1
0
    def _gate_gradient_dict(gate: Gate) -> List[Tuple[List[complex], List[Instruction]]]:
        r"""Given a parameterized gate U(theta) with derivative
        dU(theta)/dtheta = sum_ia_iU(theta)V_i.
        This function returns a:=[a_0, ...] and V=[V_0, ...]
        Suppose U takes multiple parameters, i.e., U(theta^0, ... theta^k).
        The returned coefficients and gates are ordered accordingly.
        Only parameterized Qiskit gates are supported.

        Args:
            gate: The gate for which the derivative is being computed.

           Returns:
                The coefficients and the gates used for the metric computation for each parameter of
                the respective gates.
                [([a^0], [V^0]) ..., ([a^k], [V^k])]


        Raises:
            OpflowError: If the input gate is controlled by another state but '|1>^{\otimes k}'
            TypeError: If the input gate is not a supported parameterized gate.
        """

        # pylint: disable=too-many-return-statements
        if isinstance(gate, PhaseGate):
            # theta
            return [([0.5j, -0.5j], [IGate(), CZGate()])]
        if isinstance(gate, UGate):
            # theta, lambda, phi
            return [([-0.5j], [CZGate()]), ([-0.5j], [CZGate()]), ([-0.5j], [CZGate()])]
        if isinstance(gate, RXGate):
            # theta
            return [([-0.5j], [CXGate()])]
        if isinstance(gate, RYGate):
            # theta
            return [([-0.5j], [CYGate()])]
        if isinstance(gate, RZGate):
            # theta
            return [([-0.5j], [CZGate()])]
        if isinstance(gate, RXXGate):
            # theta
            cxx_circ = QuantumCircuit(3)
            cxx_circ.cx(0, 1)
            cxx_circ.cx(0, 2)
            cxx = cxx_circ.to_instruction()
            return [([-0.5j], [cxx])]
        if isinstance(gate, RYYGate):
            # theta
            cyy_circ = QuantumCircuit(3)
            cyy_circ.cy(0, 1)
            cyy_circ.cy(0, 2)
            cyy = cyy_circ.to_instruction()
            return [([-0.5j], [cyy])]
        if isinstance(gate, RZZGate):
            # theta
            czz_circ = QuantumCircuit(3)
            czz_circ.cz(0, 1)
            czz_circ.cz(0, 2)
            czz = czz_circ.to_instruction()
            return [([-0.5j], [czz])]
        if isinstance(gate, RZXGate):
            # theta
            czx_circ = QuantumCircuit(3)
            czx_circ.cx(0, 2)
            czx_circ.cz(0, 1)
            czx = czx_circ.to_instruction()
            return [([-0.5j], [czx])]
        if isinstance(gate, ControlledGate):
            # TODO support arbitrary control states
            if gate.ctrl_state != 2 ** gate.num_ctrl_qubits - 1:
                raise OpflowError(
                    'Function only support controlled gates with control state `1` on all control '
                    'qubits.')

            base_coeffs_gates = LinComb._gate_gradient_dict(gate.base_gate)
            coeffs_gates = []
            # The projectors needed for the gradient of a controlled gate are integrated by a sum
            # of gates.
            # The following line generates the decomposition gates.

            proj_gates_controlled = [[(-1) ** p.count(ZGate()), p] for p in
                                     product([IGate(), ZGate()],
                                             repeat=gate.num_ctrl_qubits)]
            for base_coeffs, base_gates in base_coeffs_gates:  # loop over parameters
                coeffs = []
                gates = []
                for phase, proj_gates in proj_gates_controlled:
                    coeffs.extend([phase * c / (2 ** gate.num_ctrl_qubits) for c in base_coeffs])
                    for base_gate in base_gates:
                        controlled_circ = QuantumCircuit(gate.num_ctrl_qubits + gate.num_qubits)
                        for i, proj_gate in enumerate(proj_gates):
                            if isinstance(proj_gate, ZGate):
                                controlled_circ.cz(0, i + 1)
                        if not isinstance(base_gate, IGate):
                            controlled_circ.append(base_gate, [0, range(gate.num_ctrl_qubits + 1,
                                                                        gate.num_ctrl_qubits +
                                                                        gate.num_qubits)])
                        gates.append(controlled_circ.to_instruction())
                c_g = (coeffs, gates)
                coeffs_gates.append(c_g)
            return coeffs_gates

        raise TypeError('Unrecognized parameterized gate, {}'.format(gate))
from qiskit.quantum_info.synthesis.xx_decompose import XXDecomposer
from qiskit.quantum_info.synthesis.two_qubit_decompose import TwoQubitBasisDecomposer
from qiskit.circuit.parameter import Parameter
from qiskit.circuit.library.standard_gates import (
    iSwapGate,
    CXGate,
    CZGate,
    RXXGate,
    RZXGate,
    ECRGate,
)
from qiskit.transpiler.passes.synthesis import plugin
from qiskit.providers.models import BackendProperties

KAK_GATE_NAMES = {
    "cx": CXGate(),
    "cz": CZGate(),
    "iswap": iSwapGate(),
    "rxx": RXXGate(pi / 2),
    "ecr": ECRGate(),
    "rzx": RZXGate(pi / 4),  # typically pi/6 is also available
}


def _choose_kak_gate(basis_gates):
    """Choose the first available 2q gate to use in the KAK decomposition."""
    kak_gate = None
    kak_gates = set(basis_gates or []).intersection(KAK_GATE_NAMES.keys())
    if kak_gates:
        kak_gate = KAK_GATE_NAMES[kak_gates.pop()]
    def _find_decomposer_2q_from_target(self, target, qubits, pulse_optimize):
        qubits_tuple = tuple(qubits)
        reverse_tuple = (qubits[1], qubits[0])
        if qubits_tuple in self._decomposer_cache:
            return self._decomposer_cache[qubits_tuple]

        matching = {}
        reverse = {}
        kak_gates = _find_matching_kak_gates(target)
        euler_basis_gates = _find_matching_euler_bases(target)
        decomposers_2q = []
        # find all decomposers
        for kak_gate, euler_basis in product(kak_gates, euler_basis_gates):
            gate_name = None
            if isinstance(kak_gate, tuple):
                gate_name = kak_gate[1]
                kak_gate = kak_gate[0]
            if isinstance(kak_gate, RZXGate):
                backup_optimizer = TwoQubitBasisDecomposer(
                    CXGate(),
                    euler_basis=euler_basis,
                    pulse_optimize=pulse_optimize)
                decomposer = XXDecomposer(euler_basis=euler_basis,
                                          backup_optimizer=backup_optimizer)
                if gate_name is not None:
                    decomposer.gate_name = gate_name
                decomposers_2q.append(decomposer)
            elif kak_gate is not None:
                decomposer = TwoQubitBasisDecomposer(
                    kak_gate,
                    euler_basis=euler_basis,
                    pulse_optimize=pulse_optimize)
                if gate_name is not None:
                    decomposer.gate_name = gate_name
                decomposers_2q.append(decomposer)

        # Find lowest error matching or reverse decomposer and use that
        for index, decomposer in enumerate(decomposers_2q):
            gate_name = getattr(decomposer, "gate_name", decomposer.gate.name)
            props_dict = target[gate_name]
            if target.instruction_supported(gate_name, qubits_tuple):
                if props_dict is None or None in props_dict:
                    error = 0.0
                else:
                    error = getattr(props_dict[qubits_tuple], "error", 0.0)
                    if error is None:
                        error = 0.0
                matching[index] = error
            # Skip reverse check if we already have matching
            elif not matching and target.instruction_supported(
                    gate_name, reverse_tuple):
                if props_dict is None or None in props_dict:
                    error = 0.0
                else:
                    error = getattr(props_dict[reverse_tuple], "error", 0.0)
                    if error is None:
                        error = 0.0
                reverse[index] = error
        preferred_direction = None
        if matching:
            preferred_direction = [0, 1]
            min_error_index = min(matching, key=matching.get)
            decomposer2q = decomposers_2q[min_error_index]
        elif reverse:
            preferred_direction = [1, 0]
            min_error_index = min(reverse, key=reverse.get)
            decomposer2q = decomposers_2q[min_error_index]
        # If no matching or reverse direction is found just pick one, if natural direction is
        # enforced it will fail later
        else:
            decomposer2q = decomposers_2q[0]
        self._decomposer_cache[qubits_tuple] = (decomposer2q,
                                                preferred_direction)
        return (decomposer2q, preferred_direction)
        qc.compose(qceuler, [1], inplace=True)

        # TODO: fix the sign problem to avoid correction here
        if cmath.isclose(target_decomposed.unitary_matrix[0, 0],
                         -(Operator(qc).data[0, 0]),
                         abs_tol=atol):
            qc.global_phase += math.pi
        return qc

    def num_basis_gates(self, unitary):
        """Computes the number of basis gates needed in
        a decomposition of input unitary
        """
        unitary = np.asarray(unitary, dtype=complex)
        a, b, c = weyl_coordinates(unitary)[:]
        traces = [
            4 * (math.cos(a) * math.cos(b) * math.cos(c) +
                 1j * math.sin(a) * math.sin(b) * math.sin(c)),
            4 * (math.cos(np.pi / 4 - a) * math.cos(self.basis.b - b) *
                 math.cos(c) + 1j * math.sin(np.pi / 4 - a) *
                 math.sin(self.basis.b - b) * math.sin(c)),
            4 * math.cos(c),
            4,
        ]
        return np.argmax([
            trace_to_fid(traces[i]) * self.basis_fidelity**i for i in range(4)
        ])


two_qubit_cnot_decompose = TwoQubitBasisDecomposer(CXGate())
示例#5
0
def _standard_gate_instruction(instruction, ignore_phase=True):
    """Temporary function to create Instruction objects from a json string,
    which is necessary for creating a new QuantumError object from deprecated
    json-based input. Note that the type of returned object is different from
    the deprecated standard_gate_instruction.
    TODO: to be removed after deprecation period.

    Args:
        instruction (dict): A qobj instruction.
        ignore_phase (bool): Ignore global phase on unitary matrix in
                             comparison to canonical unitary.

    Returns:
        list: a list of (instructions, qubits) equivalent to in input instruction.
    """
    gate = {
        "id": IGate(),
        "x": XGate(),
        "y": YGate(),
        "z": ZGate(),
        "h": HGate(),
        "s": SGate(),
        "sdg": SdgGate(),
        "t": TGate(),
        "tdg": TdgGate(),
        "cx": CXGate(),
        "cz": CZGate(),
        "swap": SwapGate()
    }

    name = instruction.get("name", None)
    qubits = instruction["qubits"]
    if name in gate:
        return [(gate[name], qubits)]

    if name not in ["mat", "unitary", "kraus"]:
        return [instruction]

    params = instruction["params"]
    with warnings.catch_warnings():
        warnings.filterwarnings("ignore",
                                category=DeprecationWarning,
                                module="qiskit.providers.aer.noise.errors.errorutils")

        # Check for single-qubit reset Kraus
        if name == "kraus":
            if len(qubits) == 1:
                superop = SuperOp(Kraus(params))
                # Check if reset to |0>
                reset0 = reset_superop(1)
                if superop == reset0:
                    return [(Reset(), [0])]
                # Check if reset to |1>
                reset1 = reset0.compose(Operator(standard_gate_unitary('x')))
                if superop == reset1:
                    return [(Reset(), [0]), (XGate(), [0])]
            return [instruction]

        # Check single qubit gates
        mat = params[0]
        if len(qubits) == 1:
            # Check clifford gates
            for j in range(24):
                if matrix_equal(
                        mat,
                        single_qubit_clifford_matrix(j),
                        ignore_phase=ignore_phase):
                    return [(gate, [0]) for gate in _CLIFFORD_GATES[j]]
            # Check t gates
            for name in ["t", "tdg"]:
                if matrix_equal(
                        mat,
                        standard_gate_unitary(name),
                        ignore_phase=ignore_phase):
                    return [(gate[name], qubits)]
            # TODO: u1,u2,u3 decomposition
        # Check two qubit gates
        if len(qubits) == 2:
            for name in ["cx", "cz", "swap"]:
                if matrix_equal(
                        mat,
                        standard_gate_unitary(name),
                        ignore_phase=ignore_phase):
                    return [(gate[name], qubits)]
            # Check reversed CX
            if matrix_equal(
                    mat,
                    standard_gate_unitary("cx_10"),
                    ignore_phase=ignore_phase):
                return [(CXGate(), [qubits[1], qubits[0]])]
            # Check 2-qubit Pauli's
            paulis = ["id", "x", "y", "z"]
            for pauli0 in paulis:
                for pauli1 in paulis:
                    pmat = np.kron(
                        standard_gate_unitary(pauli1),
                        standard_gate_unitary(pauli0))
                    if matrix_equal(mat, pmat, ignore_phase=ignore_phase):
                        if pauli0 == "id":
                            return [(gate[pauli1], [qubits[1]])]
                        elif pauli1 == "id":
                            return [(gate[pauli0], [qubits[0]])]
                        else:
                            return [(gate[pauli0], [qubits[0]]), (gate[pauli1], [qubits[1]])]
        # Check three qubit toffoli
        if len(qubits) == 3:
            if matrix_equal(
                    mat,
                    standard_gate_unitary("ccx_012"),
                    ignore_phase=ignore_phase):
                return [(CCXGate(), qubits)]
            if matrix_equal(
                    mat,
                    standard_gate_unitary("ccx_021"),
                    ignore_phase=ignore_phase):
                return [(CCXGate(), [qubits[0], qubits[2], qubits[1]])]
            if matrix_equal(
                    mat,
                    standard_gate_unitary("ccx_120"),
                    ignore_phase=ignore_phase):
                return [(CCXGate(), [qubits[1], qubits[2], qubits[0]])]

    # Else return input in
    return [instruction]
示例#6
0
 def __init__(self, bidirectional=True):
     super().__init__(
         None,
         name="Fake5QV2",
         description="A fake BackendV2 example",
         online_date=datetime.datetime.utcnow(),
         backend_version="0.0.1",
     )
     qubit_properties = [
         QubitProperties(t1=63.48783e-6,
                         t2=112.23246e-6,
                         frequency=5.17538e9),
         QubitProperties(t1=73.09352e-6,
                         t2=126.83382e-6,
                         frequency=5.26722e9),
         QubitProperties(t1=73.09352e-6,
                         t2=126.83382e-6,
                         frequency=5.26722e9),
         QubitProperties(t1=73.09352e-6,
                         t2=126.83382e-6,
                         frequency=5.26722e9),
         QubitProperties(t1=73.09352e-6,
                         t2=126.83382e-6,
                         frequency=5.26722e9),
     ]
     self._target = Target(qubit_properties=qubit_properties)
     self._theta = Parameter("theta")
     self._phi = Parameter("phi")
     self._lam = Parameter("lambda")
     u_props = {
         (0, ): InstructionProperties(duration=5.23e-8, error=0.00038115),
         (1, ): InstructionProperties(duration=4.52e-8, error=0.00032115),
         (2, ): InstructionProperties(duration=5.23e-8, error=0.00038115),
         (3, ): InstructionProperties(duration=4.52e-8, error=0.00032115),
         (4, ): InstructionProperties(duration=4.52e-8, error=0.00032115),
     }
     self._target.add_instruction(UGate(self._theta, self._phi, self._lam),
                                  u_props)
     cx_props = {
         (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115),
         (3, 4): InstructionProperties(duration=5.23e-7, error=0.00098115),
     }
     if bidirectional:
         cx_props[(1, 0)] = InstructionProperties(duration=6.23e-7,
                                                  error=0.00099115)
         cx_props[(4, 3)] = InstructionProperties(duration=7.23e-7,
                                                  error=0.00099115)
     self._target.add_instruction(CXGate(), cx_props)
     measure_props = {
         (0, ): InstructionProperties(duration=6e-6, error=5e-6),
         (1, ): InstructionProperties(duration=1e-6, error=9e-6),
         (2, ): InstructionProperties(duration=6e-6, error=5e-6),
         (3, ): InstructionProperties(duration=1e-6, error=9e-6),
         (4, ): InstructionProperties(duration=1e-6, error=9e-6),
     }
     self._target.add_instruction(Measure(), measure_props)
     ecr_props = {
         (1, 2): InstructionProperties(duration=4.52e-9,
                                       error=0.0000132115),
         (2, 3): InstructionProperties(duration=4.52e-9,
                                       error=0.0000132115),
     }
     if bidirectional:
         ecr_props[(2, 1)] = InstructionProperties(duration=5.52e-9,
                                                   error=0.0000232115)
         ecr_props[(3, 2)] = InstructionProperties(duration=5.52e-9,
                                                   error=0.0000232115)
     self._target.add_instruction(ECRGate(), ecr_props)
     self.options.set_validator("shots", (1, 4096))
示例#7
0
    def __init__(self):
        super().__init__(
            name="FakeMumbaiFractionalCX",
            description="A fake BackendV2 example based on IBM Mumbai",
            online_date=datetime.datetime.utcnow(),
            backend_version="0.0.1",
        )
        dt = 0.2222222222222222e-9
        self._target = Target(dt=dt)
        self._phi = Parameter("phi")
        rz_props = {
            (0,): InstructionProperties(duration=0.0, error=0),
            (1,): InstructionProperties(duration=0.0, error=0),
            (2,): InstructionProperties(duration=0.0, error=0),
            (3,): InstructionProperties(duration=0.0, error=0),
            (4,): InstructionProperties(duration=0.0, error=0),
            (5,): InstructionProperties(duration=0.0, error=0),
            (6,): InstructionProperties(duration=0.0, error=0),
            (7,): InstructionProperties(duration=0.0, error=0),
            (8,): InstructionProperties(duration=0.0, error=0),
            (9,): InstructionProperties(duration=0.0, error=0),
            (10,): InstructionProperties(duration=0.0, error=0),
            (11,): InstructionProperties(duration=0.0, error=0),
            (12,): InstructionProperties(duration=0.0, error=0),
            (13,): InstructionProperties(duration=0.0, error=0),
            (14,): InstructionProperties(duration=0.0, error=0),
            (15,): InstructionProperties(duration=0.0, error=0),
            (16,): InstructionProperties(duration=0.0, error=0),
            (17,): InstructionProperties(duration=0.0, error=0),
            (18,): InstructionProperties(duration=0.0, error=0),
            (19,): InstructionProperties(duration=0.0, error=0),
            (20,): InstructionProperties(duration=0.0, error=0),
            (21,): InstructionProperties(duration=0.0, error=0),
            (22,): InstructionProperties(duration=0.0, error=0),
            (23,): InstructionProperties(duration=0.0, error=0),
            (24,): InstructionProperties(duration=0.0, error=0),
            (25,): InstructionProperties(duration=0.0, error=0),
            (26,): InstructionProperties(duration=0.0, error=0),
        }
        self._target.add_instruction(RZGate(self._phi), rz_props)
        x_props = {
            (0,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00020056469709026198
            ),
            (1,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0004387432040599484
            ),
            (2,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002196765027963209
            ),
            (3,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0003065541555566093
            ),
            (4,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002402026686478811
            ),
            (5,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002162777062721698
            ),
            (6,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00021981280474256117
            ),
            (7,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00018585647396926756
            ),
            (8,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00027053333211825124
            ),
            (9,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002603116226593832
            ),
            (10,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00023827406030798066
            ),
            (11,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024856063217108685
            ),
            (12,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002065075637361354
            ),
            (13,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024898181450337464
            ),
            (14,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00017758796319636606
            ),
            (15,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00016530893922883836
            ),
            (16,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0003213658218204255
            ),
            (17,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024068450432012685
            ),
            (18,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00026676441863976344
            ),
            (19,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00017090891698571018
            ),
            (20,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00021057196071004095
            ),
            (21,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00030445404779882887
            ),
            (22,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00019322295843406375
            ),
            (23,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00030966037392287727
            ),
            (24,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00023570754161126
            ),
            (25,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00018367783963229033
            ),
            (26,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00019630609928571516
            ),
        }
        self._target.add_instruction(XGate(), x_props)
        sx_props = {
            (0,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00020056469709026198
            ),
            (1,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0004387432040599484
            ),
            (2,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002196765027963209
            ),
            (3,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0003065541555566093
            ),
            (4,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002402026686478811
            ),
            (5,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002162777062721698
            ),
            (6,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00021981280474256117
            ),
            (7,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00018585647396926756
            ),
            (8,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00027053333211825124
            ),
            (9,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002603116226593832
            ),
            (10,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00023827406030798066
            ),
            (11,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024856063217108685
            ),
            (12,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0002065075637361354
            ),
            (13,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024898181450337464
            ),
            (14,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00017758796319636606
            ),
            (15,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00016530893922883836
            ),
            (16,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.0003213658218204255
            ),
            (17,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00024068450432012685
            ),
            (18,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00026676441863976344
            ),
            (19,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00017090891698571018
            ),
            (20,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00021057196071004095
            ),
            (21,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00030445404779882887
            ),
            (22,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00019322295843406375
            ),
            (23,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00030966037392287727
            ),
            (24,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00023570754161126
            ),
            (25,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00018367783963229033
            ),
            (26,): InstructionProperties(
                duration=3.5555555555555554e-08, error=0.00019630609928571516
            ),
        }
        self._target.add_instruction(SXGate(), sx_props)
        chunk_size = 16
        cx_props = {
            (0, 1): InstructionProperties(
                duration=101 * chunk_size * dt, error=0.030671121181161276
            ),
            (4, 1): InstructionProperties(
                duration=70 * chunk_size * dt, error=0.014041986073052737
            ),
            (4, 7): InstructionProperties(duration=74 * chunk_size * dt, error=0.0052040275323747),
            (10, 7): InstructionProperties(
                duration=92 * chunk_size * dt, error=0.005625282141655502
            ),
            (10, 12): InstructionProperties(
                duration=84 * chunk_size * dt, error=0.005771827440726435
            ),
            (15, 12): InstructionProperties(
                duration=84 * chunk_size * dt, error=0.0050335609425562755
            ),
            (15, 18): InstructionProperties(
                duration=64 * chunk_size * dt, error=0.0051374141171115495
            ),
            (12, 13): InstructionProperties(
                duration=70 * chunk_size * dt, error=0.011361175954064051
            ),
            (13, 14): InstructionProperties(
                duration=101 * chunk_size * dt, error=0.005231334872256355
            ),
            # From FakeMumbai:
            (1, 0): InstructionProperties(
                duration=4.551111111111111e-07, error=0.030671121181161276
            ),
            (1, 2): InstructionProperties(
                duration=7.395555555555556e-07, error=0.03420291964205785
            ),
            (1, 4): InstructionProperties(
                duration=3.6266666666666663e-07, error=0.014041986073052737
            ),
            (2, 1): InstructionProperties(duration=7.04e-07, error=0.03420291964205785),
            (2, 3): InstructionProperties(
                duration=4.266666666666666e-07, error=0.005618162036535312
            ),
            (3, 2): InstructionProperties(
                duration=3.911111111111111e-07, error=0.005618162036535312
            ),
            (3, 5): InstructionProperties(
                duration=3.5555555555555553e-07, error=0.006954580732294352
            ),
            (5, 3): InstructionProperties(
                duration=3.911111111111111e-07, error=0.006954580732294352
            ),
            (5, 8): InstructionProperties(
                duration=1.3155555555555553e-06, error=0.021905829471073668
            ),
            (6, 7): InstructionProperties(
                duration=2.4177777777777775e-07, error=0.011018069718028878
            ),
            (7, 4): InstructionProperties(
                duration=3.7688888888888884e-07, error=0.0052040275323747
            ),
            (7, 6): InstructionProperties(
                duration=2.7733333333333333e-07, error=0.011018069718028878
            ),
            (7, 10): InstructionProperties(
                duration=4.337777777777778e-07, error=0.005625282141655502
            ),
            (8, 5): InstructionProperties(
                duration=1.351111111111111e-06, error=0.021905829471073668
            ),
            (8, 9): InstructionProperties(
                duration=6.897777777777777e-07, error=0.011889378687341773
            ),
            (8, 11): InstructionProperties(
                duration=5.902222222222222e-07, error=0.009523844852027258
            ),
            (9, 8): InstructionProperties(
                duration=6.542222222222222e-07, error=0.011889378687341773
            ),
            (11, 8): InstructionProperties(
                duration=6.257777777777777e-07, error=0.009523844852027258
            ),
            (11, 14): InstructionProperties(
                duration=4.053333333333333e-07, error=0.004685421425282804
            ),
            (12, 10): InstructionProperties(
                duration=3.9822222222222215e-07, error=0.005771827440726435
            ),
            (12, 15): InstructionProperties(
                duration=4.053333333333333e-07, error=0.0050335609425562755
            ),
            (13, 12): InstructionProperties(
                duration=5.831111111111111e-07, error=0.011361175954064051
            ),
            (14, 11): InstructionProperties(
                duration=3.697777777777778e-07, error=0.004685421425282804
            ),
            (14, 13): InstructionProperties(
                duration=3.5555555555555553e-07, error=0.005231334872256355
            ),
            (14, 16): InstructionProperties(
                duration=3.484444444444444e-07, error=0.0051117141032224755
            ),
            (16, 14): InstructionProperties(
                duration=3.1288888888888885e-07, error=0.0051117141032224755
            ),
            (16, 19): InstructionProperties(
                duration=7.537777777777777e-07, error=0.013736796355458464
            ),
            (17, 18): InstructionProperties(
                duration=2.488888888888889e-07, error=0.007267536233537236
            ),
            (18, 15): InstructionProperties(
                duration=3.413333333333333e-07, error=0.0051374141171115495
            ),
            (18, 17): InstructionProperties(
                duration=2.8444444444444443e-07, error=0.007267536233537236
            ),
            (18, 21): InstructionProperties(
                duration=4.977777777777778e-07, error=0.007718304749257138
            ),
            (19, 16): InstructionProperties(
                duration=7.182222222222222e-07, error=0.013736796355458464
            ),
            (19, 20): InstructionProperties(
                duration=4.266666666666666e-07, error=0.005757038521092134
            ),
            (19, 22): InstructionProperties(
                duration=3.6266666666666663e-07, error=0.004661878013991871
            ),
            (20, 19): InstructionProperties(
                duration=3.911111111111111e-07, error=0.005757038521092134
            ),
            (21, 18): InstructionProperties(
                duration=5.333333333333332e-07, error=0.007718304749257138
            ),
            (21, 23): InstructionProperties(
                duration=3.911111111111111e-07, error=0.007542515578725928
            ),
            (22, 19): InstructionProperties(
                duration=3.271111111111111e-07, error=0.004661878013991871
            ),
            (22, 25): InstructionProperties(
                duration=4.835555555555555e-07, error=0.005536735115231589
            ),
            (23, 21): InstructionProperties(
                duration=4.266666666666666e-07, error=0.007542515578725928
            ),
            (23, 24): InstructionProperties(
                duration=6.613333333333332e-07, error=0.010797784688907186
            ),
            (24, 23): InstructionProperties(
                duration=6.257777777777777e-07, error=0.010797784688907186
            ),
            (24, 25): InstructionProperties(
                duration=4.337777777777778e-07, error=0.006127506135155392
            ),
            (25, 22): InstructionProperties(duration=4.48e-07, error=0.005536735115231589),
            (25, 24): InstructionProperties(
                duration=4.693333333333333e-07, error=0.006127506135155392
            ),
            (25, 26): InstructionProperties(
                duration=3.484444444444444e-07, error=0.0048451525929122385
            ),
            (26, 25): InstructionProperties(
                duration=3.1288888888888885e-07, error=0.0048451525929122385
            ),
        }
        self.target.add_instruction(CXGate(), cx_props)
        # Error and duration the same as CX
        rzx_90_props = {
            (0, 1): InstructionProperties(
                duration=101 * chunk_size * dt, error=0.030671121181161276
            ),
            (4, 1): InstructionProperties(
                duration=70 * chunk_size * dt, error=0.014041986073052737
            ),
            (4, 7): InstructionProperties(duration=74 * chunk_size * dt, error=0.0052040275323747),
            (10, 7): InstructionProperties(
                duration=92 * chunk_size * dt, error=0.005625282141655502
            ),
            (10, 12): InstructionProperties(
                duration=84 * chunk_size * dt, error=0.005771827440726435
            ),
            (15, 12): InstructionProperties(
                duration=84 * chunk_size * dt, error=0.0050335609425562755
            ),
            (15, 18): InstructionProperties(
                duration=64 * chunk_size * dt, error=0.0051374141171115495
            ),
            (12, 13): InstructionProperties(
                duration=70 * chunk_size * dt, error=0.011361175954064051
            ),
            (13, 14): InstructionProperties(
                duration=101 * chunk_size * dt, error=0.005231334872256355
            ),
        }
        self.target.add_instruction(RZXGate(np.pi / 2), rzx_90_props, name="rzx_90")
        rzx_45_props = {
            (0, 1): InstructionProperties(
                duration=52 * chunk_size * dt, error=0.030671121181161276 / 2
            ),
            (4, 1): InstructionProperties(
                duration=37 * chunk_size * dt, error=0.014041986073052737 / 2
            ),
            (4, 7): InstructionProperties(
                duration=40 * chunk_size * dt, error=0.0052040275323747 / 2
            ),
            (10, 7): InstructionProperties(
                duration=46 * chunk_size * dt, error=0.005625282141655502 / 2
            ),
            (10, 12): InstructionProperties(
                duration=45 * chunk_size * dt, error=0.005771827440726435 / 2
            ),
            (15, 12): InstructionProperties(
                duration=42 * chunk_size * dt, error=0.0050335609425562755 / 2
            ),
            (15, 18): InstructionProperties(
                duration=34 * chunk_size * dt, error=0.0051374141171115495 / 2
            ),
            (12, 13): InstructionProperties(
                duration=37 * chunk_size * dt, error=0.011361175954064051 / 2
            ),
            (13, 14): InstructionProperties(
                duration=52 * chunk_size * dt, error=0.005231334872256355 / 2
            ),
        }
        self.target.add_instruction(RZXGate(np.pi / 4), rzx_45_props, name="rzx_45")
        rzx_30_props = {
            (0, 1): InstructionProperties(
                duration=37 * chunk_size * dt, error=0.030671121181161276 / 3
            ),
            (4, 1): InstructionProperties(
                duration=24 * chunk_size * dt, error=0.014041986073052737 / 3
            ),
            (4, 7): InstructionProperties(
                duration=29 * chunk_size * dt, error=0.0052040275323747 / 3
            ),
            (10, 7): InstructionProperties(
                duration=32 * chunk_size * dt, error=0.005625282141655502 / 3
            ),
            (10, 12): InstructionProperties(
                duration=32 * chunk_size * dt, error=0.005771827440726435 / 3
            ),
            (15, 12): InstructionProperties(
                duration=29 * chunk_size * dt, error=0.0050335609425562755 / 3
            ),
            (15, 18): InstructionProperties(
                duration=26 * chunk_size * dt, error=0.0051374141171115495 / 3
            ),
            (12, 13): InstructionProperties(
                duration=24 * chunk_size * dt, error=0.011361175954064051 / 3
            ),
            (13, 14): InstructionProperties(
                duration=377 * chunk_size * dt, error=0.005231334872256355 / 3
            ),
        }
        self.target.add_instruction(RZXGate(np.pi / 6), rzx_30_props, name="rzx_30")
        reset_props = {(i,): InstructionProperties(duration=3676.4444444444443) for i in range(27)}
        self._target.add_instruction(Reset(), reset_props)

        meas_props = {
            (0,): InstructionProperties(duration=3.552e-06, error=0.02089999999999992),
            (1,): InstructionProperties(duration=3.552e-06, error=0.020199999999999996),
            (2,): InstructionProperties(duration=3.552e-06, error=0.014100000000000001),
            (3,): InstructionProperties(duration=3.552e-06, error=0.03710000000000002),
            (4,): InstructionProperties(duration=3.552e-06, error=0.015100000000000002),
            (5,): InstructionProperties(duration=3.552e-06, error=0.01869999999999994),
            (6,): InstructionProperties(duration=3.552e-06, error=0.013000000000000012),
            (7,): InstructionProperties(duration=3.552e-06, error=0.02059999999999995),
            (8,): InstructionProperties(duration=3.552e-06, error=0.06099999999999994),
            (9,): InstructionProperties(duration=3.552e-06, error=0.02950000000000008),
            (10,): InstructionProperties(duration=3.552e-06, error=0.040000000000000036),
            (11,): InstructionProperties(duration=3.552e-06, error=0.017299999999999982),
            (12,): InstructionProperties(duration=3.552e-06, error=0.04410000000000003),
            (13,): InstructionProperties(duration=3.552e-06, error=0.017199999999999993),
            (14,): InstructionProperties(duration=3.552e-06, error=0.10119999999999996),
            (15,): InstructionProperties(duration=3.552e-06, error=0.07840000000000003),
            (16,): InstructionProperties(duration=3.552e-06, error=0.014499999999999957),
            (17,): InstructionProperties(duration=3.552e-06, error=0.021299999999999986),
            (18,): InstructionProperties(duration=3.552e-06, error=0.022399999999999975),
            (19,): InstructionProperties(duration=3.552e-06, error=0.01859999999999995),
            (20,): InstructionProperties(duration=3.552e-06, error=0.02859999999999996),
            (21,): InstructionProperties(duration=3.552e-06, error=0.021600000000000064),
            (22,): InstructionProperties(duration=3.552e-06, error=0.030200000000000005),
            (23,): InstructionProperties(duration=3.552e-06, error=0.01970000000000005),
            (24,): InstructionProperties(duration=3.552e-06, error=0.03079999999999994),
            (25,): InstructionProperties(duration=3.552e-06, error=0.04400000000000004),
            (26,): InstructionProperties(duration=3.552e-06, error=0.026800000000000046),
        }
        self.target.add_instruction(Measure(), meas_props)
        self._qubit_properties = {
            0: QubitProperties(
                t1=0.00015987993124584417, t2=0.00016123516590787283, frequency=5073462814.921423
            ),
            1: QubitProperties(
                t1=0.00017271188343294773, t2=3.653713654834547e-05, frequency=4943844681.620448
            ),
            2: QubitProperties(
                t1=7.179635917914033e-05, t2=0.00012399765778639733, frequency=4668157502.363186
            ),
            3: QubitProperties(
                t1=0.0001124203171256432, t2=0.0001879954854434302, frequency=4887315883.214115
            ),
            4: QubitProperties(
                t1=9.568769051084652e-05, t2=6.9955557231525e-05, frequency=5016355075.77537
            ),
            5: QubitProperties(
                t1=9.361326963775646e-05, t2=0.00012561361411231962, frequency=4950539585.866738
            ),
            6: QubitProperties(
                t1=9.735672898365994e-05, t2=0.00012522003396944046, frequency=4970622491.726983
            ),
            7: QubitProperties(
                t1=0.00012117839009784141, t2=0.0001492370106539427, frequency=4889863864.167805
            ),
            8: QubitProperties(
                t1=8.394707006435891e-05, t2=5.5194256398727296e-05, frequency=4769852625.405966
            ),
            9: QubitProperties(
                t1=0.00012392229685657686, t2=5.97129502818714e-05, frequency=4948868138.885028
            ),
            10: QubitProperties(
                t1=0.00011193014813922708, t2=0.00014091085124119432, frequency=4966294754.357908
            ),
            11: QubitProperties(
                t1=0.000124426408667364, t2=9.561432905002298e-05, frequency=4664636564.282378
            ),
            12: QubitProperties(
                t1=0.00012469120424014884, t2=7.1792446286313e-05, frequency=4741461907.952719
            ),
            13: QubitProperties(
                t1=0.00010010942474357871, t2=9.260751861141544e-05, frequency=4879064835.799635
            ),
            14: QubitProperties(
                t1=0.00010793367069728063, t2=0.00020462601085738193, frequency=4774809501.962878
            ),
            15: QubitProperties(
                t1=0.00010814279470918582, t2=0.00014052616328020083, frequency=4860834948.367331
            ),
            16: QubitProperties(
                t1=9.889617874757627e-05, t2=0.00012160357011388956, frequency=4978318747.333388
            ),
            17: QubitProperties(
                t1=8.435212562619916e-05, t2=4.43587633824445e-05, frequency=5000300619.491221
            ),
            18: QubitProperties(
                t1=0.00011719166507869474, t2=5.461866556148401e-05, frequency=4772460318.985625
            ),
            19: QubitProperties(
                t1=0.00013321880066203932, t2=0.0001704632622810825, frequency=4807707035.998121
            ),
            20: QubitProperties(
                t1=9.14192211953385e-05, t2=0.00014298332288799443, frequency=5045028334.669125
            ),
            21: QubitProperties(
                t1=5.548103716494676e-05, t2=9.328101902519704e-05, frequency=4941029753.792485
            ),
            22: QubitProperties(
                t1=0.00017109481586484562, t2=0.00019209594920551097, frequency=4906801587.246266
            ),
            23: QubitProperties(
                t1=0.00010975552427765991, t2=0.00015616813868639905, frequency=4891601685.652732
            ),
            24: QubitProperties(
                t1=0.0001612962696960434, t2=6.940808472789023e-05, frequency=4664347869.784967
            ),
            25: QubitProperties(
                t1=0.00015414506978323392, t2=8.382170181880107e-05, frequency=4742061753.511209
            ),
            26: QubitProperties(
                t1=0.00011828557676958944, t2=0.00016963640893557827, frequency=4961661099.733828
            ),
        }
示例#8
0
equiv_u2.append(HGate(),[q[0]], [] )
equiv_u2.append(RZGate(pi/2),[q[0]], [])
equiv_u2.append(HGate(), [q[0]], [])
equiv_u2.append(RZGate(phi-(pi/2)),[q[0]], 0)
eq_lib.add_equivalence(u2, equiv_u2)

q = QuantumRegister(1, 'q')
equiv_u1 = QuantumCircuit(q)
equiv_u1.append(RZGate(theta), [q[0]], [])
eq_lib.add_equivalence(u1, equiv_u1)

q = QuantumRegister(3, 'q')
equiv_ccx = QuantumCircuit(q)
for inst, qargs, cargs in [
    (HGate(), [q[2]], []),
    (CXGate(), [q[1], q[2]],[]),
    (TdgGate(), [q[2]], []),
    (CXGate(), [q[0],q[2]], []),
    (TGate(), [q[2]], []),
    (CXGate(), [q[1],q[2]], []),
    (TdgGate(), [q[2]], []),
    (CXGate(), [q[0],q[2]], []),
    (CXGate(), [q[0],q[1]], []),
    (TdgGate(), [q[1]], []),
    (CXGate(), [q[0],q[1]], []),
    (TGate(), [q[0]], []),
    (TGate(), [q[1]], []),
    (TGate(), [q[2]], []),
    (HGate(), [q[2]], [])

]: