Skip to content

Commit 173f9d3

Browse files
coruscatingnkanazawa1989
authored andcommitted
Update HamiltonianGate path and add tolerance to PulseBackend (qiskit-community#1280)
### Summary After `qiskit.extensions` was deprecated in Qiskit/qiskit#10725, this PR updates the path of `HamiltonianGate` so tests against Qiskit main pass again. This also adds `atol` and `rtol` tolerance parameters to `PulseBackend` for speeding up slow tests.
1 parent b551e5e commit 173f9d3

File tree

9 files changed

+43
-18
lines changed

9 files changed

+43
-18
lines changed

qiskit_experiments/test/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
MockIQParallelBackend
3838
T2HahnBackend
3939
NoisyDelayAerBackend
40-
SingleTransmonTestBackend
4140
4241
Helpers
4342
=======

qiskit_experiments/test/pulse_backend.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ def __init__(
7272
dt: float = 0.1 * 1e-9,
7373
solver_method="RK23",
7474
seed: int = 0,
75+
atol: float = None,
76+
rtol: float = None,
7577
**kwargs,
7678
):
7779
"""Initialize a backend with model information.
@@ -85,6 +87,8 @@ def __init__(
8587
methods. Defaults to "RK23".
8688
seed: An optional seed given to the random number generator. If this argument is not
8789
set then the seed defaults to 0.
90+
atol: Absolute tolerance during solving.
91+
rtol: Relative tolerance during solving.
8892
"""
8993
from qiskit_dynamics import Solver
9094

@@ -109,6 +113,12 @@ def __init__(
109113

110114
self.solver_method = solver_method
111115

116+
self.solve_kwargs = {}
117+
if atol:
118+
self.solve_kwargs["atol"] = atol
119+
if rtol:
120+
self.solve_kwargs["rtol"] = rtol
121+
112122
self.static_hamiltonian = static_hamiltonian
113123
self.hamiltonian_operators = hamiltonian_operators
114124
self.static_dissipators = static_dissipators
@@ -339,6 +349,7 @@ def solve(self, schedule: Union[ScheduleBlock, Schedule], qubits: Tuple[int]) ->
339349
t_eval=[time_f],
340350
signals=signal,
341351
method=self.solver_method,
352+
**self.solve_kwargs,
342353
).y[0]
343354

344355
return unitary
@@ -454,6 +465,8 @@ def __init__(
454465
lambda_2: float = 0.8e9,
455466
gamma_1: float = 1e4,
456467
noise: bool = True,
468+
atol: float = None,
469+
rtol: float = None,
457470
**kwargs,
458471
):
459472
"""Initialise backend with hamiltonian parameters
@@ -466,6 +479,8 @@ def __init__(
466479
gamma_1: Relaxation rate (1/T1) for 1-0. Defaults to 1e4.
467480
noise: Defaults to True. If True then T1 dissipation is included in the pulse-simulation.
468481
The strength is given by ``gamma_1``.
482+
atol: Absolute tolerance during solving.
483+
rtol: Relative tolerance during solving.
469484
"""
470485
from qiskit_dynamics.pulse import InstructionToSignals
471486

@@ -509,6 +524,8 @@ def __init__(
509524
rwa_cutoff_freq=1.9 * qubit_frequency,
510525
rwa_carrier_freqs=[qubit_frequency],
511526
evaluation_mode=evaluation_mode,
527+
atol=atol,
528+
rtol=rtol,
512529
**kwargs,
513530
)
514531

releasenotes/notes/0.3/cleanup-cr-hamiltonian-experiment-7f47c51d26941f16.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ upgrade:
66
setting backend for just checking experiment sequence. The sequence with actual parameters
77
is generated after the backend is set. In addition, now experiments can take ``cr_gate``
88
in the constractor which is ``Gate`` type subclass taking a single parameter (flat-top width).
9-
If one inputs a :class:`~qiskit.extensions.hamiltonian_gate.HamiltonianGate` subclass with
9+
If one inputs a :class:`~qiskit.circuit.library.HamiltonianGate` subclass with
1010
cross resonance Hamiltonian, experiment can be simulated with Aer QASM simulator.

test/library/calibration/test_half_angle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def setUp(self):
3232
super().setUp()
3333
library = FixedFrequencyTransmon()
3434

35-
self.backend = SingleTransmonTestBackend(noise=False)
35+
self.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
3636
self.cals = Calibrations.from_backend(self.backend, libraries=[library])
3737

3838
def test_amp_parameter_error(self):

test/library/calibration/test_rabi.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,18 @@
3434
class TestRabiEndToEnd(QiskitExperimentsTestCase):
3535
"""Test the rabi experiment."""
3636

37-
def setUp(self):
37+
@classmethod
38+
def setUpClass(cls):
3839
"""Setup the tests."""
39-
super().setUp()
40+
super().setUpClass()
4041

41-
self.qubit = 0
42+
cls.qubit = 0
4243

4344
with pulse.build(name="x") as sched:
44-
pulse.play(pulse.Drag(160, Parameter("amp"), 40, 0.4), pulse.DriveChannel(self.qubit))
45+
pulse.play(pulse.Drag(160, Parameter("amp"), 40, 0.4), pulse.DriveChannel(cls.qubit))
4546

46-
self.sched = sched
47-
self.backend = SingleTransmonTestBackend(noise=False)
47+
cls.sched = sched
48+
cls.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
4849

4950
# pylint: disable=no-member
5051
def test_rabi_end_to_end(self):
@@ -101,7 +102,7 @@ def setUp(self):
101102
super().setUp()
102103

103104
self.qubit = 0
104-
self.backend = SingleTransmonTestBackend(noise=False)
105+
self.backend = SingleTransmonTestBackend(noise=False, atol=1e-4)
105106
self.anharmonicity = self.backend.anharmonicity
106107
with pulse.build(name="x") as sched:
107108
with pulse.frequency_offset(self.anharmonicity, pulse.DriveChannel(self.qubit)):
@@ -115,7 +116,7 @@ def setUp(self):
115116
def test_ef_rabi_end_to_end(self):
116117
"""Test the EFRabi experiment end to end."""
117118

118-
test_tol = 0.01
119+
test_tol = 0.05
119120

120121
# Note that the backend is not sophisticated enough to simulate an e-f
121122
# transition so we run the test with a tiny frequency shift, still driving the e-g transition.

test/library/calibration/test_rough_amplitude.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def setUp(self):
3232
super().setUp()
3333
library = FixedFrequencyTransmon()
3434

35-
self.backend = SingleTransmonTestBackend(noise=False)
35+
self.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
3636
self.cals = Calibrations.from_backend(self.backend, libraries=[library])
3737

3838
def test_circuits(self):
@@ -107,7 +107,7 @@ def setUpClass(cls):
107107

108108
library = FixedFrequencyTransmon()
109109

110-
cls.backend = SingleTransmonTestBackend(noise=False)
110+
cls.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
111111
cls.cals = Calibrations.from_backend(cls.backend, libraries=[library])
112112

113113
# Add some pulses on the 1-2 transition.

test/library/calibration/test_rough_frequency.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class TestRoughFrequency(QiskitExperimentsTestCase):
2828
def setUp(self):
2929
"""Setup the tests."""
3030
super().setUp()
31-
self.backend = SingleTransmonTestBackend(noise=False)
31+
self.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
3232

3333
def test_init(self):
3434
"""Test that initialization."""
@@ -53,7 +53,9 @@ def test_update_calibrations(self):
5353

5454
freq01 = BackendData(self.backend).drive_freqs[0]
5555

56-
backend_5mhz = SingleTransmonTestBackend(qubit_frequency=freq01 + 5e6, noise=False)
56+
backend_5mhz = SingleTransmonTestBackend(
57+
qubit_frequency=freq01 + 5e6, noise=False, atol=1e-3
58+
)
5759

5860
library = FixedFrequencyTransmon()
5961
cals = Calibrations.from_backend(self.backend, libraries=[library])

test/library/characterization/test_cross_resonance_hamiltonian.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@
2121
from ddt import ddt, data, unpack
2222
from qiskit import QuantumCircuit, pulse, qpy, quantum_info as qi
2323
from qiskit.providers.fake_provider import FakeBogotaV2
24-
from qiskit.extensions.hamiltonian_gate import HamiltonianGate
24+
25+
# TODO: remove old path after we stop supporting the relevant version of Qiskit
26+
try:
27+
from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
28+
except ModuleNotFoundError:
29+
from qiskit.extensions.hamiltonian_gate import HamiltonianGate
30+
2531
from qiskit_aer import AerSimulator
2632
from qiskit_experiments.library.characterization import cr_hamiltonian
2733

test/library/characterization/test_multi_state_discrimination.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def setUp(self):
4949
"""Setup test variables."""
5050
super().setUp()
5151

52-
self.backend = SingleTransmonTestBackend(noise=False)
52+
self.backend = SingleTransmonTestBackend(noise=False, atol=1e-3)
5353

5454
# Build x12 schedule
5555
self.qubit = 0
@@ -94,7 +94,7 @@ def test_discrimination_analysis(self, n_states):
9494

9595
fidelity = exp_data.analysis_results("fidelity").value
9696

97-
self.assertGreaterEqual(fidelity, 0.96)
97+
self.assertGreaterEqual(fidelity, 0.93)
9898

9999
# check that the discriminator differentiates n different states
100100
discrim_lbls = exp_data.analysis_results("discriminator_config").value["attributes"][

0 commit comments

Comments
 (0)