From ea2b542bd5fb030403b496d9cf7bdfda65ff87d3 Mon Sep 17 00:00:00 2001 From: Emil Kovacev Date: Mon, 16 Jun 2025 22:33:47 -0400 Subject: [PATCH 1/3] Adds initial tests for benchmarks --- tests/test_benchmarks.py | 132 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/test_benchmarks.py diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py new file mode 100644 index 0000000..753bb5c --- /dev/null +++ b/tests/test_benchmarks.py @@ -0,0 +1,132 @@ +import pytest + +from qiskit.providers.jobstatus import JobStatus +from qiskit_experiments.framework import AnalysisStatus +from qiskit_ibm_runtime.fake_provider import FakeFez, FakeFractionalBackend + +from qiskit_device_benchmarking.clops.clops_benchmark import create_hardware_aware_circuit +from qiskit_device_benchmarking.mirror_test.mirror_pub import MirrorPubOptions +from qiskit_device_benchmarking.bench_code.bell import CHSHExperiment, BellExperiment +# from qiskit_device_benchmarking.bench_code.dynamic_circuits_rb import DynamicCircuitsRB +# from qiskit_device_benchmarking.bench_code.mcm_rb_experiment import McmRB +from qiskit_device_benchmarking.bench_code.mrb.mirror_qv import MirrorQuantumVolume +from qiskit_device_benchmarking.bench_code.mrb.mirror_rb_experiment import MirrorRB +from qiskit_device_benchmarking.bench_code.prb.pur_rb import PurityRB + + +@pytest.fixture +def backend(): + return FakeFez() + + +def test_clops_hardware_aware_circuit(backend): + qc, params = create_hardware_aware_circuit( + width=100, + layers=100, + backend=backend, + parameterized=False + ) + + assert qc.num_qubits == 100 + assert qc.depth() == 100 + assert not params + + qc, params = create_hardware_aware_circuit( + width=100, + layers=100, + backend=backend, + parameterized=True + ) + + assert qc.num_qubits == 100 + assert qc.depth() == 100 + assert params + + +# def test_mirror_pub(backend): +# pub_options = MirrorPubOptions() +# pub_options.num_qubits = 100 +# pub_options.target_num_2q_gates = 4986 +# pub_options.theta = 0 +# pub_options.path_strategy = "eplg_chain" +# +# pubs = pub_options.get_pubs(backend) +# +# for circuit, obs, params in pubs: +# assert circuit.num_qubits == 100 +# assert circuit.depth() == 4986 + + +def test_chsh_experiment(backend): + exp = CHSHExperiment([0, 1]) + exp_data = exp.run(backend=backend).block_for_results() + s = exp_data.analysis_results("S", dataframe=True).iloc[0] + assert exp_data.job_status() == JobStatus.DONE + assert exp_data.analysis_status() == AnalysisStatus.DONE + assert s.value + + +# This test attempts to open matplotlib, which it should not be doing with this +# code. This code needs to be resolved for the test to be re-introduced. +# +# def test_bell_experiment(backend): +# layered_coupling_map = [[(0, 1), (1, 0)]] +# exp = BellExperiment(layered_coupling_map, backend=backend) +# exp_data = exp.run(backend=backend).block_for_results() +# hf = exp_data.analysis_results(dataframe=True) +# assert exp_data.job_status() == JobStatus.DONE +# assert exp_data.analysis_status() == AnalysisStatus.DONE +# +# fidelity = hf.iloc[0].value.fidelity +# assert fidelity + + +# ImportError causes tests to fail, error needs to be resolved for tests +# to be re-introduced. +# +# def test_dynamic_circuits_rb(): +# backend = FakeFractionalBackend() +# exp = DynamicCircuitsRB(physical_qubits=backend.coupling_map.physical_qubits, backend=backend) +# exp_data = exp.run(backend=backend).block_for_results() +# assert exp_data.job_status() == JobStatus.DONE +# assert exp_data.analysis_status() == AnalysisStatus.DONE +# +# +# def test_mcm_rb(backend): +# exp = McmRB( +# clif_qubit_sets=[(0, 1), (1, 0)], +# meas_qubit_sets=[(0, 1), (1, 0)], +# backend=backend +# ) +# exp_data = exp.run(backend=backend).block_for_results() +# assert exp_data.job_status() == JobStatus.DONE +# assert exp_data.analysis_status() == AnalysisStatus.DONE + + +def test_mirror_qv(backend): + exp = MirrorQuantumVolume(qubits=[0, 1], backend=backend) + exp_data = exp.run(backend=backend).block_for_results() + mean_success_probability = exp_data.analysis_results("mean_success_probability", dataframe=True).iloc[0] + assert exp_data.job_status() == JobStatus.DONE + assert exp_data.analysis_status() == AnalysisStatus.DONE + assert mean_success_probability.value + + +def test_mirror_rb(backend): + exp = MirrorRB(physical_qubits=[0, 1, 2], lengths=[2], backend=backend) + exp_data = exp.run(backend=backend).block_for_results() + assert exp_data.job_status() == JobStatus.DONE + assert exp_data.analysis_status() == AnalysisStatus.DONE + + +def test_purity_rb(backend): + exp = PurityRB(physical_qubits=[0, 1], lengths=[1], backend=backend) + exp_data = exp.run(backend=backend).block_for_results() + alpha = exp_data.analysis_results("alpha", dataframe=True).iloc[0] + EPC = exp_data.analysis_results("EPC", dataframe=True).iloc[0] + EPG_cz = exp_data.analysis_results("EPG_cz", dataframe=True).iloc[0] + assert exp_data.job_status() == JobStatus.DONE + assert exp_data.analysis_status() == AnalysisStatus.DONE + assert alpha.value + assert EPC.value + assert EPG_cz.value From 0633021520be9422493fcc7465458c606a9d72e5 Mon Sep 17 00:00:00 2001 From: Emil Kovacev Date: Mon, 16 Jun 2025 22:45:51 -0400 Subject: [PATCH 2/3] Adds testing instructions to docs --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 1865208..477b13c 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,13 @@ cd qiskit-device-benchmarking pip install . ``` +# Run Tests + +``` +pip install pytest +pytest +``` + # Contribution Guidelines Please open a github issue or pull request if you would like to contribute. From b95d175b61790cf01ab79d4673c4eaacba6841cc Mon Sep 17 00:00:00 2001 From: Emil Kovacev Date: Tue, 24 Jun 2025 11:46:40 -0400 Subject: [PATCH 3/3] lint and format --- tests/test_benchmarks.py | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py index 753bb5c..39abbfc 100644 --- a/tests/test_benchmarks.py +++ b/tests/test_benchmarks.py @@ -2,11 +2,13 @@ from qiskit.providers.jobstatus import JobStatus from qiskit_experiments.framework import AnalysisStatus -from qiskit_ibm_runtime.fake_provider import FakeFez, FakeFractionalBackend +from qiskit_ibm_runtime.fake_provider import FakeFez + +from qiskit_device_benchmarking.clops.clops_benchmark import ( + create_hardware_aware_circuit, +) +from qiskit_device_benchmarking.bench_code.bell import CHSHExperiment -from qiskit_device_benchmarking.clops.clops_benchmark import create_hardware_aware_circuit -from qiskit_device_benchmarking.mirror_test.mirror_pub import MirrorPubOptions -from qiskit_device_benchmarking.bench_code.bell import CHSHExperiment, BellExperiment # from qiskit_device_benchmarking.bench_code.dynamic_circuits_rb import DynamicCircuitsRB # from qiskit_device_benchmarking.bench_code.mcm_rb_experiment import McmRB from qiskit_device_benchmarking.bench_code.mrb.mirror_qv import MirrorQuantumVolume @@ -19,12 +21,9 @@ def backend(): return FakeFez() -def test_clops_hardware_aware_circuit(backend): +def test_clops_hardware_aware_circuit(backend): qc, params = create_hardware_aware_circuit( - width=100, - layers=100, - backend=backend, - parameterized=False + width=100, layers=100, backend=backend, parameterized=False ) assert qc.num_qubits == 100 @@ -32,10 +31,7 @@ def test_clops_hardware_aware_circuit(backend): assert not params qc, params = create_hardware_aware_circuit( - width=100, - layers=100, - backend=backend, - parameterized=True + width=100, layers=100, backend=backend, parameterized=True ) assert qc.num_qubits == 100 @@ -49,9 +45,9 @@ def test_clops_hardware_aware_circuit(backend): # pub_options.target_num_2q_gates = 4986 # pub_options.theta = 0 # pub_options.path_strategy = "eplg_chain" -# +# # pubs = pub_options.get_pubs(backend) -# +# # for circuit, obs, params in pubs: # assert circuit.num_qubits == 100 # assert circuit.depth() == 4986 @@ -66,7 +62,7 @@ def test_chsh_experiment(backend): assert s.value -# This test attempts to open matplotlib, which it should not be doing with this +# This test attempts to open matplotlib, which it should not be doing with this # code. This code needs to be resolved for the test to be re-introduced. # # def test_bell_experiment(backend): @@ -76,7 +72,7 @@ def test_chsh_experiment(backend): # hf = exp_data.analysis_results(dataframe=True) # assert exp_data.job_status() == JobStatus.DONE # assert exp_data.analysis_status() == AnalysisStatus.DONE -# +# # fidelity = hf.iloc[0].value.fidelity # assert fidelity @@ -90,8 +86,8 @@ def test_chsh_experiment(backend): # exp_data = exp.run(backend=backend).block_for_results() # assert exp_data.job_status() == JobStatus.DONE # assert exp_data.analysis_status() == AnalysisStatus.DONE -# -# +# +# # def test_mcm_rb(backend): # exp = McmRB( # clif_qubit_sets=[(0, 1), (1, 0)], @@ -106,7 +102,9 @@ def test_chsh_experiment(backend): def test_mirror_qv(backend): exp = MirrorQuantumVolume(qubits=[0, 1], backend=backend) exp_data = exp.run(backend=backend).block_for_results() - mean_success_probability = exp_data.analysis_results("mean_success_probability", dataframe=True).iloc[0] + mean_success_probability = exp_data.analysis_results( + "mean_success_probability", dataframe=True + ).iloc[0] assert exp_data.job_status() == JobStatus.DONE assert exp_data.analysis_status() == AnalysisStatus.DONE assert mean_success_probability.value