Skip to content

Commit 351668b

Browse files
committed
WIP implementing IQM device, as well as unifying all common devices' logics into the base scaleway device for cleaner and quicker integration.
1 parent 76b4d6d commit 351668b

File tree

8 files changed

+274
-95
lines changed

8 files changed

+274
-95
lines changed

examples/hello_world.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
secret_key=secret_key,
1515
backend=backend,
1616
) as dev:
17+
1718
@qml.set_shots(100)
1819
@qml.qnode(dev)
1920
def bell_state_circuit():

pennylane_scaleway/aer_device.py

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,16 @@
1414
import numpy as np
1515
import warnings
1616

17-
from dataclasses import replace, fields
17+
from dataclasses import fields
1818
from tenacity import retry, stop_after_attempt, stop_after_delay
1919
from typing import Callable, Iterable, List, Sequence, Tuple
2020

2121
import pennylane as qml
2222
from pennylane.devices import ExecutionConfig
2323
from pennylane.devices.modifiers import simulator_tracking, single_tape_support
24-
from pennylane.devices.preprocess import (
25-
decompose,
26-
validate_device_wires,
27-
validate_measurements,
28-
validate_observables,
29-
)
3024
from pennylane.measurements import ExpectationMP, VarianceMP, MeasurementProcess
3125
from pennylane.tape import QuantumScript, QuantumScriptOrBatch
32-
from pennylane.transforms import split_non_commuting, broadcast_expand, transform
26+
from pennylane.transforms import transform
3327
from pennylane.transforms.core import TransformProgram
3428

3529
from qiskit.primitives.containers import PrimitiveResult, PubResult
@@ -43,10 +37,8 @@
4337
from pennylane_scaleway.scw_device import ScalewayDevice
4438
from pennylane_scaleway.utils import (
4539
QISKIT_OPERATION_MAP,
46-
accepted_sample_measurement,
4740
circuit_to_qiskit,
4841
)
49-
from pennylane_scaleway.utils import analytic_warning
5042

5143

5244
@simulator_tracking # update device.tracker with some relevant information
@@ -161,35 +153,8 @@ def preprocess(
161153
self,
162154
execution_config: ExecutionConfig | None = None,
163155
) -> tuple[TransformProgram, ExecutionConfig]:
164-
config = execution_config or ExecutionConfig()
165-
config = replace(config, use_device_gradient=False)
166-
167-
transform_program = TransformProgram()
168-
169-
transform_program.add_transform(analytic_warning)
170-
transform_program.add_transform(
171-
validate_device_wires, self.wires, name=self.name
172-
)
173-
transform_program.add_transform(
174-
decompose,
175-
stopping_condition=lambda op: op.name in self.operations,
176-
name=self.name,
177-
skip_initial_state_prep=False,
178-
)
179-
transform_program.add_transform(
180-
validate_measurements,
181-
sample_measurements=accepted_sample_measurement,
182-
name=self.name,
183-
)
184-
transform_program.add_transform(
185-
validate_observables,
186-
stopping_condition=lambda obs: obs.name in self.observables,
187-
name=self.name,
188-
)
189-
transform_program.add_transform(broadcast_expand)
190-
transform_program.add_transform(split_non_commuting)
156+
transform_program, config = super().preprocess(execution_config)
191157
transform_program.add_transform(split_execution_types)
192-
193158
return transform_program, config
194159

