Пример #1
0
    def test_H2_experiment_perfect(self):
        print('\n')
        #the RHF H2 energy at equilibrium bond length
        E_hf = -1.1166843870661929

        #the H2 qubit hamiltonian
        circ_vec = [
            Circuit(),
            build_circuit('Z_0'),
            build_circuit('Z_1'),
            build_circuit('Z_2'),
            build_circuit('Z_3'),
            build_circuit('Z_0 Z_1'),
            build_circuit('Y_0 X_1 X_2 Y_3'),
            build_circuit('Y_0 Y_1 X_2 X_3'),
            build_circuit('X_0 X_1 Y_2 Y_3'),
            build_circuit('X_0 Y_1 Y_2 X_3'),
            build_circuit('Z_0 Z_2'),
            build_circuit('Z_0 Z_3'),
            build_circuit('Z_1 Z_2'),
            build_circuit('Z_1 Z_3'),
            build_circuit('Z_2 Z_3')
        ]

        coef_vec = [
            -0.098863969784274, 0.1711977489805748, 0.1711977489805748,
            -0.222785930242875, -0.222785930242875, 0.1686221915724993,
            0.0453222020577776, -0.045322202057777, -0.045322202057777,
            0.0453222020577776, 0.1205448220329002, 0.1658670240906778,
            0.1658670240906778, 0.1205448220329002, 0.1743484418396386
        ]

        H2_qubit_hamiltonian = QubitOperator()
        for i in range(len(circ_vec)):
            H2_qubit_hamiltonian.add(coef_vec[i], circ_vec[i])

        # circuit for making HF state
        circ = Circuit()
        circ.add(gate('X', 0, 0))
        circ.add(gate('X', 1, 1))

        TestExperiment = Experiment(4, circ, H2_qubit_hamiltonian, 1000000)
        params2 = []
        avg_energy = TestExperiment.perfect_experimental_avg(params2)
        print('Perfectly Measured H2 Experimental Avg. Energy')
        print(avg_energy)
        print('H2 RHF Energy')
        print(E_hf)

        experimental_error = abs(avg_energy - E_hf)

        assert experimental_error == approx(0, abs=1.0e-14)
Пример #2
0
    def test_op_exp_val_1(self):
        # test direct expectation value measurement
        trial_state = Computer(4)

        trial_prep = [None] * 5
        trial_prep[0] = gate('H', 0, 0)
        trial_prep[1] = gate('H', 1, 1)
        trial_prep[2] = gate('H', 2, 2)
        trial_prep[3] = gate('H', 3, 3)
        trial_prep[4] = gate('cX', 0, 1)

        trial_circ = Circuit()

        #prepare the circuit
        for gate_ in trial_prep:
            trial_circ.add(gate_)

        # use circuit to prepare trial state
        trial_state.apply_circuit(trial_circ)

        # gates needed for [a1^ a2] operator
        X1 = gate('X', 1, 1)
        X2 = gate('X', 2, 2)
        Y1 = gate('Y', 1, 1)
        Y2 = gate('Y', 2, 2)

        # initialize circuits to make operator
        circ1 = Circuit()
        circ1.add(X2)
        circ1.add(Y1)
        circ2 = Circuit()
        circ2.add(Y2)
        circ2.add(Y1)
        circ3 = Circuit()
        circ3.add(X2)
        circ3.add(X1)
        circ4 = Circuit()
        circ4.add(Y2)
        circ4.add(X1)

        #build the quantum operator for [a1^ a2]
        a1_dag_a2 = QubitOperator()
        a1_dag_a2.add(0.0 - 0.25j, circ1)
        a1_dag_a2.add(0.25, circ2)
        a1_dag_a2.add(0.25, circ3)
        a1_dag_a2.add(0.0 + 0.25j, circ4)

        #get direct expectatoin value
        exp = trial_state.direct_op_exp_val(a1_dag_a2)
        assert exp == approx(0.25, abs=2.0e-16)
from pytest import approx
from qforte import Circuit, Computer, gate
import numpy as np

num_qubits = 5
prep_circ = Circuit()
ct_lst = [(4, 3), (4, 2), (4, 1), (4, 0), (3, 2), (3, 1), (3, 0), (2, 1),
          (2, 0), (1, 0)]

for i in range(num_qubits):
    prep_circ.add(gate('H', i, i))

for i in range(num_qubits):
    prep_circ.add(gate('cR', i, i + 1, 1.116 / (i + 1.0)))


