Esempio n. 1
0
    def test_u2_pulse(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1
        init_state = system.fock()
        target_fidelity = 1 - 1e-6

        for i, qubit in enumerate([q0, q1]):

            # U2(\phi, \lambda) = RZ(\phi) RY(\frac{\pi}{2}) RZ(\lambda)
            for phi_denom in [1, 2, 3, 4]:
                for lam_denom in [1, 2, 3, 4]:
                    seq = QasmSequence(system)
                    ideal = (
                        qubit.Rz(np.pi / phi_denom)
                        * qubit.Ry(np.pi / 2)
                        * qubit.Rz(np.pi / lam_denom)
                    )
                    seq.qasm(
                        f"u2(pi/{phi_denom},pi/{lam_denom}) q[{i}];",
                        unitary=False,
                        append=True,
                    )
                    result = seq.run(init_state)
                    state = result.states[-1]
                    self.assertGreater(
                        fidelity(state, ideal * init_state) ** 2, target_fidelity
                    )
Esempio n. 2
0
    def test_qasm_circuit_unitary(self):
        qreg = self.qreg
        n = len(qreg.active_modes)
        QASM_CIRCUIT = [
            "OPENQASM 2.0;",
            'include "qelib1.inc";',
            "qreg q[{n}];",
            "h q[0];",
            "barrier;",
        ]
        QASM_CIRCUIT.extend([f"CX q[0],q[{i}];" for i in range(1, n)])

        QASM_CIRCUIT = "\n\t".join([""] + QASM_CIRCUIT)

        print("Running the following QASM circuit:")
        print(QASM_CIRCUIT)

        seq = QasmSequence(qreg)
        seq.qasm_circuit(QASM_CIRCUIT, unitary=True, append=True)

        result = seq.run(qreg.ground_state())

        fid = fidelity(result.states[-1], self.ideal_state) ** 2
        print(
            f"Unitary qasm_circuit Bell state fidelity "
            f"(n = {len(qreg.active_modes)}): {fid:.7f}."
        )
        self.assertLess(1 - fid, 1e-6)
Esempio n. 3
0
    def test_idxyzsx_unitary(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            gate = seq.qasm(f"id q[{i}];", append=False)
            self.assertEqual(gate, qubit.I)

            gate = seq.qasm(f"x q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rx(np.pi))

            gate = seq.qasm(f"y q[{i}];", append=False)
            self.assertEqual(gate, qubit.Ry(np.pi))

            gate = seq.qasm(f"z q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rz(np.pi))

            gate = seq.qasm(f"sx q[{i}];", append=False)
            self.assertEqual(gate, np.exp(1j * np.pi / 4) * qubit.Rx(np.pi / 2))

            sdg = qubit.Rz(-np.pi / 2)
            self.assertEqual(sdg, seq.qasm(f"sdg q[{i}];", append=False))
            gate = seq.qasm(f"sx q[{i}];", append=False)
            self.assertEqual(
                gate, np.exp(-1j * np.pi / 4) * sdg * qubit.hadamard() * sdg
            )
Esempio n. 4
0
    def test_qasm_measure(self):
        qreg = self.qreg
        qubits = qreg.active_modes
        seq = QasmSequence(qreg)
        seq.h(qubits[-1], unitary=False)
        seq.x(qubits[-2], unitary=False)
        seq.barrier()

        result = seq.run(qreg.ground_state())
        creg = seq.measure(result.states[-1])
        for c in creg[:-2]:
            self.assertAlmostEqual(c, 0)
        self.assertLess(abs(creg[-2] - 1), 1e-5)
        self.assertLess(abs(creg[-1] - 0.5), 5e-3)
Esempio n. 5
0
    def test_rotations_unitary(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            for denom in [1, 2, 3, 4]:
                gate = seq.qasm(f"rx(pi/{denom}) q[{i}];", append=False)
                self.assertEqual(gate, qubit.Rx(np.pi / denom))

                gate = seq.qasm(f"ry(-pi/{denom}) q[{i}];", append=False)
                self.assertEqual(gate, qubit.Ry(-np.pi / denom))

                gate = seq.qasm(f"rz(pi/{denom}) q[{i}];", append=False)
                self.assertEqual(gate, qubit.Rz(np.pi / denom))

                gate = seq.qasm(f"p(pi/{denom}) q[{i}];", append=False)
                self.assertEqual(gate, qubit.Rz(np.pi / denom))

                # U(\theta, -\pi/2, pi/2) = R_x(\theta)
                self.assertEqual(
                    seq.qasm(f"U(pi/{denom},-pi/2,pi/2) q[{i}];", append=False),
                    qubit.Rx(np.pi / denom),
                )

                # U(\theta, 0, 0) = R_y(\theta)
                self.assertEqual(
                    seq.qasm(f"U(pi/{denom},0,0) q[{i}];", append=False),
                    qubit.Ry(np.pi / denom),
                )
Esempio n. 6
0
    def test_qasm_sequence_unitary(self):
        qreg = self.qreg
        qubits = qreg.active_modes
        seq = QasmSequence(qreg)
        seq.h(qubits[-1], unitary=True)
        seq.barrier()
        for q in qubits[:-1]:
            seq.CX(qubits[-1], q)
        seq.gphase(np.pi / 2)
        result = seq.run(qreg.ground_state())

        fid = fidelity(result.states[-1], self.ideal_state) ** 2
        print(
            f"Unitary qasm sequence Bell state fidelity "
            f"(n = {len(qreg.active_modes)}): {fid:.7f}."
        )
        self.assertLess(1 - fid, 1e-6)
Esempio n. 7
0
    def test_u2_ry_pulse(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1
        init_state = system.fock()
        target_fidelity = 1 - 1e-6

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)
            # U2(0, 0) = RY(\pi/2)
            ideal = qubit.Ry(np.pi / 2)
            seq.qasm(f"u2(0,0) q[{i}];", unitary=False, append=True)
            result = seq.run(init_state)
            state = result.states[-1]
            self.assertGreater(
                fidelity(state, ideal * init_state) ** 2, target_fidelity
            )
Esempio n. 8
0
    def test_u2_unitary(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            # U2(\phi, \lambda) = R(\phi) RY(\frac{\pi}{2}) RZ(\lambda)
            for phi_denom in [1, 2, 3, 4]:
                for lam_denom in [1, 2, 3, 4]:
                    gate = seq.qasm(
                        f"u2(pi/{phi_denom},pi/{lam_denom}) q[{i}];", append=False
                    )
                    ideal = (
                        qubit.Rz(np.pi / phi_denom)
                        * qubit.Ry(np.pi / 2)
                        * qubit.Rz(np.pi / lam_denom)
                    )
                    self.assertEqual(gate, ideal)

            gate = seq.qasm(f"h q[{i}];", append=False)
            self.assertEqual(gate, qubit.hadamard())

            # U2(0, \pi) = H
            # It seems to actually equal -iH...
            self.assertEqual(
                -1j * seq.qasm(f"h q[{i}];", append=False),
                seq.qasm(f"u2(0,pi) q[{i}];", append=False),
            )

            # U2(0, 0) = RY(\pi/2)
            self.assertEqual(
                seq.qasm(f"u2(0,0) q[{i}];", append=False), qubit.Ry(np.pi / 2)
            )

            # U2(-\pi/2, \pi/2) = RX(\pi/2)
            self.assertEqual(
                seq.qasm(f"u2(-pi/2,pi/2) q[{i}];", append=False), qubit.Rx(np.pi / 2)
            )
Esempio n. 9
0
    def test_st_unitary(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            gate = seq.qasm(f"s q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rz(np.pi / 2))

            gate = seq.qasm(f"sdg q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rz(-np.pi / 2))

            gate = seq.qasm(f"t q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rz(np.pi / 4))

            gate = seq.qasm(f"tdg q[{i}];", append=False)
            self.assertEqual(gate, qubit.Rz(-np.pi / 4))
Esempio n. 10
0
    def test_sx_pulse(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1
        init_state = system.fock()
        target_fidelity = 1 - 1e-6

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            # sx
            gate = seq.qasm(f"sx q[{i}];", append=False)
            ideal = np.exp(1j * np.pi / 4) * qubit.Rx(np.pi / 2)
            self.assertEqual(gate, ideal)
            seq.qasm(f"sx q[{i}];", unitary=False, append=True)
            result = seq.run(init_state)
            state = result.states[-1]
            self.assertGreater(
                fidelity(state, ideal * init_state) ** 2, target_fidelity
            )
Esempio n. 11
0
    def test_ry_pulse(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1
        init_state = system.fock()
        target_fidelity = 1 - 1e-6

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            for denom in [1, 2, 3, 4]:
                ideal = qubit.Ry(-np.pi / denom)
                seq.qasm(f"ry(-pi/{denom}) q[{i}];", unitary=False, append=True)
                result = seq.run(init_state)
                state = result.states[-1]
                self.assertGreater(
                    fidelity(state, ideal * init_state) ** 2, target_fidelity
                )
                seq.clear()

                # U(\theta, 0, 0) = R_y(\theta)
                ideal = qubit.Ry(np.pi / denom)
                seq.qasm(f"U(pi/{denom},0,0) q[{i}];", unitary=False, append=True)
                result = seq.run(init_state)
                state = result.states[-1]
                self.assertGreater(
                    fidelity(state, ideal * init_state) ** 2, target_fidelity
                )
                seq.clear()
Esempio n. 12
0
    def test_hadamard_pulse(self):
        system = self.system
        q0 = system.q0
        q1 = system.q1
        init_state = system.fock()
        target_fidelity = 1 - 1e-6

        for i, qubit in enumerate([q0, q1]):

            seq = QasmSequence(system)

            # h
            ideal = qubit.hadamard()
            seq.qasm(f"h q[{i}];", unitary=False, append=True)
            result = seq.run(init_state)
            state = result.states[-1]

            self.assertGreater(
                fidelity(state, ideal * init_state) ** 2, target_fidelity
            )
            seq.clear()

            # U2(0, \pi) = H
            ideal = qubit.hadamard()
            seq.qasm(f"u2(0,pi) q[{i}];", unitary=False, append=True)
            result = seq.run(init_state)
            state = result.states[-1]
            self.assertGreater(
                fidelity(state, ideal * init_state) ** 2, target_fidelity
            )
            seq.clear()