Skip to content

Commit

Permalink
make data pipeline more functional
Browse files Browse the repository at this point in the history
  • Loading branch information
natestemen committed Nov 27, 2024
1 parent 2ec9ebc commit 9fd2c9d
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 56 deletions.
28 changes: 28 additions & 0 deletions benchmarks/results/expval-results_2024-11-26_20-28-53.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"uncompiled": {
"expval": 9.324138683375338e-18,
"absoluate_error": 3.453529368990418e-17,
"relative_error": 1.3698417895158195
},
"ucc": {
"expval": 8.673617379884035e-18,
"absoluate_error": 3.388477238641288e-17,
"relative_error": 1.344038873968204
},
"cirq": {
"expval": 1.148929042182889e-15,
"absoluate_error": 1.174140197189418e-15,
"relative_error": 46.57224934301324
},
"qiskit": {
"expval": 6.505213034913027e-19,
"absoluate_error": 2.5861676310020146e-17,
"relative_error": 1.0258029155476154
},
"pytket": {
"expval": 4.336808689942018e-18,
"absoluate_error": 2.954796369647086e-17,
"relative_error": 1.1720194369841022
},
"ideal": -2.5211155006528843e-17
}
116 changes: 60 additions & 56 deletions benchmarks/scripts/expval_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import cirq
import pytket
import qiskit
from cirq.contrib.qasm_import import circuit_from_qasm
from qiskit import qasm2
from qiskit.quantum_info import Operator, Statevector
Expand All @@ -17,80 +18,83 @@
with open("../circuits/qasm2/ucc/prep_select_N10_ghz.qasm") as f:
qasm_string = f.read()

qiskit_circuit = qasm2.loads(qasm_string)
qiskit_circuit.save_density_matrix()

ucc_compiled = ucc_compile(qasm_string, return_format="qiskit")
ucc_compiled.save_density_matrix()
def generate_compiled_circuits(qasm: str) -> dict[str, qiskit.QuantumCircuit]:
"""Compiles the circuit represented in a QASM string using different
compilers before converting them all to Qiskit circuits.
cirq_compiled = cirq.qasm(cirq_compile(circuit_from_qasm(qasm_string)))
cirq_compiled = qasm2.loads(cirq_compiled)
cirq_compiled.save_density_matrix()
Args:
qasm: The QASM string representing the quantum circuit to be compiled.
qiskit_compiled = qiskit_compile(qasm2.loads(qasm_string))
qiskit_compiled.save_density_matrix()
Returns:
A dictionary containing the compiled quantum circuits with keys:
uncompiled, ucc, cirq, qiskit, pytket.
"""
uncompiled_circuit = qasm2.loads(qasm)
qiskit_compiled = qiskit_compile(uncompiled_circuit)
uncompiled_circuit.save_density_matrix()
qiskit_compiled.save_density_matrix()

pytket_compiled = pytket.qasm.circuit_to_qasm_str(
pytket_compile(pytket.qasm.circuit_from_qasm_str(qasm_string))
)
pytket_compiled = qasm2.loads(pytket_compiled)
pytket_compiled.save_density_matrix()
ucc_compiled = ucc_compile(qasm, return_format="qiskit")
ucc_compiled.save_density_matrix()

depolarizing_noise = NoiseModel()
error = depolarizing_error(0.03, 1)
two_qubit_error = depolarizing_error(0.05, 2)
depolarizing_noise.add_all_qubit_quantum_error(error, ["u1", "u2", "u3"])
depolarizing_noise.add_all_qubit_quantum_error(two_qubit_error, ["cx"])
cirq_compiled = cirq.qasm(cirq_compile(circuit_from_qasm(qasm)))
cirq_compiled_qiskit = qasm2.loads(cirq_compiled)
cirq_compiled_qiskit.save_density_matrix()

