コード例 #1
0
def test_depolarizing() -> None:
    p = 1.0 - np.exp(-1 / 20)

    chan = qf.Depolarizing(p, 0).aschannel()
    rho0 = qf.Density([[0.5, 0], [0, 0.5]])
    assert qf.densities_close(rho0, chan.evolve(rho0))

    rho0 = qf.random_density(1)
    rho1 = chan.evolve(rho0)
    pr0 = np.real(qf.purity(rho0))
    pr1 = np.real(qf.purity(rho1))
    assert pr0 > pr1

    # Test data extracted from refereneqvm
    rho2 = qf.Density([[0.43328691, 0.48979689], [0.48979689, 0.56671309]])
    rho_test = qf.Density(
        [[0.43762509 + 0.0j, 0.45794666 + 0.0j], [0.45794666 + 0.0j, 0.56237491 + 0.0j]]
    )
    assert qf.densities_close(chan.evolve(rho2), rho_test)

    ket0 = qf.random_state(1)
    qf.Depolarizing(p, 0).run(ket0)

    rho1b = qf.Depolarizing(p, 0).evolve(rho0)
    assert qf.densities_close(rho1, rho1b)
コード例 #2
0
def test_density_angle() -> None:
    rho0 = qf.random_density(1)
    rho1 = qf.random_density(1)
    qf.density_angle(rho0, rho1)

    assert not qf.densities_close(rho0, rho1)
    assert qf.densities_close(rho0, rho0)
コード例 #3
0
def test_amplitude_damping():
    rho = qf.zero_state(1).asdensity()
    p = 1.0 - np.exp(-(50) / 15000)
    chan = qf.Damping(p, 0).aschannel()
    rho1 = chan.evolve(rho)
    assert qf.densities_close(rho, rho1)

    rho2 = qf.X(0).aschannel().evolve(rho1)
    rho3 = chan.evolve(rho2)

    expected = qf.Density([[0.00332778 + 0.j, 0.00000000 + 0.j],
                           [0.00000000 + 0.j, 0.99667222 + 0.j]])
    assert qf.densities_close(expected, rho3)
コード例 #4
0
def test_kraus_evolve():
    rho = qf.zero_state(1).asdensity()
    p = 1 - np.exp(-50 / 15000)
    kraus = qf.Damping(p, 0)
    rho1 = kraus.evolve(rho)
    assert qf.densities_close(rho, rho1)

    rho2 = qf.X(0).aschannel().evolve(rho1)
    rho3 = kraus.evolve(rho2)

    expected = qf.Density([[0.00332778 + 0.j, 0.00000000 + 0.j],
                           [0.00000000 + 0.j, 0.99667222 + 0.j]])

    assert qf.densities_close(expected, rho3)
コード例 #5
0
def test_ccnot_circuit_evolve():
    rho0 = qf.random_state(3).asdensity()
    rho1 = qf.CCNOT(0, 1, 2).evolve(rho0)
    rho2 = qf.ccnot_circuit([0, 1, 2]).evolve(rho0)
    assert qf.densities_close(rho1, rho2)

    qf.ccnot_circuit([0, 1, 2]).evolve()
コード例 #6
0
def test_ccnot_circuit_evolve() -> None:
    rho0 = qf.random_state(3).asdensity()
    gate = qf.CCNot(0, 1, 2)
    circ = qf.Circuit(qf.translate_ccnot_to_cnot(gate))
    rho1 = gate.evolve(rho0)
    rho2 = circ.evolve(rho0)
    assert qf.densities_close(rho1, rho2)
コード例 #7
0
def test_identity():
    chan = qf.identity_gate(1).aschannel()
    rho = qf.random_density(2)
    after = chan.evolve(rho)
    assert qf.densities_close(rho, after)

    assert chan.name == 'Channel'
コード例 #8
0
def test_identity() -> None:
    chan = qf.IdentityGate([1]).aschannel()
    rho = qf.random_density(2)
    after = chan.evolve(rho)
    assert qf.densities_close(rho, after)

    assert chan.name == "Channel"
