Skip to content

Commit 42dc508

Browse files
committed
test: Add unit tests and CI/CD workflow to meet open-source standards
1 parent c5861f4 commit 42dc508

5 files changed

Lines changed: 108 additions & 0 deletions

File tree

.github/workflows/python-app.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: Python Application CI
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
pull_request:
7+
branches: [ "main" ]
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
build:
14+
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- uses: actions/checkout@v3
19+
- name: Set up Python 3.10
20+
uses: actions/setup-python@v3
21+
with:
22+
python-version: "3.10"
23+
- name: Install dependencies
24+
run: |
25+
python -m pip install --upgrade pip
26+
pip install pytest
27+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
28+
- name: Test with pytest
29+
run: |
30+
pytest tests/

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<img src="https://img.shields.io/badge/UI-Streamlit-red.svg" alt="Streamlit" />
1212
<img src="https://img.shields.io/badge/Status-Active-brightgreen.svg" alt="Status" />
1313
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" />
14+
<img src="https://github.com/shlok926/q-refine/actions/workflows/python-app.yml/badge.svg" alt="Build Status" />
1415
</p>
1516

1617
<p>

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ qiskit-aer>=0.14.0
33
streamlit>=1.30.0
44
numpy
55
matplotlib
6+
pytest>=7.0.0

tests/test_circuits.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
from qiskit import QuantumCircuit
3+
from q_refine.circuits.bv import bernstein_vazirani
4+
from q_refine.circuits.simon import simon_algorithm
5+
from q_refine.circuits.grover import grover_algorithm
6+
from q_refine.circuits.qft import qft_benchmark_circuit
7+
from q_refine.circuits.qnn import generate_trained_qnn
8+
9+
def test_bernstein_vazirani():
10+
qc = bernstein_vazirani("101")
11+
assert isinstance(qc, QuantumCircuit)
12+
assert qc.name == "BV_Circuit"
13+
assert qc.num_qubits == 4
14+
15+
def test_simon_algorithm():
16+
qc = simon_algorithm("11")
17+
assert isinstance(qc, QuantumCircuit)
18+
assert qc.name == "Simon"
19+
assert qc.num_qubits == 4
20+
21+
def test_grover_algorithm():
22+
qc = grover_algorithm()
23+
assert isinstance(qc, QuantumCircuit)
24+
assert qc.num_qubits == 2
25+
26+
def test_qft_circuit():
27+
qc = qft_benchmark_circuit(3)
28+
assert isinstance(qc, QuantumCircuit)
29+
assert qc.name == "QFT"
30+
assert qc.num_qubits == 3
31+
32+
def test_generate_trained_qnn():
33+
qc = generate_trained_qnn(num_qubits=3, num_layers=1)
34+
assert isinstance(qc, QuantumCircuit)
35+
assert qc.name == "Optimized_QNN"
36+
assert qc.num_qubits == 3

tests/test_q_sanitizer.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import pytest
2+
from qiskit import QuantumCircuit
3+
from q_refine.mitigation_engine.q_sanitizer import QSanitizer
4+
5+
def test_q_sanitizer_init():
6+
sanitizer = QSanitizer(mitigation_method="ZNE")
7+
assert sanitizer.mitigation_method == "ZNE"
8+
assert sanitizer.scale_factors == [1, 3, 5]
9+
10+
def test_circuit_folding():
11+
sanitizer = QSanitizer(mitigation_method="ZNE")
12+
qc = QuantumCircuit(2)
13+
qc.h(0)
14+
qc.cx(0, 1)
15+
16+
folded_circuits = sanitizer.refine(qc)
17+
18+
assert 1 in folded_circuits
19+
assert 3 in folded_circuits
20+
assert 5 in folded_circuits
21+
22+
assert isinstance(folded_circuits[1], QuantumCircuit)
23+
assert isinstance(folded_circuits[3], QuantumCircuit)
24+
assert isinstance(folded_circuits[5], QuantumCircuit)
25+
26+
# Scale 3 circuit depth should be significantly larger
27+
assert folded_circuits[3].depth() > folded_circuits[1].depth()
28+
29+
def test_richardson_extrapolate():
30+
sanitizer = QSanitizer(mitigation_method="ZNE")
31+
32+
# Mock data showing degraded probability as scale increases
33+
noisy_probs = [0.90, 0.80, 0.70]
34+
scales = [1, 3, 5]
35+
36+
zero_noise_prob = sanitizer.richardson_extrapolate(noisy_probs, scales)
37+
38+
# Expect the zero noise prob to be higher than the scale 1 prob
39+
assert zero_noise_prob > 0.90
40+
assert zero_noise_prob <= 1.05 # Sanity check

0 commit comments

Comments
 (0)