|
5 | 5 | import numpy as np |
6 | 6 | import pandas as pd |
7 | 7 | from qiskit_aer import AerSimulator |
| 8 | +from qiskit import transpile |
8 | 9 | from pathlib import Path |
9 | | -from qokit.utils import precompute_energies, obj_from_statevector, get_ramp |
| 10 | +from qokit.utils import precompute_energies, obj_from_statevector, get_ramp, reverse_array_index_bit_order |
10 | 11 | from qokit.qaoa_circuit_labs import ( |
11 | 12 | get_parameterized_qaoa_circuit, |
12 | 13 | get_qaoa_circuit, |
13 | 14 | ) |
14 | | -from qokit.labs import negative_merit_factor_from_bitstring |
| 15 | +from qokit.qaoa_circuit import get_qaoa_circuit_from_terms |
| 16 | +from qokit.labs import negative_merit_factor_from_bitstring, get_terms_offset |
15 | 17 | from qokit.utils import ( |
16 | 18 | precompute_energies, |
17 | 19 | obj_from_statevector, |
18 | 20 | get_ramp, |
19 | 21 | ) |
20 | | - |
| 22 | +from qokit.fur.diagonal_precomputation import precompute_vectorized_cpu_parallel |
21 | 23 | from qokit.qaoa_objective_labs import get_qaoa_labs_objective |
| 24 | +from qokit import parameter_utils |
22 | 25 |
|
23 | 26 | test_qaoa_qiskit_folder = Path(__file__).parent |
24 | 27 |
|
@@ -83,3 +86,26 @@ def test_parameterized_circuit(): |
83 | 86 |
|
84 | 87 | assert np.isclose(f1, f2) |
85 | 88 | assert np.isclose(f1, f3) |
| 89 | + |
| 90 | + |
| 91 | +def test_labs_circuit_from_terms_overlap(): |
| 92 | + """Test that building a LABS QAOA circuit via the general get_qaoa_circuit_from_terms |
| 93 | + and running it on Aer produces the expected overlap with optimal bitstrings.""" |
| 94 | + N = 6 |
| 95 | + p = 1 |
| 96 | + |
| 97 | + gamma, beta = parameter_utils.get_best_known_parameters_for_LABS_wrt_overlap_for_p(N, p) |
| 98 | + terms, offset = get_terms_offset(N) |
| 99 | + |
| 100 | + qc = get_qaoa_circuit_from_terms(N, terms, gamma, beta) |
| 101 | + backend = AerSimulator(method="statevector") |
| 102 | + sv = reverse_array_index_bit_order(np.array(backend.run(transpile(qc, backend)).result().get_statevector())) |
| 103 | + |
| 104 | + diag = precompute_vectorized_cpu_parallel(terms, offset, N) |
| 105 | + probs = np.abs(sv) ** 2 |
| 106 | + overlap = probs[diag == diag.min()].sum() |
| 107 | + |
| 108 | + # Cross-check against stored expected overlap |
| 109 | + params_df = parameter_utils.get_best_known_parameters_for_LABS_wrt_overlap(N) |
| 110 | + expected_overlap = params_df[params_df["p"] == p].squeeze()["overlap"] |
| 111 | + assert np.isclose(overlap, expected_overlap, atol=1e-4), f"overlap {overlap} != expected {expected_overlap}" |
0 commit comments