Ejemplo n.º 1
0
def test_addition_circuit():
    # Two bit addition circuit
    circ = qf.addition_circuit([0, 1], [2, 3], [4, 5])

    for c0 in range(0, 2):
        for a0 in range(0, 4):
            for a1 in range(0, 4):
                expected = a0 + a1 + c0
                b0 = int_to_bitlist(a0, 2)
                b1 = int_to_bitlist(a1, 2)
                bc = [c0]
                bits = tuple(b0 + b1 + bc + [0])

                state = np.zeros(shape=[2] * 6)
                state[bits] = 1
                ket = qf.State(state)

                ket = circ.run(ket)
                bits = ket.measure()
                res = bits[[5, 2, 3]]
                res = bitlist_to_int(res)

                print(c0, a0, a1, expected, res)
                assert res == expected

    # Three bit addition circuit
    circ = qf.addition_circuit([0, 1, 2], [3, 4, 5], [6, 7])
    for c0 in range(0, 2):
        for a0 in range(0, 8):
            for a1 in range(0, 8):
                expected = a0 + a1 + c0
                b0 = int_to_bitlist(a0, 3)
                b1 = int_to_bitlist(a1, 3)
                bc = [c0]
                bits = tuple(b0 + b1 + bc + [0])

                state = np.zeros(shape=[2] * 8)
                state[bits] = 1
                ket = qf.State(state)

                ket = circ.run(ket)
                bits = ket.measure()
                res = bits[[7, 3, 4, 5]]
                res = bitlist_to_int(res)

                print(c0, a0, a1, expected, res)
                assert res == expected

    with pytest.raises(ValueError):
        qf.addition_circuit([0, 1, 2], [3, 4, 5, 6], [7, 8])

    with pytest.raises(ValueError):
        qf.addition_circuit([0, 1, 2], [3, 4, 5], [6, 7, 8])
Ejemplo n.º 2
0
def test_qftgate() -> None:
    circ = qf.Circuit()
    circ += qf.X(2)
    circ += qf.QFTGate([0, 1, 2])

    ket = qf.zero_state(3)
    ket = circ.run(ket)

    true_qft = qf.State(
        [
            0.35355339 + 0.0j,
            0.25000000 + 0.25j,
            0.00000000 + 0.35355339j,
            -0.25000000 + 0.25j,
            -0.35355339 + 0.0j,
            -0.25000000 - 0.25j,
            0.00000000 - 0.35355339j,
            0.25000000 - 0.25j,
        ]
    )

    assert qf.states_close(ket, true_qft)

    assert isinstance(qf.QFTGate([0, 1, 2]).H, qf.InvQFTGate)
    assert isinstance(qf.QFTGate([0, 1, 2]).H.H, qf.QFTGate)

    qf.QFTGate([0, 1, 2]).H.tensor
Ejemplo n.º 3
0
def true_ket():
    # Adapted from referenceQVM
    wf_true = np.array([
        0.00167784 + 1.00210180e-05 * 1j, 0.50000000 - 4.99997185e-01 * 1j,
        0.50000000 - 4.99997185e-01 * 1j, 0.00167784 + 1.00210180e-05 * 1j
    ])
    return qf.State(wf_true.reshape((2, 2)))
Ejemplo n.º 4
0
def test_qft():
    circ = qf.Circuit()
    circ += qf.X(2)
    circ.extend(qf.qft_circuit([0, 1, 2]))

    ket = qf.zero_state(3)
    ket = circ.run(ket)

    true_qft = qf.State([
        0.35355339 + 0.j, 0.25000000 + 0.25j, 0.00000000 + 0.35355339j,
        -0.25000000 + 0.25j, -0.35355339 + 0.j, -0.25000000 - 0.25j,
        0.00000000 - 0.35355339j, 0.25000000 - 0.25j
    ])

    assert qf.states_close(ket, true_qft)
Ejemplo n.º 5
0
def test_qaoa_circuit():
    wf_true = [0.00167784 + 1.00210180e-05*1j, 0.50000000 - 4.99997185e-01*1j,
               0.50000000 - 4.99997185e-01*1j, 0.00167784 + 1.00210180e-05*1j]
    prog = qf.Program()
    prog += qf.Call('RY', [np.pi/2], [0])
    prog += qf.Call('RX', [np.pi], [0])
    prog += qf.Call('RY', [np.pi/2], [1])
    prog += qf.Call('RX', [np.pi], [1])
    prog += qf.Call('CNOT', [], [0, 1])
    prog += qf.Call('RX', [-np.pi/2], [1])
    prog += qf.Call('RY', [4.71572463191], [1])
    prog += qf.Call('RX', [np.pi/2], [1])
    prog += qf.Call('CNOT', [], [0, 1])
    prog += qf.Call('RX', [-2*2.74973750579], [0])
    prog += qf.Call('RX', [-2*2.74973750579], [1])

    test_state = prog.run()
    true_state = qf.State(wf_true)
    assert qf.states_close(test_state, true_state)
