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())
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]
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))
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 ), }
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]], []) ]: