def test_gradient_H(simulator, power, controlled): qubit = 0 control = 1 angle = Variable(name="angle") variables = {angle: power} H = paulis.X(qubit=qubit) if not controlled: U = gates.H(target=qubit, power=angle) else: U = gates.X(target=control) + gates.H( target=qubit, control=control, power=angle) O = ExpectationValue(U=U, H=H) E = simulate(O, variables=variables, backend=simulator) assert (numpy.isclose(E, -numpy.cos(angle(variables) * (numpy.pi)) / 2 + 0.5, atol=1.e-4)) dO = grad(objective=O, variable=angle) dE = simulate(dO, variables=variables, backend=simulator) assert (numpy.isclose(dE, numpy.pi * numpy.sin(angle(variables) * (numpy.pi)) / 2, atol=1.e-4))
def test_paulistring_sampling_2(backend, case): H = QubitHamiltonian.from_paulistrings(PauliString.from_string(case[0])) U = gates.H(target=1) + gates.H(target=3) + gates.X(target=5) + gates.H( target=5) E = ExpectationValue(H=H, U=U) result = simulate(E, backend=backend, samples=1) assert (isclose(result, case[1], 1.e-4))
def test_gradient_PHASE_HY(simulator, angle_value, controlled, silent=False): angle = Variable(name="angle") variables = {angle: angle_value} qubit = 0 H = paulis.Y(qubit=qubit) if controlled: control = 1 U = gates.X(target=control) + gates.H(target=qubit) + gates.Phase( target=qubit, control=control, phi=angle) + gates.H(target=qubit) else: U = gates.H(target=qubit) + gates.Phase( target=qubit, phi=angle) + gates.H(target=qubit) O = ExpectationValue(U=U, H=H) E = simulate(O, variables=variables, backend=simulator) dO = grad(objective=O, variable='angle') dE = simulate(dO, variables=variables) assert (numpy.isclose(E, -numpy.sin(angle(variables)), atol=1.e-4)) assert (numpy.isclose(dE, -numpy.cos(angle(variables)), atol=1.e-4)) if not silent: print("E =", E) print("-sin(angle)=", -numpy.sin(angle(variables))) print("dE =", dE) print("-cos(angle)=", -numpy.cos(angle(variables)))
def test_rz_phase_flip_0(simulator, p, angle): qubit = 0 H = paulis.Y(qubit) U = gates.H(target=qubit) + gates.Rz(angle=Variable('a'), target=qubit) + gates.H(target=qubit) O = ExpectationValue(U=U, H=H) NM = PhaseFlip(p, 1) E = simulate(O, backend=simulator, variables={'a': angle}, samples=1000, noise=NM) assert (numpy.isclose(E, ((-1. + 2 * p) ** 3) * numpy.sin(angle), atol=1.e-1))
def test_rz_phase_flip_1(simulator, p, angle): U = gates.X(target=0) + gates.H(1) + gates.CRz( control=0, target=1, angle=Variable('a')) + gates.H(1) H = paulis.Z(1) * paulis.I(0) O = ExpectationValue(U, H) NM = PhaseFlip(p, 2) E = simulate(O, backend=simulator, variables={'a': angle}, samples=1, noise=NM) print(E)
def test_rz_phase_flip_0(simulator, p, angle): qubit = 0 H = paulis.Y(qubit) U = gates.H(target=qubit) + gates.Rz(angle=Variable('a'), target=qubit) + gates.H(target=qubit) O = ExpectationValue(U=U, H=H) NM = PhaseFlip(p, 1) E = simulate(O, backend=simulator, variables={'a': angle}, samples=1, noise=NM) print(E)
def test_gradient_deep_H(simulator, power, controls): if controls > 2 and simulator == "qiskit": # does not work yet return qubit = 0 angle = Variable(name="angle") variables = {angle: power} control = [i for i in range(1, controls + 1)] H = paulis.X(qubit=qubit) U = gates.X(target=control) + gates.H( target=qubit, control=control, power=angle) O = ExpectationValue(U=U, H=H) E = simulate(O, variables=variables, backend=simulator) assert (numpy.isclose(E, -numpy.cos(angle(variables) * (numpy.pi)) / 2 + 0.5, atol=1.e-4)) dO = grad(objective=O, variable=angle) dE = simulate(dO, variables=variables, backend=simulator) assert (numpy.isclose(dE, numpy.pi * numpy.sin(angle(variables) * (numpy.pi)) / 2, atol=1.e-4))
def test_hadamard(qubit, init): gate = gates.H(target=qubit) iwfn = QubitWaveFunction.from_int(i=init, n_qubits=qubit + 1) wfn = simulate(gate, initial_state=init) test = 1.0 / numpy.sqrt(2) * (iwfn.apply_qubitoperator(paulis.Z(qubit)) + iwfn.apply_qubitoperator(paulis.X(qubit))) assert (wfn.isclose(test))
def test_phase_damp(simulator, p): qubit = 0 H = paulis.X(qubit) U = gates.H(target=qubit) O = ExpectationValue(U=U, H=H) NM = PhaseDamp(p, 1) E = simulate(O, backend=simulator, samples=1, noise=NM)
def test_phase_flip(simulator, p): qubit = 0 H = paulis.X(qubit) U = gates.H(target=qubit) O = ExpectationValue(U=U, H=H) NM = PhaseFlip(p, 1) E = simulate(O, backend=simulator, samples=1000, noise=NM) assert (numpy.isclose(E, 1.0 - 2 * p, atol=1.e-1))
def test_rz_phase_flip_1(simulator, p, angle): U = gates.X(target=0) + gates.H(1) + gates.CRz(control=0, target=1, angle=Variable('a')) + gates.H(1) H = paulis.Z(1) * paulis.I(0) O = ExpectationValue(U, H) NM = PhaseFlip(p, 2) E = simulate(O, backend=simulator, variables={'a': angle}, samples=1000, noise=NM) print(E) assert (numpy.isclose(E, ((1.0 - 2 * p) ** 2) * numpy.cos(angle), atol=1.e-1))
def test_compile_ch(target, control, power): circuit = gates.H(target=target, control=control, power=power) equivalent_circuit = compile_ch(circuit) equivalent_ch = gates.Ry(target=target, control=None, angle=-numpy.pi / 4) + \ gates.Z(target=target, control=control, power=power) + \ gates.Ry(target=target, control=None, angle=numpy.pi / 4) if control is not None: assert (equivalent_circuit == equivalent_ch)
with open(filename + ".tmp.tex", "w") as file: file.write(latex_header + "\n") file.write("\\begin{document}\n") file.write("\\input{" + filename + "}\n") file.write("\\end{document}\n") with open(filename + "tmp.log", "w") as file: subprocess.call(["pdflatex", str(filename) + ".tmp.tex"], stdout=file) move(filename + ".tmp.pdf", filename + ".pdf") remove(filename + ".tmp.aux") remove(filename + ".tmp.log") remove(filename + ".tmp.tex") if not keep_qpic: remove(filename + ".qpic") if not keep_tex: remove(filename + ".tex") if __name__ == "__main__": circuit = gates.X(0) + gates.H(1) + gates.X(target=0, control=1) + gates.Ry(target=0, control=1, angle="\\theta") + gates.X(target=2, control=[0, 1]) string = export_to_qpic(circuit) print(string) export_to_pdf(circuit, filename="test", keep_qpic=True, keep_tex=True)