def test_kraus_qubits() -> None: kraus = qf.Kraus([qf.X(1), qf.Y(0)]) assert kraus.qubits == (0, 1) kraus = qf.Kraus([qf.X("a"), qf.Y("b")]) assert len(kraus.qubits) == 2 assert kraus.qubit_nb == 2
def test_kraus_qubits(): kraus = qf.Kraus([qf.X(1), qf.Y(0)]) assert kraus.qubits == (0, 1) kraus = qf.Kraus([qf.X('a'), qf.Y('b')]) assert len(kraus.qubits) == 2 assert kraus.qubit_nb == 2
def test_measurement(): rho = qf.zero_state(2).asdensity() chan = qf.H(0).aschannel() rho = chan.evolve(rho) rho = qf.Kraus([qf.P0(0), qf.P1(0)]).aschannel().evolve(rho) K = qf.Kraus([qf.P0(1), qf.P1(1)]) chan = K.aschannel() rho = qf.Kraus([qf.P0(1), qf.P1(1)]).aschannel().evolve(rho) prob = qf.asarray(rho.probabilities()) assert np.allclose(prob, [[0.5, 0], [0.5, 0]]) assert prob[0, 0] * 2 == ALMOST_ONE assert prob[1, 0] * 2 == ALMOST_ONE
def test_measurement() -> None: rho = qf.zero_state(2).asdensity() chan = qf.H(0).aschannel() rho = chan.evolve(rho) rho = qf.Kraus([qf.P0(0), qf.P1(0)]).aschannel().evolve(rho) K = qf.Kraus([qf.P0(1), qf.P1(1)]) _ = K.aschannel() rho = qf.Kraus([qf.P0(1), qf.P1(1)]).aschannel().evolve(rho) prob = rho.probabilities() assert np.allclose(prob, [[0.5, 0], [0.5, 0]]) assert np.isclose(prob[0, 0] * 2, 1.0) assert np.isclose(prob[1, 0] * 2, 1.0)
def test_kraus_complete(): kraus = qf.Kraus([qf.X(1)]) assert qf.kraus_iscomplete(kraus) kraus = qf.Damping(0.1, 0) assert qf.kraus_iscomplete(kraus) assert qf.kraus_iscomplete(qf.Damping(0.1, 0)) assert qf.kraus_iscomplete(qf.Dephasing(0.1, 0)) assert qf.kraus_iscomplete(qf.Depolarizing(0.1, 0))
def test_askraus(): def _roundtrip(kraus): assert qf.kraus_iscomplete(kraus) chan0 = kraus.aschannel() kraus1 = qf.channel_to_kraus(chan0) assert qf.kraus_iscomplete(kraus1) chan1 = kraus1.aschannel() assert qf.channels_close(chan0, chan1) p = 1 - np.exp(-50 / 15000) _roundtrip(qf.Kraus([qf.X(1)])) _roundtrip(qf.Damping(p, 0)) _roundtrip(qf.Depolarizing(0.9, 1))
def test_transpose_map(): # The transpose map is a superoperator that transposes a 1-qubit # density matrix. Not physical. # quant-ph/0202124 ops = [ qf.Gate(np.asarray([[1, 0], [0, 0]])), qf.Gate(np.asarray([[0, 0], [0, 1]])), qf.Gate(np.asarray([[0, 1], [1, 0]]) / np.sqrt(2)), qf.Gate(np.asarray([[0, 1], [-1, 0]]) / np.sqrt(2)) ] kraus = qf.Kraus(ops, weights=(1, 1, 1, -1)) rho0 = qf.random_density(1) rho1 = kraus.evolve(rho0) op0 = qf.asarray(rho0.asoperator()) op1 = qf.asarray(rho1.asoperator()) assert np.allclose(op0.T, op1) # The Choi matrix should be same as SWAP operator choi = kraus.aschannel().choi() choi = qf.asarray(choi) assert np.allclose(choi, qf.asarray(qf.SWAP(0, 2).asoperator()))
def test_transpose_map() -> None: # The transpose map is a superoperator that transposes a 1-qubit # density matrix. Not physical. # quant-ph/0202124 q0 = 0 ops = [ qf.Unitary(np.asarray([[1, 0], [0, 0]]), [q0]), qf.Unitary(np.asarray([[0, 0], [0, 1]]), [q0]), qf.Unitary(np.asarray([[0, 1], [1, 0]]) / np.sqrt(2), [q0]), qf.Unitary(np.asarray([[0, 1], [-1, 0]]) / np.sqrt(2), [q0]), ] kraus = qf.Kraus(ops, weights=(1, 1, 1, -1)) rho0 = qf.random_density(1) rho1 = kraus.evolve(rho0) op0 = rho0.asoperator() op1 = rho1.asoperator() assert np.allclose(op0.T, op1) # The Choi matrix should be same as Swap operator choi = kraus.aschannel().choi() assert np.allclose(choi, qf.Swap(0, 2).asoperator())
def test_kraus_errors(): kraus = qf.Kraus([qf.X(1), qf.Y(0)]) with pytest.raises(TypeError): kraus.asgate()
def test_chan_qubits(): chan = qf.Kraus([qf.X(1), qf.Y(0)]).aschannel() assert chan.qubits == (0, 1) assert chan.qubit_nb == 2
def test_kruas_qubits(): rho = qf.Kraus([qf.P0(0), qf.P1(1)]) assert rho.qubits == (0, 1) assert rho.qubit_nb == 2