def test_ccnot(): ket = qf.zero_state(3) ket = qf.CCNOT(0, 1, 2).run(ket) assert ket.vec.asarray()[0, 0, 0] == ALMOST_ONE ket = qf.X(1).run(ket) ket = qf.CCNOT(0, 1, 2).run(ket) assert ket.vec.asarray()[0, 1, 0] == ALMOST_ONE ket = qf.X(0).run(ket) ket = qf.CCNOT(0, 1, 2).run(ket) assert ket.vec.asarray()[1, 1, 1] == ALMOST_ONE
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()
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])
def test_gates_to_latex(): circ = qf.Circuit() circ += qf.I(7) circ += qf.X(0) circ += qf.Y(1) circ += qf.Z(2) circ += qf.H(3) circ += qf.S(4) circ += qf.T(5) circ += qf.S_H(6) circ += qf.T_H(7) circ += qf.RX(-0.5*pi, 0) circ += qf.RY(0.5*pi, 1) circ += qf.RZ((1/3)*pi, 1) circ += qf.RY(0.222, 1) circ += qf.TX(0.5, 0) circ += qf.TY(0.5, 1) circ += qf.TZ(0.4, 1) circ += qf.TZ(0.47276, 1) # Gate with cunning hack gate = qf.RZ(0.4, 1) gate.params['theta'] = qf.Parameter('\\theta') circ += gate circ += qf.CNOT(1, 2) circ += qf.CNOT(2, 1) circ += qf.CZ(1, 3) circ += qf.SWAP(1, 5) circ += qf.ISWAP(4, 2) # circ += qf.Barrier(0, 1, 2, 3, 4, 5, 6) # Not yet supported circ += qf.CCNOT(1, 2, 3) circ += qf.CSWAP(4, 5, 6) circ += qf.P0(0) circ += qf.P1(1) circ += qf.Reset(2) circ += qf.Reset(4, 5, 6) circ += qf.H(4) # circ += qf.Reset() # FIXME. Should fail with clear error message circ += qf.XX(0.25, 1, 3) circ += qf.YY(0.75, 1, 3) circ += qf.ZZ(1/3, 3, 1) circ += qf.Measure(0) latex = qf.circuit_to_latex(circ) print(latex)
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)
def test_gatepow(): gates = [ qf.I(), qf.X(), qf.Y(), qf.Z(), qf.H(), qf.S(), qf.T(), qf.PHASE(0.1), qf.RX(0.2), qf.RY(0.3), qf.RZ(0.4), qf.CZ(), qf.CNOT(), qf.SWAP(), qf.ISWAP(), qf.CPHASE00(0.5), qf.CPHASE01(0.6), qf.CPHASE10(0.6), qf.CPHASE(0.7), qf.PSWAP(0.15), qf.CCNOT(), qf.CSWAP(), qf.TX(2.7), qf.TY(1.2), qf.TZ(0.3), qf.ZYZ(3.5, 0.9, 2.1), qf.CANONICAL(0.1, 0.2, 7.4), qf.XX(1.8), qf.YY(0.9), qf.ZZ(0.45), qf.PISWAP(0.2), qf.EXCH(0.1), qf.TH(0.3) ] for gate in gates: assert qf.gates_close(gate.H, gate**-1) for gate in gates: sqrt_gate = gate**(1 / 2) two_gate = sqrt_gate @ sqrt_gate assert qf.gates_close(gate, two_gate) for gate in gates: gate0 = gate**0.3 gate1 = gate**0.7 gate2 = gate0 @ gate1 assert qf.gates_close(gate, gate2) for K in range(1, 5): gate = qf.random_gate(K) # FIXME: Throw error on K=0 sqrt_gate = gate**0.5 two_gate = sqrt_gate @ sqrt_gate assert qf.gates_close(gate, two_gate) for gate in gates: rgate = qf.Gate((gate**0.5).tensor) tgate = rgate @ rgate assert qf.gates_close(gate, tgate)
def test_unitary_3qubit(): assert qf.almost_unitary(qf.CCNOT()) assert qf.almost_unitary(qf.CNOT()) assert qf.almost_unitary(qf.CSWAP())
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)
def test_control_gate(): assert qf.gates_close(qf.control_gate(1, qf.X(0)), qf.CNOT(1, 0)) assert qf.gates_close(qf.control_gate(0, qf.CNOT(1, 2)), qf.CCNOT(0, 1, 2))