Ejemplo n.º 6
0
def test_qaoa():
    ket_true = [
        0.00167784 + 1.00210180e-05 * 1j, 0.5 - 4.99997185e-01 * 1j,
        0.5 - 4.99997185e-01 * 1j, 0.00167784 + 1.00210180e-05 * 1j
    ]
    rho_true = qf.State(ket_true).asdensity()

    rho = qf.zero_state(2).asdensity()
    rho = qf.RY(pi / 2, 0).aschannel().evolve(rho)
    rho = qf.RX(pi, 0).aschannel().evolve(rho)
    rho = qf.RY(pi / 2, 1).aschannel().evolve(rho)
    rho = qf.RX(pi, 1).aschannel().evolve(rho)
    rho = qf.CNOT(0, 1).aschannel().evolve(rho)
    rho = qf.RX(-pi / 2, 1).aschannel().evolve(rho)
    rho = qf.RY(4.71572463191, 1).aschannel().evolve(rho)
    rho = qf.RX(pi / 2, 1).aschannel().evolve(rho)
    rho = qf.CNOT(0, 1).aschannel().evolve(rho)
    rho = qf.RX(-2 * 2.74973750579, 0).aschannel().evolve(rho)
    rho = qf.RX(-2 * 2.74973750579, 1).aschannel().evolve(rho)
    assert qf.densities_close(rho, rho_true)
Ejemplo n.º 7
0
def test_memory() -> None:
    ket0 = qf.zero_state(1)
    assert ket0.memory == {}

    ro = ["ro[0]", "ro[1]"]
    ket1 = ket0.store({ro[1]: 1})
    assert ket0.memory == {}
    assert ket1.memory == {ro[1]: 1}

    ket2 = qf.H(0).run(ket1)
    assert ket2.memory == ket1.memory

    ket3 = ket2.store({ro[1]: 0, ro[0]: 0})
    assert ket3.memory == {ro[0]: 0, ro[1]: 0}

    N = 4
    wf = np.zeros(shape=[2] * N)
    wf[(0, ) * N] = 1
    ket = qf.State(wf, list(range(N)), {"a": 2})
    assert ket.memory == {"a": 2}
    assert isinstance(ket.memory, FrozenDict)
Ejemplo n.º 8
0
def test_qubit_qaoa_circuit():
    # Adapted from reference QVM
    wf_true = np.array([
        0.00167784 + 1.00210180e-05 * 1j, 0.50000000 - 4.99997185e-01 * 1j,
        0.50000000 - 4.99997185e-01 * 1j, 0.00167784 + 1.00210180e-05 * 1j
    ])
    ket_true = qf.State(wf_true.reshape((2, 2)))

    ket = qf.zero_state(2)
    ket = qf.RY(pi / 2, 0).run(ket)
    ket = qf.RX(pi, 0).run(ket)
    ket = qf.RY(pi / 2, 1).run(ket)
    ket = qf.RX(pi, 1).run(ket)
    ket = qf.CNOT(0, 1).run(ket)
    ket = qf.RX(-pi / 2, 1).run(ket)
    ket = qf.RY(4.71572463191, 1).run(ket)
    ket = qf.RX(pi / 2, 1).run(ket)
    ket = qf.CNOT(0, 1).run(ket)
    ket = qf.RX(-2 * 2.74973750579, 0).run(ket)
    ket = qf.RX(-2 * 2.74973750579, 1).run(ket)

    assert qf.states_close(ket, ket_true)
Ejemplo n.º 9
0
def test_qaoa_circuit() -> None:
    # Kudos: Adapted from reference QVM
    wf_true = np.array([
        0.00167784 + 1.00210180e-05 * 1j,
        0.50000000 - 4.99997185e-01 * 1j,
        0.50000000 - 4.99997185e-01 * 1j,
        0.00167784 + 1.00210180e-05 * 1j,
    ])
    ket_true = qf.State(wf_true.reshape((2, 2)))

    ket = qf.zero_state(2)
    ket = qf.Ry(np.pi / 2, 0).run(ket)
    ket = qf.Rx(np.pi, 0).run(ket)
    ket = qf.Ry(np.pi / 2, 1).run(ket)
    ket = qf.Rx(np.pi, 1).run(ket)
    ket = qf.CNot(0, 1).run(ket)
    ket = qf.Rx(-np.pi / 2, 1).run(ket)
    ket = qf.Ry(4.71572463191, 1).run(ket)
    ket = qf.Rx(np.pi / 2, 1).run(ket)
    ket = qf.CNot(0, 1).run(ket)
    ket = qf.Rx(-2 * 2.74973750579, 0).run(ket)
    ket = qf.Rx(-2 * 2.74973750579, 1).run(ket)

    assert qf.states_close(ket, ket_true)
Ejemplo n.º 10
0
def test_error() -> None:
    ket = qf.zero_state(4)
    with pytest.raises(ValueError):
        qf.State(ket.tensor, [0, 1, 2])