Beispiel #1
0
    def test_circular_SQRTISWAP(self):
        """
        Circular Spin Chain Setup: compare unitary matrix for SQRTISWAP and
        propogator matrix of the implemented physical model.
        """
        N = 3

        qc = QubitCircuit(N)
        qc.add_gate("SQRTISWAP", targets=[0, 1])
        U_ideal = gate_sequence_product(qc.propagators())

        p = CircularSpinChain(N, correct_global_phase=True)
        U_list = p.run(qc)
        U_physical = gate_sequence_product(U_list)

        assert_((U_ideal - U_physical).norm() < 1e-12)
Beispiel #2
0
    def test_circular_combination(self):
        """
        Linear Spin Chain Setup: compare unitary matrix for ISWAP, SQRTISWAP,
        RX and RY gates and the propogator matrix of the implemented physical
        model.
        """
        N = 3

        qc = QubitCircuit(N)
        qc.add_gate("ISWAP", targets=[0, 1])
        qc.add_gate("SQRTISWAP", targets=[0, 1])
        qc.add_gate("RZ", arg_value=np.pi / 2, arg_label=r"\pi/2", targets=[1])
        qc.add_gate("RX", arg_value=np.pi / 2, arg_label=r"\pi/2", targets=[0])
        U_ideal = gate_sequence_product(qc.propagators())

        p = CircularSpinChain(N, correct_global_phase=True)
        U_list = p.run(qc)
        U_physical = gate_sequence_product(U_list)

        assert_((U_ideal - U_physical).norm() < 1e-12)
Beispiel #3
0
    def test_numerical_evo(self):
        """
        Test run_state with qutip solver
        """
        N = 3
        qc = QubitCircuit(N)
        qc.add_gate("RX", targets=[0], arg_value=np.pi / 2)
        qc.add_gate("CNOT", targets=[0], controls=[1])
        qc.add_gate("ISWAP", targets=[2, 1])
        qc.add_gate("CNOT", targets=[0], controls=[2])
        qc.add_gate("SQRTISWAP", targets=[0, 2])
        qc.add_gate("RZ", arg_value=np.pi / 2, targets=[1])

        # CircularSpinChain
        test = CircularSpinChain(N)
        tlist, coeffs = test.load_circuit(qc)

        init_state = rand_ket(2**N)
        init_state.dims = [[2] * N, [1] * N]
        rho1 = gate_sequence_product([init_state] + qc.propagators())
        result = test.run_state(
            init_state=init_state,
            analytical=False,
            options=Options(store_final_state=True)).final_state
        assert_allclose(
            fidelity(result, rho1),
            1.,
            rtol=1e-6,
            err_msg="Numerical run_state fails in CircularSpinChain")

        # LinearSpinChain
        test = LinearSpinChain(N)
        tlist, coeffs = test.load_circuit(qc)

        init_state = rand_ket(2**N)
        init_state.dims = [[2] * N, [1] * N]
        rho1 = gate_sequence_product([init_state] + qc.propagators())
        result = test.run_state(
            init_state=init_state,
            analytical=False,
            options=Options(store_final_state=True)).final_state
        assert_allclose(fidelity(result, rho1),
                        1.,
                        rtol=1e-6,
                        err_msg="Numerical run_state fails in LinearSpinChain")
    def test_analytical_evo(self):
        """
        Test of run_state with exp(-iHt)
        """
        N = 3
        qc = QubitCircuit(N)
        qc.add_gate("RX", targets=[0], arg_value=np.pi/2)
        qc.add_gate("CNOT", targets=[0], controls=[1])
        qc.add_gate("ISWAP", targets=[2, 1])
        qc.add_gate("CNOT", targets=[0], controls=[2])
        qc.add_gate("SQRTISWAP", targets=[0, 2])
        qc.add_gate("RZ", arg_value=np.pi/2, targets=[1])

        # CircularSpinChain
        test = CircularSpinChain(N)
        tlist, coeffs = test.load_circuit(qc)

        rho0 = rand_ket(2**N)
        rho0.dims = [[2]*N, [1]*N]
        rho1 = gate_sequence_product([rho0] + qc.propagators())
        U_list = test.run_state(
            rho0=rho0, analytical=True)
        result = gate_sequence_product(U_list)
        assert_allclose(
            fidelity(result, rho1), 1., rtol=1e-6,
            err_msg="Analytical run_state fails in CircularSpinChain")

        # LinearSpinChain
        test = LinearSpinChain(N)
        tlist, coeffs = test.load_circuit(qc)

        rho0 = rand_ket(2**N)
        rho0.dims = [[2]*N, [1]*N]
        rho1 = gate_sequence_product([rho0] + qc.propagators())
        U_list = test.run_state(
            rho0=rho0, analytical=True)
        result = gate_sequence_product(U_list)
        assert_allclose(
            fidelity(result, rho1), 1., rtol=1e-6,
            err_msg="Analytical run_state fails in LinearSpinChain")