Skip to content

Commit 742f880

Browse files
committed
rebase onto main, fix merge errors
1 parent d21d90c commit 742f880

3 files changed

Lines changed: 39 additions & 6 deletions

File tree

qokit/qaoa_circuit.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ def append_z_prod_term(qc: QuantumCircuit, indices: Sequence, gamma: float) -> N
3232
qc.cx(indices[0], indices[1])
3333
elif term_weight == 2:
3434
qc.rzz(2 * gamma, indices[0], indices[1])
35+
elif term_weight == 1:
36+
qc.rz(2 * gamma, indices[0])
3537
else:
3638
# fallback to general case
3739
target = indices[-1]
@@ -53,10 +55,10 @@ def append_cost_operator_circuit(qc: QuantumCircuit, terms: Sequence, gamma: flo
5355
gates in `append_x_term(...)`, which originates from different conventions
5456
used between `QOKit` and `Qiskit`."""
5557
for term in terms:
56-
if len(term) == 2 and isinstance(term[1], Sequence):
58+
if len(term) == 2 and isinstance(term[1], (tuple, list)):
5759
coeff, indices = term
5860
append_z_prod_term(qc, indices, gamma * coeff / 2)
59-
elif any([isinstance(i, tuple) for i in term]):
61+
elif any([isinstance(i, (tuple, list)) for i in term]):
6062
raise ValueError(f"Invalid term received: {term}")
6163
else:
6264
append_z_prod_term(qc, term, gamma / 2)

tests/test_furxz_simulator.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
from qokit.qaoa_circuit_maxcut import get_ws_qaoa_circuit
77
from qokit.fur.diagonal_precomputation import precompute_vectorized_cpu_parallel
88
from qiskit_aer import AerSimulator
9+
import os
10+
import pytest
911

12+
PYTHON_ONLY = False if os.environ.get("QOKIT_PYTHON_ONLY") is None else os.environ.get("QOKIT_PYTHON_ONLY")
13+
14+
@pytest.mark.skipif(PYTHON_ONLY)
1015
def test_furxz_backends():
1116

1217
N = 10
@@ -73,7 +78,7 @@ def test_qiskit_qokit():
7378
gamma, beta = get_fixed_gamma_beta(d=d,p=p)
7479
ini_rots = np.random.rand(N)
7580

76-
simclass = qokit.fur.choose_simulator_xz(name='c')
81+
simclass = qokit.fur.choose_simulator_xz(name='python')
7782
sim = simclass(N, terms=terms)
7883
_result = sim.simulate_ws_qaoa(list(np.asarray(gamma)), list(np.asarray(beta)), ini_rots)
7984
qaoa_prob = sim.get_probabilities(_result)

tests/test_qaoa_qiskit.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55
import numpy as np
66
import pandas as pd
77
from qiskit_aer import AerSimulator
8+
from qiskit import transpile
89
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
1011
from qokit.qaoa_circuit_labs import (
1112
get_parameterized_qaoa_circuit,
1213
get_qaoa_circuit,
1314
)
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
1517
from qokit.utils import (
1618
precompute_energies,
1719
obj_from_statevector,
1820
get_ramp,
1921
)
20-
22+
from qokit.fur.diagonal_precomputation import precompute_vectorized_cpu_parallel
2123
from qokit.qaoa_objective_labs import get_qaoa_labs_objective
24+
from qokit import parameter_utils
2225

2326
test_qaoa_qiskit_folder = Path(__file__).parent
2427

@@ -83,3 +86,26 @@ def test_parameterized_circuit():
8386

8487
assert np.isclose(f1, f2)
8588
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

Comments
 (0)