Skip to content

Commit ac632e1

Browse files
authored
Deprecate least_squares functions in fidelity_estimation (quantumlib#5428)
- These functions are inefficient and have been obsoleted by vectorized versions in xeb_fitting. This is part of the plan to deprecate redundant XEB functionality as part of quantumlib#3775.
1 parent 7e56049 commit ac632e1

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

cirq/experiments/fidelity_estimation.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import numpy as np
1818

19+
from cirq import _compat
1920
from cirq.circuits import Circuit
2021
from cirq.ops import QubitOrder, QubitOrderOrList
2122
from cirq.sim import final_state_vector
@@ -224,6 +225,13 @@ def log_xeb_fidelity(
224225
)
225226

226227

228+
@_compat.deprecated(
229+
deadline='v0.16',
230+
fix=(
231+
'Use cirq.experiments.xeb_fitting '
232+
'(benchmark_2q_xeb_fidelities and fit_exponential_decays) instead.'
233+
),
234+
)
227235
def least_squares_xeb_fidelity_from_expectations(
228236
measured_expectations: Sequence[float],
229237
exact_expectations: Sequence[float],
@@ -303,6 +311,13 @@ def least_squares_xeb_fidelity_from_expectations(
303311
return fidelity, residuals
304312

305313

314+
@_compat.deprecated(
315+
deadline='v0.16',
316+
fix=(
317+
'Use cirq.experiments.xeb_fitting '
318+
'(benchmark_2q_xeb_fidelities and fit_exponential_decays) instead.'
319+
),
320+
)
306321
def least_squares_xeb_fidelity_from_probabilities(
307322
hilbert_space_dimension: int,
308323
observed_probabilities: Sequence[Sequence[float]],

cirq/experiments/fidelity_estimation_test.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,15 @@ def test_least_squares_xeb_fidelity_from_expectations():
176176
exact_expectations_log.append(np.sum(probabilities * np.log(dim * probabilities)))
177177
uniform_expectations_log.append(np.mean(np.log(dim * probabilities)))
178178

179-
f_lin, r_lin = cirq.experiments.least_squares_xeb_fidelity_from_expectations(
180-
measured_expectations_lin, exact_expectations_lin, [1.0] * n_circuits
181-
)
182-
f_log, r_log = cirq.experiments.least_squares_xeb_fidelity_from_expectations(
183-
measured_expectations_log, exact_expectations_log, uniform_expectations_log
184-
)
179+
with cirq.testing.assert_deprecated(
180+
'Use cirq.experiments.xeb_fitting', deadline='v0.16', count=2
181+
):
182+
f_lin, r_lin = cirq.experiments.least_squares_xeb_fidelity_from_expectations(
183+
measured_expectations_lin, exact_expectations_lin, [1.0] * n_circuits
184+
)
185+
f_log, r_log = cirq.experiments.least_squares_xeb_fidelity_from_expectations(
186+
measured_expectations_log, exact_expectations_log, uniform_expectations_log
187+
)
185188

186189
assert np.isclose(f_lin, 1 - depolarization, atol=0.01)
187190
assert np.isclose(f_log, 1 - depolarization, atol=0.01)
@@ -192,9 +195,11 @@ def test_least_squares_xeb_fidelity_from_expectations():
192195

193196

194197
def test_least_squares_xeb_fidelity_from_expectations_bad_length():
195-
with pytest.raises(ValueError) as exception_info:
196-
_ = cirq.experiments.least_squares_xeb_fidelity_from_expectations([1.0], [1.0], [1.0, 2.0])
197-
assert '1, 1, and 2' in str(exception_info.value)
198+
with pytest.raises(ValueError, match='1, 1, and 2'):
199+
with cirq.testing.assert_deprecated('Use cirq.experiments.xeb_fitting', deadline='v0.16'):
200+
_ = cirq.experiments.least_squares_xeb_fidelity_from_expectations(
201+
[1.0], [1.0], [1.0, 2.0]
202+
)
198203

199204

200205
def test_least_squares_xeb_fidelity_from_probabilities():
@@ -221,15 +226,19 @@ def test_least_squares_xeb_fidelity_from_probabilities():
221226
all_probabilities.append(probabilities)
222227
observed_probabilities.append(probabilities[bitstrings])
223228

224-
f_lin, r_lin = cirq.least_squares_xeb_fidelity_from_probabilities(
225-
dim, observed_probabilities, all_probabilities, None, True
226-
)
227-
f_log_np, r_log_np = cirq.least_squares_xeb_fidelity_from_probabilities(
228-
dim, observed_probabilities, all_probabilities, np.log, True
229-
)
230-
f_log_math, r_log_math = cirq.least_squares_xeb_fidelity_from_probabilities(
231-
dim, observed_probabilities, all_probabilities, math.log, False
232-
)
229+
# 2 deprecation warnings for each of the following
230+
with cirq.testing.assert_deprecated(
231+
'Use cirq.experiments.xeb_fitting', deadline='v0.16', count=6
232+
):
233+
f_lin, r_lin = cirq.least_squares_xeb_fidelity_from_probabilities(
234+
dim, observed_probabilities, all_probabilities, None, True
235+
)
236+
f_log_np, r_log_np = cirq.least_squares_xeb_fidelity_from_probabilities(
237+
dim, observed_probabilities, all_probabilities, np.log, True
238+
)
239+
f_log_math, r_log_math = cirq.least_squares_xeb_fidelity_from_probabilities(
240+
dim, observed_probabilities, all_probabilities, math.log, False
241+
)
233242

234243
assert np.isclose(f_lin, 1 - depolarization, atol=0.01)
235244
assert np.isclose(f_log_np, 1 - depolarization, atol=0.01)

0 commit comments

Comments
 (0)