コード例 #9
0
def test_evolve() -> None:
    rho0 = qf.random_state(3).asdensity()
    rho1 = qf.CCNot(0, 1, 2).evolve(rho0)

    dag = qf.DAGCircuit(qf.translate_ccnot_to_cnot(qf.CCNot(0, 1, 2)))
    rho2 = dag.evolve(rho0)

    assert qf.densities_close(rho1, rho2)
コード例 #10
0
def test_gate_evolve(gatet: Type[qf.StdGate]) -> None:
    gate0 = _randomize_gate(gatet)

    gate1 = qf.Unitary(gate0.tensor, gate0.qubits)
    rho = qf.random_density(gate0.qubits)

    rho0 = gate0.evolve(rho)
    rho1 = gate1.evolve(rho)
    assert qf.densities_close(rho0, rho1)
コード例 #11
0
def test_aschannel():
    rho0 = qf.random_state(3).asdensity()
    rho1 = qf.CCNOT(0, 1, 2).evolve(rho0)

    dag = qf.DAGCircuit(qf.ccnot_circuit([0, 1, 2]))
    chan = dag.aschannel()
    rho2 = chan.evolve(rho0)

    assert qf.densities_close(rho1, rho2)
コード例 #12
0
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())
コード例 #13
0
def test_multiswapgate() -> None:
    # Should be same as a swap.
    perm0 = qf.MultiSwapGate([0, 1], [1, 0])
    gate0 = qf.Swap(0, 1)
    assert qf.gates_close(perm0.asgate(), gate0)
    assert qf.gates_close(perm0.asgate(), perm0.H.asgate())

    perm1 = qf.MultiSwapGate.from_gates(qf.Circuit([gate0]))
    assert qf.gates_close(perm0.asgate(), perm1.asgate())

    perm2 = qf.MultiSwapGate.from_gates(qf.Circuit([perm1]))
    assert qf.gates_close(perm0, perm2)

    with pytest.raises(ValueError):
        qf.MultiSwapGate.from_gates(qf.Circuit(qf.CNot(0, 1)))

    N = 8
    qubits_in = list(range(N))
    qubits_out = np.random.permutation(qubits_in)

    permN = qf.MultiSwapGate(qubits_in, qubits_out)
    assert qf.gates_close(perm0.asgate(), perm1.asgate())
    iden = qf.Circuit([permN, permN.H])
    assert qf.almost_identity(iden.asgate())
    assert qf.circuits_close(iden, qf.Circuit([qf.IdentityGate(qubits_in)]))

    swaps = qf.Circuit(permN.decompose())
    # Add identity so we don't lose qubits
    swaps += qf.IdentityGate(permN.qubits_in)
    permN2 = qf.MultiSwapGate.from_gates(swaps)

    assert qf.circuits_close(swaps, qf.Circuit([permN]))
    assert qf.circuits_close(swaps, qf.Circuit([permN2]))
    assert qf.circuits_close(qf.Circuit([permN]), qf.Circuit([permN2]))

    with pytest.raises(ValueError):
        _ = qf.MultiSwapGate([0, 1], [1, 2])

    # Channels
    assert qf.channels_close(perm0.aschannel(), gate0.aschannel())

    rho0 = qf.random_state([0, 1, 3]).asdensity()
    rho1 = perm0.evolve(rho0)
    rho2 = gate0.aschannel().evolve(rho0)
    assert qf.densities_close(rho1, rho2)
コード例 #14
0
def test_kraus_run():
    ket0 = qf.zero_state(['a'])
    ket0 = qf.X('a').run(ket0)
    p = 1.0 - np.exp(-2000 / 15000)

    kraus = qf.Damping(p, 'a')

    reps = 1000
    results = [kraus.run(ket0).asdensity().asoperator() for _ in range(reps)]
    matrix = reduce(add, results) / reps
    rho_kraus = qf.Density(matrix, ['a'])

    rho0 = ket0.asdensity()
    chan = kraus.aschannel()
    rho_chan = chan.evolve(rho0)

    # If this fails occasionally consider increasing tolerance
    # Can't be very tolerant due to stochastic dynamics

    assert qf.densities_close(rho_chan, rho_kraus, tolerance=0.05)
コード例 #15
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)