import pytest from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
import numpy as np
def run_gate_test(gate_builder, test_vector):
n_qubits = (len(test_vector['initial_state'])).bit_length() - 1
qc = QuantumCircuit(n_qubits)
qc.initialize(test_vector['initial_state'], qc.qubits)
gate_builder(qc, test_vector)
final_state = Statevector.from_instruction(qc)
try:
assert_statevectors_close(final_state, test_vector)
except AssertionError as e:
pytest.fail(str(e), pytrace=False)
def assert_statevectors_close(actual_state, expected_vector, tol=1e-6):
actual_data = actual_state.data.flatten()
expected_data = np.array(expected_vector['expected_state'], dtype=complex).flatten()
def clean_vec(vec, tol):
return np.array([
complex(0 if abs(amp.real) < tol else amp.real,
0 if abs(amp.imag) < tol else amp.imag)
for amp in vec
])
if not np.allclose(actual_data, expected_data, atol=tol):
msg = (
f"Statevectors do not match!\n"
f" Description: {expected_vector.get('description', 'N/A')}\n"
f" Actual: {clean_vec(actual_data, tol)}\n"
f" Expected: {clean_vec(expected_data, tol)}"
)
raise AssertionError(msg)
@pytest.fixture
def test_runner():
return run_gate_test