def generic_test_circ_vec_builder(qb_list, id):
    circ_vec_tc = [Circuit() for i in range(len(qb_list))]
    circ_vec_ct = [Circuit() for i in range(len(qb_list))]
    for i, pair in enumerate(ct_lst):
        t = pair[0]
        c = pair[1]
        if (id == 'cR'):
            circ_vec_ct[i].add(gate(id, t, c, 3.17 * t * c))
            circ_vec_tc[i].add(gate(id, c, t, 1.41 * t * c))

        else:
            circ_vec_ct[i].add(gate(id, t, c))
            circ_vec_tc[i].add(gate(id, c, t))

    return circ_vec_tc, circ_vec_ct
    def test_circ_op_print(self):

        # initialize empty circuit
        circ1 = Circuit()
        # add (Z1 H2 Y4 X4) Pauli string
        # note: the rightmost gate is applied first
        circ1.add(gate('X', 4))
        circ1.add(gate('Y', 4))
        circ1.add(gate('H', 2))
        circ1.add(gate('Z', 1))

        # test built-in print function
        out = str(circ1)
        assert out == '[Z1 H2 Y4 X4]'

        # test smart_print function
        with patch('sys.stdout', new=StringIO()) as fake_out:
            smart_print(circ1)
            assert fake_out.getvalue(
            ) == '\n Quantum circuit:\n(Z1 H2 Y4 X4) |Ψ>\n'

        # initialize empty circuit
        circ2 = Circuit()
        # add (H1 Y2 S3 I4) Pauli string
        # note: the rightmost gate is applied first
        circ2.add(gate('I', 4))
        circ2.add(gate('S', 3))
        circ2.add(gate('Y', 2))
        circ2.add(gate('H', 1))

        # initialize empty circuit
        circ3 = Circuit()
        # add (X1 Y2 H3 Z4) Pauli string
        # note: the rightmost gate is applied first
        circ3.add(gate('Z', 4))
        circ3.add(gate('H', 3))
        circ3.add(gate('Y', 2))
        circ3.add(gate('X', 1))

        # initialize empty QubitOperator
        q_op = QubitOperator()

        # add u1*circ1 + u2*circ2 + u3*circ3
        u1 = 0.5 + 0.1j
        u2 = -0.5j
        u3 = +0.3

        q_op.add(u1, circ1)
        q_op.add(u2, circ2)
        q_op.add(u3, circ3)

        # test built-in print function
        out = str(q_op)
        assert out == '+0.500000 +0.100000i[Z1 H2 Y4 X4]\n'\
                         '-0.500000j[H1 Y2 S3 I4]\n'\
                         '+0.300000[X1 Y2 H3 Z4]'

        # test smart_print function
        with patch('sys.stdout', new=StringIO()) as fake_out:
            smart_print(q_op)
            assert fake_out.getvalue() == '\n Quantum operator:\n(0.5+0.1j) (Z1 H2 Y4 X4) |Ψ>\n'\
                             '+ (-0-0.5j) (H1 Y2 S3 I4) |Ψ>\n'\
                             '+ (0.3+0j) (X1 Y2 H3 Z4) |Ψ>\n'
Пример #5
0
    def test_circuit(self):
        print('\n')
        num_qubits = 10

        qc1 = Computer(num_qubits)
        qc2 = Computer(num_qubits)

        prep_circ = Circuit()
        circ = Circuit()

        for i in range(num_qubits):
            prep_circ.add(gate('H', i, i))

        for i in range(num_qubits):
            prep_circ.add(gate('cR', i, i + 1, 1.116 / (i + 1.0)))

        for i in range(num_qubits - 1):
            circ.add(gate('cX', i, i + 1))
            circ.add(gate('cX', i + 1, i))
            circ.add(gate('cY', i, i + 1))
            circ.add(gate('cY', i + 1, i))
            circ.add(gate('cZ', i, i + 1))
            circ.add(gate('cZ', i + 1, i))
            circ.add(gate('cR', i, i + 1, 3.14159 / (i + 1.0)))
            circ.add(gate('cR', i + 1, i, 2.17284 / (i + 1.0)))

        qc1.apply_circuit_safe(prep_circ)
        qc2.apply_circuit_safe(prep_circ)

        qc1.apply_circuit_safe(circ)
        qc2.apply_circuit(circ)

        C1 = qc1.get_coeff_vec()
        C2 = qc2.get_coeff_vec()

        diff_vec = [(C1[i] - C2[i]) * np.conj(C1[i] - C2[i])
                    for i in range(len(C1))]
        diff_norm = np.sum(diff_vec)

        print('\nNorm of diff vec |C - Csafe|')
        print('-----------------------------')
        print('   ', diff_norm)
        assert diff_norm == approx(0, abs=1.0e-16)