Exemple #1
0
def test_inverse():
    # Random circuit
    circ = qf.Circuit()
    circ += qf.TY(1 / 2, 0)
    circ += qf.H(0)
    circ += qf.TY(1 / 2, 1)
    circ += qf.TX(1.23123, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.TX(-1 / 2, 1)
    circ += qf.TY(4.71572463191 / pi, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.TX(-2 * 2.74973750579 / pi, 0)
    circ += qf.TX(-2 * 2.74973750579 / pi, 1)

    circ_inv = circ.H

    ket = circ.run()
    qf.print_state(ket)

    ket = circ_inv.run(ket)
    qf.print_state(ket)

    print(ket.qubits)
    print(true_ket().qubits)
    assert qf.states_close(ket, qf.zero_state(2))

    ket = qf.zero_state(2)
    circ.extend(circ_inv)
    ket = circ.run(ket)
    assert qf.states_close(ket, qf.zero_state(2))
def test_CH():
    # Construct a controlled Hadamard gate
    gate = qf.identity_gate(2)

    gate = qf.S(1).H @ gate
    gate = qf.H(1) @ gate
    gate = qf.T(1).H @ gate
    gate = qf.CNOT(0, 1) @ gate
    gate = qf.T(1) @ gate
    gate = qf.H(1) @ gate
    gate = qf.S(1) @ gate

    # Do nothing
    ket = qf.zero_state(2)
    ket = gate.run(ket)
    assert qf.states_close(ket, qf.zero_state(2))

    # Do nothing
    ket = qf.zero_state(2)
    ket = qf.X(0).run(ket)
    ket = gate.run(ket)

    ket = qf.H(1).run(ket)

    ket = qf.X(0).run(ket)
    assert qf.states_close(ket, qf.zero_state(2))
Exemple #3
0
def test_inverse() -> None:
    # Random circuit
    circ = qf.Circuit()
    circ += qf.YPow(1 / 2, 0)
    circ += qf.H(0)
    circ += qf.YPow(1 / 2, 1)
    circ += qf.XPow(1.23123, 1)
    circ += qf.CNot(0, 1)
    circ += qf.XPow(-1 / 2, 1)
    circ += qf.YPow(4.71572463191 / np.pi, 1)
    circ += qf.CNot(0, 1)
    circ += qf.XPow(-2 * 2.74973750579 / np.pi, 0)
    circ += qf.XPow(-2 * 2.74973750579 / np.pi, 1)

    circ_inv = circ.H

    ket = circ.run()
    # qf.print_state(ket)

    ket = circ_inv.run(ket)
    # qf.print_state(ket)

    # print(ket.qubits)
    # print(true_ket().qubits)
    assert qf.states_close(ket, qf.zero_state(2))

    ket = qf.zero_state(2)
    circ += circ_inv
    ket = circ.run(ket)
    assert qf.states_close(ket, qf.zero_state(2))
Exemple #4
0
def test_state_angle() -> None:
    ket0 = qf.random_state(1)
    ket1 = qf.random_state(1)
    qf.state_angle(ket0, ket1)

    assert not qf.states_close(ket0, ket1)
    assert qf.states_close(ket0, ket0)
Exemple #5
0
def test_states_close():
    ket0 = qf.w_state(4)
    ket1 = qf.w_state(3)
    ket2 = qf.w_state(4)

    assert qf.states_close(ket0, ket2)
    assert not qf.states_close(ket0, ket1)
    assert qf.states_close(ket2, ket2)
def test_states_close() -> None:
    ket0 = qf.w_state(4)
    ket1 = qf.w_state(3)
    ket2 = qf.w_state(4)
    ket3 = qf.ghz_state(3)

    assert qf.states_close(ket0, ket2)
    assert not qf.states_close(ket1, ket3)
    assert qf.states_close(ket2, ket2)
Exemple #7
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
Exemple #8
0
def test_belltest():
    prog = qf.Program()
    prog += qf.Call('H', [], [0])
    prog += qf.Call('CNOT', [], [0, 1])
    ket = prog.run()

    assert qf.states_close(ket, qf.ghz_state(2))
Exemple #9
0
def test_join_gates():
    gate = qf.join_gates(qf.H(0), qf.X(1))
    ket = qf.zero_state(2)
    ket = gate.run(ket)
    ket = qf.H(0).run(ket)
    ket = qf.X(1).run(ket)

    assert qf.states_close(ket, qf.zero_state(2))
def test_cirq_simulator() -> None:
    q0, q1, q2 = "q0", "q1", "q2"

    circ0 = qf.Circuit()
    circ0 += qf.I(q0)
    circ0 += qf.I(q1)
    circ0 += qf.I(q2)
    circ0 += qf.X(q1)
    circ0 += qf.Y(q2)

    circ0 += qf.Z(q0)
    circ0 += qf.S(q1)
    circ0 += qf.T(q2)

    circ0 += qf.H(q0)
    circ0 += qf.H(q1)
    circ0 += qf.H(q2)

    circ0 += qf.XPow(0.6, q0)
    circ0 += qf.YPow(0.6, q1)
    circ0 += qf.ZPow(0.6, q2)

    circ0 += qf.XX(0.2, q0, q1)
    circ0 += qf.YY(0.3, q1, q2)
    circ0 += qf.ZZ(0.4, q2, q0)

    circ0 += qf.CZ(q0, q1)
    circ0 += qf.CNot(q0, q1)
    circ0 += qf.Swap(q0, q1)
    circ0 += qf.ISwap(q0, q1)

    circ0 += qf.CCZ(q0, q1, q2)
    circ0 += qf.CCNot(q0, q1, q2)
    circ0 += qf.CSwap(q0, q1, q2)

    ket0 = qf.random_state([q0, q1, q2])
    ket1 = circ0.run(ket0)
    sim = CirqSimulator(circ0)
    ket2 = sim.run(ket0)

    assert ket1.qubits == ket2.qubits

    print(qf.state_angle(ket1, ket2))
    assert qf.states_close(ket1, ket2)

    assert qf.states_close(circ0.run(), sim.run())
Exemple #11
0
def test_ccnot_circuit():
    ket0 = qf.random_state(3)
    ket1 = qf.CCNOT(0, 1, 2).run(ket0)
    ket2 = qf.ccnot_circuit([0, 1, 2]).run(ket0)
    assert qf.states_close(ket1, ket2)

    with pytest.raises(ValueError):
        qf.ccnot_circuit([0, 1, 2, 3])
Exemple #12
0
def test_qsim_simulator() -> None:
    q0, q1, q2 = "q0", "q1", "q2"

    circ0 = qf.Circuit()

    circ0 += qf.I(q0)

    circ0 += qf.H(q0)
    circ0 += qf.Z(q1)
    circ0 += qf.Z(q2)
    circ0 += qf.Z(q1)
    circ0 += qf.S(q1)
    circ0 += qf.T(q2)

    circ0 += qf.H(q0)
    circ0 += qf.H(q2)

    # Waiting for bugfix in qsim
    circ0 += qf.Z(q1)**0.2
    circ0 += qf.X(q1)**0.2
    circ0 += qf.XPow(0.2, q0)
    circ0 += qf.YPow(0.2, q1)
    circ0 += qf.ZPow(0.5, q2)

    circ0 += qf.CZ(q0, q1)
    circ0 += qf.CNot(q0, q1)
    # circ0 += qf.SWAP(q0, q1)   # No SWAP!
    #  circ0 += qf.ISWAP(q0, q1) # Waiting for bugfix in qsim
    circ0 += qf.FSim(0.1, 0.2, q0, q1)

    # No 3-qubit gates

    # Initial state not yet supported in qsim
    # ket0 = qf.random_state([q0, q1, q2])
    ket1 = circ0.run()
    sim = QSimSimulator(circ0)
    ket2 = sim.run()

    assert ket1.qubits == ket2.qubits

    print("QF", ket1)
    print("QS", ket2)

    assert qf.states_close(ket1, ket2)
    assert qf.states_close(circ0.run(), sim.run())
def test_inverse() -> None:
    dag = qf.DAGCircuit(_test_circ())
    inv_dag = dag.H

    ket0 = qf.random_state(2)
    ket1 = dag.run(ket0)
    ket2 = inv_dag.run(ket1)

    assert qf.states_close(ket0, ket2)
Exemple #14
0
def test_gate_run(gatet: Type[qf.StdGate]) -> None:
    gate0 = _randomize_gate(gatet)

    gate1 = qf.Unitary(gate0.tensor, gate0.qubits)
    ket = qf.random_state(gate0.qubits)

    ket0 = gate0.run(ket)
    ket1 = gate1.run(ket)
    assert qf.states_close(ket0, ket1)
def test_initialize() -> None:
    circ = qf.Circuit()
    circ += qf.H(1)
    ket = qf.random_state([0, 1, 2])
    circ += qf.Initialize(ket)

    assert circ.qubits == (0, 1, 2)
    assert qf.states_close(circ.run(), ket)

    assert qf.densities_close(circ.evolve(), ket.asdensity())
Exemple #16
0
def test_defgate_param():
    prog = qf.parse_quil(CP)
    # ket0 = prog.compile()
    # qf.print_state(ket0)
    ket1 = prog.run()
    qf.print_state(ket1)

    ket = qf.zero_state(2)
    ket = qf.X(0).run(ket)
    ket = qf.X(1).run(ket)
    ket = qf.CPHASE(1.0, 0, 1).run(ket)
    qf.print_state(ket)

    assert qf.states_close(ket1, ket)
Exemple #17
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)
Exemple #18
0
def test_identitygate() -> None:
    qubits = [3, 4, 5, 6, 7, 8]
    gate = qf.IdentityGate(qubits)
    ket0 = qf.random_state(qubits)
    ket1 = gate.run(ket0)
    assert qf.states_close(ket0, ket1)

    circ = qf.Circuit(gate.decompose())
    assert len(circ) == 6

    for n in range(1, 6):
        assert qf.IdentityGate(list(range(n))).qubit_nb == n

    assert gate.hamiltonian.is_zero()

    assert gate ** 2 is gate
Exemple #19
0
def test_qsim_translate() -> None:
    q0, q1, q2 = "q0", "q1", "q2"

    circ0 = qf.Circuit()
    circ0 += qf.H(q0)
    circ0 += qf.X(q1)
    circ0 += qf.S_H(q0)
    circ0 += qf.XX(0.2, q0, q1)
    circ0 += qf.Can(0.2, 0.1, 0.4, q0, q2)
    circ0 += qf.Swap(q0, q1)

    ket1 = circ0.run()
    sim = QSimSimulator(circ0, translate=True)
    # print(sim._circuit)
    ket2 = sim.run()

    assert qf.states_close(ket1, ket2)
Exemple #20
0
def test_qaoa_circuit() -> None:
    circ = qf.Circuit()
    circ += qf.Ry(np.pi / 2, 0)
    circ += qf.Rx(np.pi, 0)
    circ += qf.Ry(np.pi / 2, 1)
    circ += qf.Rx(np.pi, 1)
    circ += qf.CNot(0, 1)
    circ += qf.Rx(-np.pi / 2, 1)
    circ += qf.Ry(4.71572463191, 1)
    circ += qf.Rx(np.pi / 2, 1)
    circ += qf.CNot(0, 1)
    circ += qf.Rx(-2 * 2.74973750579, 0)
    circ += qf.Rx(-2 * 2.74973750579, 1)

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

    assert qf.states_close(ket, true_ket())
Exemple #21
0
def test_qaoa_circuit_turns() -> None:
    circ = qf.Circuit()
    circ += qf.YPow(1 / 2, 0)
    circ += qf.XPow(1, 0)
    circ += qf.YPow(1 / 2, 1)
    circ += qf.XPow(1, 1)
    circ += qf.CNot(0, 1)
    circ += qf.XPow(-1 / 2, 1)
    circ += qf.YPow(4.71572463191 / np.pi, 1)
    circ += qf.XPow(1 / 2, 1)
    circ += qf.CNot(0, 1)
    circ += qf.XPow(-2 * 2.74973750579 / np.pi, 0)
    circ += qf.XPow(-2 * 2.74973750579 / np.pi, 1)

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

    assert qf.states_close(ket, true_ket())
Exemple #22
0
def test_qaoa_circuit_turns():
    circ = qf.Circuit()
    circ += qf.TY(1 / 2, 0)
    circ += qf.TX(1, 0)
    circ += qf.TY(1 / 2, 1)
    circ += qf.TX(1, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.TX(-1 / 2, 1)
    circ += qf.TY(4.71572463191 / pi, 1)
    circ += qf.TX(1 / 2, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.TX(-2 * 2.74973750579 / pi, 0)
    circ += qf.TX(-2 * 2.74973750579 / pi, 1)

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

    assert qf.states_close(ket, true_ket())
Exemple #23
0
def test_qaoa_circuit():
    circ = qf.Circuit()
    circ += qf.RY(pi / 2, 0)
    circ += qf.RX(pi, 0)
    circ += qf.RY(pi / 2, 1)
    circ += qf.RX(pi, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.RX(-pi / 2, 1)
    circ += qf.RY(4.71572463191, 1)
    circ += qf.RX(pi / 2, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.RX(-2 * 2.74973750579, 0)
    circ += qf.RX(-2 * 2.74973750579, 1)

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

    assert qf.states_close(ket, true_ket())
Exemple #24
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)
def test_reset() -> None:
    reset = qf.Reset(0, 1, 2)
    ket = qf.random_state([0, 1, 2, 3])
    ket = reset.run(ket)
    assert ket.tensor[1, 1, 0, 0] == 0.0
    assert str(reset) == "Reset 0 1 2"

    reset = qf.Reset()
    ket = qf.random_state([0, 1, 2, 3])
    ket = reset.run(ket)
    assert qf.states_close(ket, qf.zero_state([0, 1, 2, 3]))
    assert str(reset) == "Reset"

    with pytest.raises(TypeError):
        reset.evolve(qf.random_density([0, 1, 3]))

    with pytest.raises(TypeError):
        reset.asgate()

    with pytest.raises(TypeError):
        reset.aschannel()
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)
Exemple #27
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)
Exemple #28
0
def test_qaoa_circuit():
    circ = qf.Circuit()
    circ += qf.RY(pi/2, 0)
    circ += qf.RX(pi, 0)
    circ += qf.RY(pi/2, 1)
    circ += qf.RX(pi, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.RX(-pi/2, 1)
    circ += qf.RY(4.71572463191, 1)
    circ += qf.RX(pi/2, 1)
    circ += qf.CNOT(0, 1)
    circ += qf.RX(-2*2.74973750579, 0)
    circ += qf.RX(-2*2.74973750579, 1)

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

    prog = qf.forest.circuit_to_pyquil(circ)

    qvm = qf.forest.QuantumFlowQVM()
    wf = qvm.load(prog).run().wait().wavefunction()

    state = qf.forest.wavefunction_to_state(wf)
    assert qf.states_close(ket, state)
Exemple #29
0
def test_defgate():
    prog = qf.parse_quil(HADAMARD)
    ket = prog.run()
    qf.print_state(ket)
    assert qf.states_close(ket, qf.ghz_state(1))
Exemple #30
0
def test_control_circuit():
    ccnot = qf.control_circuit([0, 1], qf.X(2))
    ket0 = qf.random_state(3)
    ket1 = qf.CCNOT(0, 1, 2).run(ket0)
    ket2 = ccnot.run(ket0)
    assert qf.states_close(ket1, ket2)