195160
def execute(
@@ -199,7 +164,9 @@ def execute(
199164
) -> List:
200165

201166
if not self._session_id:
202-
raise RuntimeError("No active session. Please instanciate the device using a context manager, or call start() first. You can also attach to an existing deduplication_id.")
167+
raise RuntimeError(
168+
"No active session. Please instanciate the device using a context manager, or call start() first. You can also attach to an existing deduplication_id."
169+
)
203170

204171
if isinstance(circuits, QuantumScript):
205172
circuits = [circuits]

pennylane_scaleway/aqt_device.py

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,15 @@
1414
import numpy as np
1515
import warnings
1616

17-
from dataclasses import replace
1817
from inspect import signature
1918
from typing import Callable, List, Sequence, Tuple, Union
2019
from tenacity import retry, stop_after_attempt, stop_after_delay
2120

22-
import pennylane as qml
2321
from pennylane.devices import ExecutionConfig
2422
from pennylane.devices.modifiers import simulator_tracking, single_tape_support
25-
from pennylane.devices.preprocess import (
26-
decompose,
27-
validate_device_wires,
28-
validate_measurements,
29-
validate_observables,
30-
)
23+
3124
from pennylane.tape import QuantumScriptOrBatch, QuantumScript, QuantumTape
32-
from pennylane.transforms import broadcast_expand, split_non_commuting, transform
25+
from pennylane.transforms import transform
3326
from pennylane.transforms.core import TransformProgram
3427

3528
from qiskit.result import Result
@@ -38,8 +31,6 @@
3831

3932
from pennylane_scaleway.utils import (
4033
circuit_to_qiskit,
41-
accepted_sample_measurement,
42-
analytic_warning,
4334
)
4435
from pennylane_scaleway.scw_device import ScalewayDevice
4536

@@ -128,7 +119,7 @@ class AqtDevice(ScalewayDevice):
128119
"Hadamard",
129120
}
130121

131-
def __init__(self, shots=None, seed=None, **kwargs):
122+
def __init__(self, wires=None, shots=None, seed=None, **kwargs):
132123
"""
133124
Params:
134125
@@ -164,7 +155,7 @@ def circuit():
164155
```
165156
"""
166157

167-
super().__init__(wires=12, kwargs=kwargs, shots=shots, seed=seed)
158+
super().__init__(wires=wires, kwargs=kwargs, shots=shots, seed=seed)
168159

169160
self._default_shots = None
170161
if isinstance(shots, int):
@@ -183,9 +174,6 @@ def _handle_kwargs(self, **kwargs):
183174
self._run_options.update(
184175
{
185176
"session_name": self._session_options.get("name"),
186-
"session_deduplication_id": self._session_options.get(
187-
"deduplication_id"
188-
),
189177
"session_max_duration": self._session_options.get("max_duration"),
190178
"session_max_idle_duration": self._session_options.get(
191179
"max_idle_duration"
@@ -203,37 +191,10 @@ def preprocess(
203191
self,
204192
execution_config: ExecutionConfig | None = None,
205193
) -> tuple[TransformProgram, ExecutionConfig]:
206-
transform_program = TransformProgram()
207-
config = execution_config or ExecutionConfig()
208-
config = replace(config, use_device_gradient=False)
209-
210-
transform_program.add_transform(analytic_warning)
194+
transform_program, config = super().preprocess(execution_config)
211195
transform_program.add_transform(
212196
limit_aqt_shots, default_shots=self._default_shots
213197
)
214-
transform_program.add_transform(
215-
validate_device_wires, self.wires, name=self.name
216-
)
217-
transform_program.add_transform(
218-
decompose,
219-
stopping_condition=lambda x: x.name in self.operations,
220-
name=self.name,
221-
skip_initial_state_prep=False,
222-
)
223-
transform_program.add_transform(
224-
validate_measurements,
225-
sample_measurements=accepted_sample_measurement,
226-
name=self.name,
227-
)
228-
transform_program.add_transform(
229-
validate_observables,
230-
stopping_condition=lambda x: x.name in self.observables,
231-
name=self.name,
232-
)
233-
234-
transform_program.add_transform(broadcast_expand)
235-
transform_program.add_transform(split_non_commuting)
236-
237198
return transform_program, config
238199

239200
def execute(
@@ -242,7 +203,9 @@ def execute(
242203
execution_config: ExecutionConfig | None = None,
243204
) -> List:
244205
if not self._session_id:
245-
raise RuntimeError("No active session. Please instanciate the device using a context manager, or call start() first. You can also attach to an existing deduplication_id.")
206+
raise RuntimeError(
207+
"No active session. Please instanciate the device using a context manager, or call start() first. You can also attach to an existing deduplication_id."
208+
)
246209

247210
if isinstance(circuits, QuantumScript):
248211
circuits = [circuits]

0 commit comments

Comments
 (0)