def test_instructions_gate(self): """Test `instructions`.""" sched = Schedule() inst_map = InstructionScheduleMap() inst_map.add(U1Gate(0), 1, sched) inst_map.add(U3Gate(0, 0, 0), 0, sched) instructions = inst_map.instructions for inst in ["u1", "u3"]: self.assertTrue(inst in instructions)
def _define(self): """Calculate a subcircuit that implements this unitary.""" if self.num_qubits == 1: q = QuantumRegister(1, "q") theta, phi, lam = _DECOMPOSER1Q.angles(self.to_matrix()) self.definition = [(U3Gate(theta, phi, lam), [q[0]], [])] elif self.num_qubits == 2: self.definition = two_qubit_cnot_decompose(self.to_matrix()).data else: q = QuantumRegister(self.num_qubits, "q") self.definition = [(isometry.Isometry(self.to_matrix(), 0, 0), q[:], [])]
def test_has_from_mock_gate(self): """Test `has` and `assert_has` from mock data.""" inst_map = FakeOpenPulse2Q().defaults().instruction_schedule_map self.assertTrue(inst_map.has(U1Gate(0), [0])) self.assertTrue(inst_map.has(CXGate(), (0, 1))) self.assertTrue(inst_map.has(U3Gate(0, 0, 0), 0)) self.assertTrue(inst_map.has('measure', [0, 1])) self.assertFalse(inst_map.has(U1Gate(0), [0, 1])) with self.assertRaises(PulseError): inst_map.assert_has('dne', [0]) with self.assertRaises(PulseError): inst_map.assert_has(CXGate(), 100)
def _define(self): """Calculate a subcircuit that implements this unitary.""" if self.num_qubits == 1: q = QuantumRegister(1, "q") qc = QuantumCircuit(q, name=self.name) theta, phi, lam, global_phase = _DECOMPOSER1Q.angles_and_phase(self.to_matrix()) qc._append(U3Gate(theta, phi, lam), [q[0]], []) qc.global_phase = global_phase self.definition = qc elif self.num_qubits == 2: self.definition = two_qubit_cnot_decompose(self.to_matrix()) else: self.definition = qs_decomposition(self.to_matrix())
def _circuit_u321(theta, phi, lam, phase, simplify=True, atol=DEFAULT_ATOL): qr = QuantumRegister(1, "qr") circuit = QuantumCircuit(qr, global_phase=phase) if not simplify: atol = -1.0 if abs(theta) < atol: tot = _mod_2pi(phi + lam, atol) if abs(tot) > atol: circuit._append(U1Gate(tot), [qr[0]], []) elif abs(theta - np.pi / 2) < atol: circuit._append(U2Gate(_mod_2pi(phi, atol), _mod_2pi(lam, atol)), [qr[0]], []) else: circuit._append(U3Gate(theta, _mod_2pi(phi, atol), _mod_2pi(lam, atol)), [qr[0]], []) return circuit
def _define(self): """Calculate a subcircuit that implements this unitary.""" if self.num_qubits == 1: q = QuantumRegister(1, "q") qc = QuantumCircuit(q, name=self.name) theta, phi, lam = _DECOMPOSER1Q.angles(self.to_matrix()) qc._append(U3Gate(theta, phi, lam), [q[0]], []) self.definition = qc elif self.num_qubits == 2: self.definition = two_qubit_cnot_decompose(self.to_matrix()) else: q = QuantumRegister(self.num_qubits, "q") qc = QuantumCircuit(q, name=self.name) qc.append(isometry.Isometry(self.to_matrix(), 0, 0), qargs=q[:]) self.definition = qc
def test_optimize_u3_to_u2(self): """U3(pi/2, 0, pi/4) -> U2(0, pi/4). Basis [u1, u2, u3].""" qr = QuantumRegister(2, 'qr') circuit = QuantumCircuit(qr) circuit.append(U3Gate(np.pi / 2, 0, np.pi / 4), [qr[0]]) expected = QuantumCircuit(qr) expected.append(U2Gate(0, np.pi / 4), [qr[0]]) basis = ['u1', 'u2', 'u3'] passmanager = PassManager() passmanager.append(BasisTranslator(sel, basis)) passmanager.append(Optimize1qGatesDecomposition(basis)) result = passmanager.run(circuit) self.assertEqual(expected, result)
def test_optimize_u3_to_u2(self): """U3(pi/2, 0, pi/4) -> U2(0, pi/4). Basis [u1, u2, u3].""" qr = QuantumRegister(2, "qr") circuit = QuantumCircuit(qr) circuit.append(U3Gate(np.pi / 2, 0, np.pi / 4), [qr[0]]) expected = QuantumCircuit(qr) expected.append(U2Gate(0, np.pi / 4), [qr[0]]) basis = ["u1", "u2", "u3"] passmanager = PassManager() passmanager.append(BasisTranslator(sel, basis)) passmanager.append(Optimize1qGatesDecomposition(basis)) result = passmanager.run(circuit) self.assertEqual(expected, result) msg = f"expected:\n{expected}\nresult:\n{result}" self.assertEqual(expected, result, msg=msg)
def _circuit_u321(theta, phi, lam, phase, simplify=True, atol=DEFAULT_ATOL): rtol = 1e-9 # default is 1e-5, too far from atol=1e-12 circuit = QuantumCircuit(1, global_phase=phase) if simplify and (np.isclose(theta, 0.0, atol=atol, rtol=rtol)): if not np.isclose( phi + lam, [0.0, 2 * np.pi], atol=atol, rtol=rtol).any(): circuit.append(U1Gate(_mod2pi(phi + lam)), [0]) elif simplify and np.isclose(theta, np.pi / 2, atol=atol, rtol=rtol): circuit.append(U2Gate(phi, lam), [0]) else: circuit.append(U3Gate(theta, phi, lam), [0]) return circuit
def _circuit_u321(theta, phi, lam, phase, simplify=True, atol=DEFAULT_ATOL): rtol = 1e-9 # default is 1e-5, too far from atol=1e-12 qr = QuantumRegister(1, 'qr') circuit = QuantumCircuit(qr, global_phase=phase) if simplify and (math.isclose(theta, 0.0, abs_tol=atol, rel_tol=rtol)): phi_lam = phi + lam if not (math.isclose(phi_lam, 0.0, abs_tol=atol, rel_tol=rtol) or math.isclose(phi_lam, 2*np.pi, abs_tol=atol, rel_tol=rtol)): circuit._append(U1Gate(_mod2pi(phi+lam)), [qr[0]], []) elif simplify and math.isclose(theta, np.pi/2, abs_tol=atol, rel_tol=rtol): circuit._append(U2Gate(phi, lam), [qr[0]], []) else: circuit._append(U3Gate(theta, phi, lam), [qr[0]], []) return circuit
def _circuit_u3(theta, phi, lam, phase, simplify=True, atol=DEFAULT_ATOL): # pylint: disable=unused-argument circuit = QuantumCircuit(1, global_phase=phase) circuit.append(U3Gate(theta, phi, lam), [0]) return circuit
def local_rotations_inv(theta1, phi1, lam1, theta2, phi2, lam2): return Operator(U3Gate(-theta1, -lam1, -phi1)).\ expand(Operator(U3Gate(-theta2, -lam2, -phi2)))
def _circuit_u3(theta, phi, lam, phase, simplify=True, atol=DEFAULT_ATOL): # pylint: disable=unused-argument qr = QuantumRegister(1, 'qr') circuit = QuantumCircuit(qr, global_phase=phase) circuit._append(U3Gate(theta, phi, lam), [qr[0]], []) return circuit
from qiskit.circuit import EquivalenceLibrary, Parameter, QuantumCircuit, QuantumRegister from qiskit.circuit.library.standard_gates import U2Gate, U3Gate, HGate, U1Gate, CCXGate, TdgGate, TGate, RZGate, CXGate from qiskit.qasm import pi eq_lib = EquivalenceLibrary() theta = Parameter('theta') phi = Parameter('phi') lamda = Parameter('lamda') u3 = U3Gate(theta, phi, lamda) u2 = U2Gate(theta, phi) u1 = U1Gate(theta) ccx = CCXGate() q = QuantumRegister(1, 'q') equiv_u3 = QuantumCircuit(q) equiv_u3.append(RZGate(phi+(pi/2)), [q[0]], []) equiv_u3.append(HGate(),[q[0]], [] ) equiv_u3.append(RZGate(theta),[q[0]], []) equiv_u3.append(HGate(), [q[0]], []) equiv_u3.append(RZGate(lamda-(pi/2)),[q[0]], 0) eq_lib.add_equivalence(u3, equiv_u3) q = QuantumRegister(1, 'q') equiv_u2 = QuantumCircuit(q) equiv_u2.append(RZGate(theta+(pi/2)), [q[0]], []) equiv_u2.append(HGate(),[q[0]], [] ) equiv_u2.append(RZGate(pi/2),[q[0]], []) equiv_u2.append(HGate(), [q[0]], [])