simulator = AerSimulator(method="density_matrix", noise_model=depolarizing_noise)
pytket_compiled = pytket.qasm.circuit_to_qasm_str(
pytket_compile(pytket.qasm.circuit_from_qasm_str(qasm_string))
)
pytket_compiled_qiskit = qasm2.loads(pytket_compiled)
pytket_compiled_qiskit.save_density_matrix()

return {
"uncompiled": uncompiled_circuit,
"ucc": ucc_compiled,
"cirq": cirq_compiled_qiskit,
"qiskit": qiskit_compiled,
"pytket": pytket_compiled_qiskit,
}


def simulate_density_matrix(circuit: qiskit.QuantumCircuit) -> np.ndarray:
depolarizing_noise = NoiseModel()
error = depolarizing_error(0.03, 1)
two_qubit_error = depolarizing_error(0.05, 2)
depolarizing_noise.add_all_qubit_quantum_error(error, ["u1", "u2", "u3"])
depolarizing_noise.add_all_qubit_quantum_error(two_qubit_error, ["cx"])

simulator = AerSimulator(method="density_matrix", noise_model=depolarizing_noise)
return simulator.run(circuit).result().data()["density_matrix"]


density_matrices = {
compiler: simulate_density_matrix(circuit)
for compiler, circuit in generate_compiled_circuits(qasm_string).items()
}

uncompiled_dm = simulator.run(qiskit_circuit).result().data()["density_matrix"]
ucc_dm = simulator.run(ucc_compiled).result().data()["density_matrix"]
cirq_dm = simulator.run(cirq_compiled).result().data()["density_matrix"]
qiskit_dm = simulator.run(qiskit_compiled).result().data()["density_matrix"]
pytket_dm = simulator.run((pytket_compiled)).result().data()["density_matrix"]

observable = Operator.from_label("ZZZZZZZZZZ")

uncompiled_expval = np.real_if_close(uncompiled_dm.expectation_value(observable)).item()
ucc_expval = np.real_if_close(ucc_dm.expectation_value(observable)).item()
cirq_expval = np.real_if_close(cirq_dm.expectation_value(observable)).item()
qiskit_expval = np.real_if_close(qiskit_dm.expectation_value(observable)).item()
pytket_expval = np.real_if_close(pytket_dm.expectation_value(observable)).item()
expectation_values = {
compiler: np.real_if_close(dm.expectation_value(observable)).item()
for compiler, dm in density_matrices.items()
}


ideal_circuit = qasm2.loads(qasm_string)
ideal_state = Statevector.from_instruction(ideal_circuit)
ideal_expval = np.real_if_close(ideal_state.expectation_value(observable)).item()

results = {
"ideal": ideal_expval,
"uncompiled": {
"expval": uncompiled_expval,
"abs_error": abs(ideal_expval - uncompiled_expval),
"relative_error": abs(ideal_expval - uncompiled_expval) / abs(ideal_expval),
},
"ucc": {
"expval": ucc_expval,
"abs_error": abs(ideal_expval - ucc_expval),
"relative_error": abs(ideal_expval - ucc_expval) / abs(ideal_expval),
},
"cirq": {
"expval": cirq_expval,
"abs_error": abs(ideal_expval - cirq_expval),
"relative_error": abs(ideal_expval - cirq_expval) / abs(ideal_expval),
},
"qiskit": {
"expval": qiskit_expval,
"abs_error": abs(ideal_expval - qiskit_expval),
"relative_error": abs(ideal_expval - qiskit_expval) / abs(ideal_expval),
},
"pytket": {
"expval": pytket_expval,
"abs_error": abs(ideal_expval - pytket_expval),
"relative_error": abs(ideal_expval - pytket_expval) / abs(ideal_expval),
},
compiler: {
"expval": expval,
"absoluate_error": abs(ideal_expval - expval),
"relative_error": abs(ideal_expval - expval) / abs(ideal_expval),
}
for compiler, expval in expectation_values.items()
}
results["ideal"] = ideal_expval
print(results)

filename = f"expval-results_{datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.json"
Expand Down

0 comments on commit 9fd2c9d

Please sign in to comment.