qadence 1.1.1__py3-none-any.whl → 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. qadence/__init__.py +1 -0
  2. qadence/analog/__init__.py +4 -2
  3. qadence/analog/addressing.py +167 -0
  4. qadence/analog/constants.py +59 -0
  5. qadence/analog/device.py +82 -0
  6. qadence/analog/hamiltonian_terms.py +101 -0
  7. qadence/analog/parse_analog.py +120 -0
  8. qadence/backend.py +42 -12
  9. qadence/backends/__init__.py +1 -2
  10. qadence/backends/api.py +27 -9
  11. qadence/backends/braket/backend.py +3 -2
  12. qadence/backends/horqrux/__init__.py +5 -0
  13. qadence/backends/horqrux/backend.py +216 -0
  14. qadence/backends/horqrux/config.py +26 -0
  15. qadence/backends/horqrux/convert_ops.py +273 -0
  16. qadence/backends/jax_utils.py +45 -0
  17. qadence/backends/pulser/__init__.py +0 -1
  18. qadence/backends/pulser/backend.py +31 -15
  19. qadence/backends/pulser/config.py +19 -10
  20. qadence/backends/pulser/devices.py +57 -63
  21. qadence/backends/pulser/pulses.py +70 -12
  22. qadence/backends/pyqtorch/backend.py +4 -4
  23. qadence/backends/pyqtorch/config.py +18 -12
  24. qadence/backends/pyqtorch/convert_ops.py +15 -7
  25. qadence/backends/utils.py +5 -9
  26. qadence/blocks/abstract.py +5 -1
  27. qadence/blocks/analog.py +18 -9
  28. qadence/blocks/block_to_tensor.py +11 -0
  29. qadence/blocks/embedding.py +46 -24
  30. qadence/blocks/primitive.py +81 -9
  31. qadence/blocks/utils.py +20 -1
  32. qadence/circuit.py +3 -9
  33. qadence/constructors/__init__.py +4 -0
  34. qadence/constructors/feature_maps.py +84 -60
  35. qadence/constructors/hamiltonians.py +27 -98
  36. qadence/constructors/rydberg_feature_maps.py +113 -0
  37. qadence/divergences.py +12 -0
  38. qadence/engines/__init__.py +0 -0
  39. qadence/engines/differentiable_backend.py +152 -0
  40. qadence/engines/jax/__init__.py +8 -0
  41. qadence/engines/jax/differentiable_backend.py +73 -0
  42. qadence/engines/jax/differentiable_expectation.py +94 -0
  43. qadence/engines/torch/__init__.py +4 -0
  44. qadence/engines/torch/differentiable_backend.py +85 -0
  45. qadence/extensions.py +21 -9
  46. qadence/finitediff.py +47 -0
  47. qadence/mitigations/readout.py +92 -25
  48. qadence/ml_tools/models.py +10 -3
  49. qadence/models/qnn.py +88 -23
  50. qadence/models/quantum_model.py +13 -2
  51. qadence/operations.py +55 -70
  52. qadence/parameters.py +24 -13
  53. qadence/register.py +91 -43
  54. qadence/transpile/__init__.py +1 -0
  55. qadence/transpile/apply_fn.py +40 -0
  56. qadence/types.py +32 -2
  57. qadence/utils.py +35 -0
  58. {qadence-1.1.1.dist-info → qadence-1.2.1.dist-info}/METADATA +22 -3
  59. {qadence-1.1.1.dist-info → qadence-1.2.1.dist-info}/RECORD +62 -44
  60. {qadence-1.1.1.dist-info → qadence-1.2.1.dist-info}/WHEEL +1 -1
  61. qadence/analog/interaction.py +0 -198
  62. qadence/analog/utils.py +0 -132
  63. /qadence/{backends/pytorch_wrapper.py → engines/torch/differentiable_expectation.py} +0 -0
  64. {qadence-1.1.1.dist-info → qadence-1.2.1.dist-info}/licenses/LICENSE +0 -0
qadence/register.py CHANGED
@@ -11,12 +11,16 @@ import numpy as np
11
11
  from deepdiff import DeepDiff
12
12
  from networkx.classes.reportviews import EdgeView, NodeView
13
13
 
14
+ from qadence.analog import IdealDevice, RydbergDevice
14
15
  from qadence.types import LatticeTopology
15
16
 
16
17
  # Modules to be automatically added to the qadence namespace
17
18
  __all__ = ["Register"]
18
19
 
19
20
 
21
+ DEFAULT_DEVICE = IdealDevice()
22
+
23
+
20
24
  def _scale_node_positions(graph: nx.Graph, min_distance: float, spacing: float) -> None:
21
25
  scaled_nodes = {}
22
26
  scale_factor = spacing / min_distance
@@ -27,8 +31,14 @@ def _scale_node_positions(graph: nx.Graph, min_distance: float, spacing: float)
27
31
 
28
32
 
29
33
  class Register:
30
- def __init__(self, support: nx.Graph | int, spacing: float | None = 1.0):
31
- """A 2D register of qubits which includes their coordinates.
34
+ def __init__(
35
+ self,
36
+ support: nx.Graph | int,
37
+ spacing: float | None = 1.0,
38
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
39
+ ):
40
+ """
41
+ A 2D register of qubits which includes their coordinates.
32
42
 
33
43
  It is needed for e.g. analog computing.
34
44
  The coordinates are ignored in backends that don't need them. The easiest
@@ -52,21 +62,16 @@ class Register:
52
62
  reg.draw()
53
63
  ```
54
64
  """
55
- self.graph = support if isinstance(support, nx.Graph) else alltoall_graph(support)
65
+ if device_specs is not None and not isinstance(device_specs, RydbergDevice):
66
+ raise ValueError("Device specs are not valid. Please pass a `RydbergDevice` instance.")
56
67
 
57
- # Auxiliary complete graph
58
- support = self.graph.nodes
59
- all_edges = list(filter(lambda x: x[0] < x[1], product(support, support)))
60
- self.complete_graph = nx.Graph()
61
- self.complete_graph.add_nodes_from(support)
62
- self.complete_graph.add_edges_from(all_edges)
68
+ self.device_specs = device_specs
69
+
70
+ self.graph = support if isinstance(support, nx.Graph) else alltoall_graph(support)
63
71
 
64
72
  if spacing is not None and self.min_distance != 0.0:
65
73
  _scale_node_positions(self.graph, self.min_distance, spacing)
66
74
 
67
- pos_values = nx.get_node_attributes(self.graph, "pos")
68
- nx.set_node_attributes(self.complete_graph, pos_values, "pos")
69
-
70
75
  @property
71
76
  def n_qubits(self) -> int:
72
77
  return len(self.graph)
@@ -77,27 +82,43 @@ class Register:
77
82
  coords: list[tuple],
78
83
  lattice: LatticeTopology | str = LatticeTopology.ARBITRARY,
79
84
  spacing: float | None = None,
85
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
80
86
  ) -> Register:
81
87
  graph = nx.Graph()
82
88
  for i, pos in enumerate(coords):
83
89
  graph.add_node(i, pos=pos)
84
- return cls(graph, spacing)
90
+ return cls(graph, spacing, device_specs)
85
91
 
86
92
  @classmethod
87
- def line(cls, n_qubits: int, spacing: float = 1.0) -> Register:
88
- return cls(line_graph(n_qubits), spacing)
93
+ def line(
94
+ cls,
95
+ n_qubits: int,
96
+ spacing: float = 1.0,
97
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
98
+ ) -> Register:
99
+ return cls(line_graph(n_qubits), spacing, device_specs)
89
100
 
90
101
  @classmethod
91
- def circle(cls, n_qubits: int, spacing: float = 1.0) -> Register:
102
+ def circle(
103
+ cls,
104
+ n_qubits: int,
105
+ spacing: float = 1.0,
106
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
107
+ ) -> Register:
92
108
  graph = nx.grid_2d_graph(n_qubits, 1, periodic=True)
93
109
  graph = nx.relabel_nodes(graph, {(i, 0): i for i in range(n_qubits)})
94
110
  coords = nx.circular_layout(graph)
95
111
  values = {i: {"pos": pos} for i, pos in coords.items()}
96
112
  nx.set_node_attributes(graph, values)
97
- return cls(graph, spacing)
113
+ return cls(graph, spacing, device_specs)
98
114
 
99
115
  @classmethod
100
- def square(cls, qubits_side: int, spacing: float = 1.0) -> Register:
116
+ def square(
117
+ cls,
118
+ qubits_side: int,
119
+ spacing: float = 1.0,
120
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
121
+ ) -> Register:
101
122
  n_points = 4 * (qubits_side - 1)
102
123
 
103
124
  def gen_points() -> np.ndarray:
@@ -122,35 +143,52 @@ class Register:
122
143
  graph = nx.relabel_nodes(graph, {(i, 0): i for i in range(n_points)})
123
144
  values = {i: {"pos": point} for i, point in zip(graph.nodes, gen_points())}
124
145
  nx.set_node_attributes(graph, values)
125
- return cls(graph, spacing)
146
+ return cls(graph, spacing, device_specs)
126
147
 
127
148
  @classmethod
128
- def all_to_all(cls, n_qubits: int, spacing: float = 1.0) -> Register:
129
- return cls(alltoall_graph(n_qubits), spacing)
149
+ def all_to_all(
150
+ cls,
151
+ n_qubits: int,
152
+ spacing: float = 1.0,
153
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
154
+ ) -> Register:
155
+ return cls(alltoall_graph(n_qubits), spacing, device_specs)
130
156
 
131
157
  @classmethod
132
158
  def rectangular_lattice(
133
- cls, qubits_row: int, qubits_col: int, spacing: float = 1.0
159
+ cls,
160
+ qubits_row: int,
161
+ qubits_col: int,
162
+ spacing: float = 1.0,
163
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
134
164
  ) -> Register:
135
165
  graph = nx.grid_2d_graph(qubits_col, qubits_row)
136
166
  values = {i: {"pos": node} for (i, node) in enumerate(graph.nodes)}
137
167
  graph = nx.relabel_nodes(graph, {(i, j): k for k, (i, j) in enumerate(graph.nodes)})
138
168
  nx.set_node_attributes(graph, values)
139
- return cls(graph, spacing)
169
+ return cls(graph, spacing, device_specs)
140
170
 
141
171
  @classmethod
142
172
  def triangular_lattice(
143
- cls, n_cells_row: int, n_cells_col: int, spacing: float = 1.0
173
+ cls,
174
+ n_cells_row: int,
175
+ n_cells_col: int,
176
+ spacing: float = 1.0,
177
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
144
178
  ) -> Register:
145
- return cls(triangular_lattice_graph(n_cells_row, n_cells_col), spacing)
179
+ return cls(triangular_lattice_graph(n_cells_row, n_cells_col), spacing, device_specs)
146
180
 
147
181
  @classmethod
148
182
  def honeycomb_lattice(
149
- cls, n_cells_row: int, n_cells_col: int, spacing: float = 1.0
183
+ cls,
184
+ n_cells_row: int,
185
+ n_cells_col: int,
186
+ spacing: float = 1.0,
187
+ device_specs: RydbergDevice = DEFAULT_DEVICE,
150
188
  ) -> Register:
151
189
  graph = nx.hexagonal_lattice_graph(n_cells_row, n_cells_col)
152
190
  graph = nx.relabel_nodes(graph, {(i, j): k for k, (i, j) in enumerate(graph.nodes)})
153
- return cls(graph, spacing)
191
+ return cls(graph, spacing, device_specs)
154
192
 
155
193
  @classmethod
156
194
  def lattice(cls, topology: LatticeTopology | str, *args: Any, **kwargs: Any) -> Register:
@@ -166,25 +204,29 @@ class Register:
166
204
  return self.graph.nodes[item]
167
205
 
168
206
  @property
169
- def support(self) -> set:
170
- return set(self.graph.nodes)
171
-
172
- @property
173
- def coords(self) -> dict:
174
- return {i: tuple(node.get("pos", ())) for i, node in self.graph.nodes.items()}
207
+ def nodes(self) -> NodeView:
208
+ return self.graph.nodes
175
209
 
176
210
  @property
177
211
  def edges(self) -> EdgeView:
178
212
  return self.graph.edges
179
213
 
180
214
  @property
181
- def all_edges(self) -> EdgeView:
182
- return self.complete_graph.edges
215
+ def support(self) -> set:
216
+ return set(self.nodes)
217
+
218
+ @property
219
+ def coords(self) -> dict:
220
+ return {i: tuple(node.get("pos", ())) for i, node in self.nodes.items()}
221
+
222
+ @property
223
+ def all_node_pairs(self) -> EdgeView:
224
+ return list(filter(lambda x: x[0] < x[1], product(self.support, self.support)))
183
225
 
184
226
  @property
185
227
  def distances(self) -> dict:
186
228
  coords = self.coords
187
- return {edge: dist(coords[edge[0]], coords[edge[1]]) for edge in self.all_edges}
229
+ return {edge: dist(coords[edge[0]], coords[edge[1]]) for edge in self.all_node_pairs}
188
230
 
189
231
  @property
190
232
  def edge_distances(self) -> dict:
@@ -197,21 +239,27 @@ class Register:
197
239
  value: float = min(self.distances.values()) if len(distances) > 0 else 0.0
198
240
  return value
199
241
 
200
- @property
201
- def nodes(self) -> NodeView:
202
- return self.graph.nodes
203
-
204
242
  def rescale_coords(self, scaling: float) -> Register:
205
243
  g = deepcopy(self.graph)
206
244
  _scale_node_positions(g, min_distance=1.0, spacing=scaling)
207
- return Register(g, spacing=None)
245
+ return Register(g, spacing=None, device_specs=self.device_specs)
208
246
 
209
247
  def _to_dict(self) -> dict:
210
- return {"graph": nx.node_link_data(self.graph)}
248
+ return {
249
+ "graph": nx.node_link_data(self.graph),
250
+ "device_specs": self.device_specs._to_dict(),
251
+ }
211
252
 
212
253
  @classmethod
213
254
  def _from_dict(cls, d: dict) -> Register:
214
- return cls(nx.node_link_graph(d["graph"]))
255
+ device_dict = d.get("device_specs", None)
256
+ if device_dict is None:
257
+ device_dict = DEFAULT_DEVICE._to_dict()
258
+
259
+ return cls(
260
+ support=nx.node_link_graph(d["graph"]),
261
+ device_specs=RydbergDevice._from_dict(device_dict),
262
+ )
215
263
 
216
264
  def __eq__(self, other: object) -> bool:
217
265
  if not isinstance(other, Register):
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from .apply_fn import apply_fn_to_blocks
3
4
  from .block import (
4
5
  chain_single_qubit_ops,
5
6
  repeat,
@@ -0,0 +1,40 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Callable
4
+
5
+ from qadence.blocks import AbstractBlock, CompositeBlock, add, chain, kron
6
+ from qadence.blocks.analog import AnalogChain
7
+
8
+ COMPOSE_FN_DICT = {
9
+ "ChainBlock": chain,
10
+ "AnalogChain": chain,
11
+ "KronBlock": kron,
12
+ "AnalogKron": kron,
13
+ "AddBlock": add,
14
+ }
15
+
16
+
17
+ def apply_fn_to_blocks(
18
+ input_block: AbstractBlock, block_fn: Callable, *args: Any, **kwargs: Any
19
+ ) -> AbstractBlock:
20
+ """
21
+ Recurses through the block tree and applies a given function to all the leaf blocks.
22
+
23
+ Arguments:
24
+ input_block: tree of blocks on which to apply the recurse.
25
+ block_fn: callable function to apply to each leaf block.
26
+ args: any positional arguments to pass to the leaf function.
27
+ kwargs: any keyword arguments to pass to the leaf function.
28
+ """
29
+
30
+ if isinstance(input_block, (CompositeBlock, AnalogChain)):
31
+ parsed_blocks = [
32
+ apply_fn_to_blocks(block, block_fn, *args, **kwargs) for block in input_block.blocks
33
+ ]
34
+ compose_fn = COMPOSE_FN_DICT[type(input_block).__name__]
35
+ output_block = compose_fn(*parsed_blocks) # type: ignore [arg-type]
36
+ else:
37
+ # AnalogKrons are considered as a leaf block
38
+ output_block = block_fn(input_block, *args, **kwargs)
39
+
40
+ return output_block
qadence/types.py CHANGED
@@ -2,10 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  import importlib
4
4
  from enum import Enum
5
- from typing import Iterable, Tuple, Union
5
+ from typing import Callable, Iterable, Tuple, Union
6
6
 
7
7
  import numpy as np
8
8
  import sympy
9
+ from numpy.typing import ArrayLike
9
10
  from torch import Tensor, pi
10
11
 
11
12
  TNumber = Union[int, float, complex]
@@ -39,6 +40,7 @@ __all__ = [
39
40
  "DiffMode",
40
41
  "BackendName",
41
42
  "Interaction",
43
+ "DeviceType",
42
44
  "OverlapMethod",
43
45
  "AlgoHEvo",
44
46
  "SerializationFormat",
@@ -163,7 +165,7 @@ class QubitSupportType(StrEnum):
163
165
  class Interaction(StrEnum):
164
166
  """Interaction types used in.
165
167
 
166
- - `add_interaction`.
168
+ - `RydbergDevice`.
167
169
  - [`hamiltonian_factory`][qadence.constructors.hamiltonians.hamiltonian_factory].
168
170
  """
169
171
 
@@ -177,6 +179,16 @@ class Interaction(StrEnum):
177
179
  """XYZ Interaction."""
178
180
 
179
181
 
182
+ class DeviceType(StrEnum):
183
+ """Supported types of devices for Pulser backend."""
184
+
185
+ IDEALIZED = "IdealDevice"
186
+ """Idealized device, least realistic."""
187
+
188
+ REALISTIC = "RealisticDevice"
189
+ """Device with realistic specs."""
190
+
191
+
180
192
  class _BackendName(StrEnum):
181
193
  """The available backends for running circuits."""
182
194
 
@@ -186,6 +198,8 @@ class _BackendName(StrEnum):
186
198
  """The Braket backend."""
187
199
  PULSER = "pulser"
188
200
  """The Pulser backend."""
201
+ HORQRUX = "horqrux"
202
+ """The horqrux backend."""
189
203
 
190
204
 
191
205
  # If proprietary qadence_extensions is available, import the
@@ -368,3 +382,19 @@ class OpName(StrEnum):
368
382
  """The entanglement operation."""
369
383
  WAIT = "wait"
370
384
  """The wait operation."""
385
+ PROJ = "Projector"
386
+ """The projector operation."""
387
+
388
+
389
+ class ReadOutOptimization(StrEnum):
390
+ MLE = "mle"
391
+ CONSTRAINED = "constrained"
392
+
393
+
394
+ class Engine(StrEnum):
395
+ TORCH = "torch"
396
+ JAX = "jax"
397
+
398
+
399
+ ParamDictType = dict[str, ArrayLike]
400
+ DifferentiableExpression = Callable[..., ArrayLike]
qadence/utils.py CHANGED
@@ -205,3 +205,38 @@ def _round_complex(t: torch.Tensor, decimals: int = 4) -> torch.Tensor:
205
205
 
206
206
  fn = torch.vmap(_round)
207
207
  return fn(t)
208
+
209
+
210
+ def is_qadence_shape(state: torch.Tensor, n_qubits: int) -> bool:
211
+ if len(state.size()) < 2:
212
+ raise ValueError(
213
+ f"Provided state is required to have atleast two dimensions. Got shape {state.shape}"
214
+ )
215
+ return state.shape[1] == 2**n_qubits # type: ignore[no-any-return]
216
+
217
+
218
+ def infer_batchsize(param_values: dict[str, torch.Tensor] = None) -> int:
219
+ """Infer the batch_size through the length of the parameter tensors."""
220
+ try:
221
+ return max([len(tensor) for tensor in param_values.values()]) if param_values else 1
222
+ except Exception:
223
+ return 1
224
+
225
+
226
+ def validate_values_and_state(
227
+ state: torch.Tensor | None, n_qubits: int, param_values: dict[str, torch.Tensor] = None
228
+ ) -> None:
229
+ if state is not None:
230
+ batch_size_state = (
231
+ state.shape[0] if is_qadence_shape(state, n_qubits=n_qubits) else state.size(-1)
232
+ )
233
+ batch_size_values = infer_batchsize(param_values)
234
+ if batch_size_state != batch_size_values and (
235
+ batch_size_values > 1 and batch_size_state > 1
236
+ ):
237
+ raise ValueError(
238
+ "Batching of parameter values and states is only valid for the cases:\
239
+ (1) batch_size_values == batch_size_state\
240
+ (2) batch_size_values == 1 and batch_size_state > 1\
241
+ (3) batch_size_values > 1 and batch_size_state == 1."
242
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qadence
3
- Version: 1.1.1
3
+ Version: 1.2.1
4
4
  Summary: Pasqal interface for circuit-based quantum computing SDKs
5
5
  Author-email: Aleksander Wennersteen <aleksander.wennersteen@pasqal.com>, Gert-Jan Both <gert-jan.both@pasqal.com>, Niklas Heim <niklas.heim@pasqal.com>, Mario Dagrada <mario.dagrada@pasqal.com>, Vincent Elfving <vincent.elfving@pasqal.com>, Dominik Seitz <dominik.seitz@pasqal.com>, Roland Guichard <roland.guichard@pasqal.com>, "Joao P. Moutinho" <joao.moutinho@pasqal.com>, Vytautas Abramavicius <vytautas.abramavicius@pasqal.com>
6
6
  License: Apache 2.0
@@ -18,8 +18,9 @@ Requires-Dist: deepdiff
18
18
  Requires-Dist: jsonschema
19
19
  Requires-Dist: matplotlib
20
20
  Requires-Dist: nevergrad
21
+ Requires-Dist: numpy
21
22
  Requires-Dist: openfermion
22
- Requires-Dist: pyqtorch==1.0.1
23
+ Requires-Dist: pyqtorch==1.0.3
23
24
  Requires-Dist: rich
24
25
  Requires-Dist: scipy
25
26
  Requires-Dist: sympytorch>=0.1.2
@@ -27,10 +28,25 @@ Requires-Dist: tensorboard>=2.12.0
27
28
  Requires-Dist: torch
28
29
  Provides-Extra: all
29
30
  Requires-Dist: amazon-braket-sdk; extra == 'all'
31
+ Requires-Dist: einops; extra == 'all'
32
+ Requires-Dist: flax; extra == 'all'
30
33
  Requires-Dist: graphviz; extra == 'all'
34
+ Requires-Dist: horqrux==0.3.0; extra == 'all'
35
+ Requires-Dist: jax; extra == 'all'
36
+ Requires-Dist: jaxopt; extra == 'all'
37
+ Requires-Dist: optax; extra == 'all'
31
38
  Requires-Dist: pulser>=0.15.2; extra == 'all'
39
+ Requires-Dist: sympy2jax; extra == 'all'
32
40
  Provides-Extra: braket
33
41
  Requires-Dist: amazon-braket-sdk; extra == 'braket'
42
+ Provides-Extra: horqrux
43
+ Requires-Dist: einops; extra == 'horqrux'
44
+ Requires-Dist: flax; extra == 'horqrux'
45
+ Requires-Dist: horqrux==0.3.0; extra == 'horqrux'
46
+ Requires-Dist: jax; extra == 'horqrux'
47
+ Requires-Dist: jaxopt; extra == 'horqrux'
48
+ Requires-Dist: optax; extra == 'horqrux'
49
+ Requires-Dist: sympy2jax; extra == 'horqrux'
34
50
  Provides-Extra: pulser
35
51
  Requires-Dist: pasqal-cloud>=0.3.5; extra == 'pulser'
36
52
  Requires-Dist: pulser>=v0.15.2; extra == 'pulser'
@@ -74,12 +90,15 @@ Qadence is available on [PyPI](https://pypi.org/project/qadence/) and can be ins
74
90
  pip install qadence
75
91
  ```
76
92
 
77
- The default, pre-installed backend for Qadence is [PyQTorch](https://github.com/pasqal-io/pyqtorch), a differentiable state vector simulator for digital-analog simulation. It is possible to install additional backends and the circuit visualization library using the following extras:
93
+ The default, pre-installed backend for Qadence is [PyQTorch](https://github.com/pasqal-io/pyqtorch), a differentiable state vector simulator for digital-analog simulation based on `PyTorch`. It is possible to install additional, `PyTorch` -based backends and the circuit visualization library using the following extras:
78
94
 
79
95
  * `pulser`: The [Pulser](https://github.com/pasqal-io/Pulser) backend for composing, simulating and executing pulse sequences for neutral-atom quantum devices.
80
96
  * `braket`: The [Braket](https://github.com/amazon-braket/amazon-braket-sdk-python) backend, an open source library that provides a framework for interacting with quantum computing hardware devices through Amazon Braket.
81
97
  * `visualization`: A visualization library to display quantum circuit diagrams.
82
98
 
99
+ Qadence also supports a `JAX` engine which is currently supporting the [Horqrux](https://github.com/pasqal-io/horqrux) backend. `horqrux` is currently only available via the [low-level API](examples/backends/low_level/horqrux_backend.py).
100
+
101
+
83
102
  To install individual extras, use the following syntax (**IMPORTANT** Make sure to use quotes):
84
103
 
85
104
  ```bash
@@ -1,63 +1,72 @@
1
- qadence/__init__.py,sha256=me88jOt3wtGMiobi1-956mO5sCyWYvcspbKmwADnV-4,1684
2
- qadence/backend.py,sha256=tBvu3P24-LDB56yKdBw-q_dM8BIXQG0GALuJvCuTI5M,14049
3
- qadence/circuit.py,sha256=DbRHKAqiClEUOsiuQN_EaoI4xScK2_sGk1VkOnX-NpE,7071
1
+ qadence/__init__.py,sha256=XxVbw_UToWu0PUKxOg2C42lYT22cgQH_ysy8PRGT0q0,1707
2
+ qadence/backend.py,sha256=M8uCxZhom7N2I454ghZBnMwy2_VoRLXoNJr1_IthNb0,15479
3
+ qadence/circuit.py,sha256=EGBPRRWlK-mcXaaAhJnp-hxVWQ8NxngGKbvhPqrEeKM,6892
4
4
  qadence/decompose.py,sha256=_L0hI3SbYErXEDp-aXFeNk0JR9ffJ_JD_EnRJbJKT20,5230
5
- qadence/divergences.py,sha256=UQ9u_pyhPCAejKDOy7NFYjSlujEVvUJ3gXiUZoJbFd8,1480
5
+ qadence/divergences.py,sha256=JhpELhWSnuDvQxa9hJp_DE3EQg2Ban-Ta0mHZ_fVrHg,1832
6
6
  qadence/execution.py,sha256=zczhPbBOf91PtAso0fe3uHxnseXyJ5QHMw7melB4XmQ,9134
7
- qadence/extensions.py,sha256=zMXuPhMuIAZ8rWEnL1x69gUsQpCRf8qfu0y_2Eml3b8,3952
7
+ qadence/extensions.py,sha256=eqZ7_M2mht39zqXxWMHubDJCr9li9lLUu0XnWsfkbfE,4487
8
+ qadence/finitediff.py,sha256=TijuaWUbX9VlbLyMYco6HkK9eCoRTVnKug4Ekd6mlTI,1592
8
9
  qadence/logger.py,sha256=mdTr52nL30ipPRwp11nIHKLEoB3hqs7J-Mric5KVfyM,912
9
- qadence/operations.py,sha256=OnZnhk70Z4ltr3I1oUKPFJwVKg5HYhFURNpNL-Zukhc,37250
10
+ qadence/operations.py,sha256=7xsc3yXzngGoEHF6iaTeIHjrDKRuFhxgcxjPNoeQDH0,37143
10
11
  qadence/overlap.py,sha256=3vsg0HLOO3X8LiVgvjSc5s-cs8Di4TpEA657LWZ5HEY,17294
11
- qadence/parameters.py,sha256=zc4HLmHQpBoIm5ww1DdQW7DpnWrT6HKnS6Vog66jp_8,11833
12
+ qadence/parameters.py,sha256=svZ3L-Z4pzm2PkPDIlb-DWkwGOQLAm1eECCtu7nd3W0,12334
12
13
  qadence/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
14
  qadence/qubit_support.py,sha256=Nkn1Q01RVViTcggSIom7EFKdWpAuM4TMGwBZ5feCUxA,2120
14
- qadence/register.py,sha256=CKLPiJzDLMp1hkeJgY3OX3LVG3Q5-EaEuMPWWVMWtpk,9172
15
+ qadence/register.py,sha256=cBMzwZ7GWZ5ieuFt0bpproEI6a2ncNwfjj7ic379zyg,10276
15
16
  qadence/serialization.py,sha256=BmBCFVAeLOL7KCYhUIN38cA43mA0tc5R7l0Fm2xtABU,11702
16
17
  qadence/states.py,sha256=p5J4-aceTHxLK89DLC191K1H5c3y6gb2dd-I5YPqBMo,14343
17
- qadence/types.py,sha256=LuXxzHhUApm0rA1sSgFpTAGfzyscaxar9Fo-zK2yQ6w,8938
18
- qadence/utils.py,sha256=QE2SvQnrKH0WijOeDjwZQfv_GCqKNbN5WSktZBLP5Vo,6818
19
- qadence/analog/__init__.py,sha256=emAi8xEwuwAQKENkD6ePbTeSMmWJG-tudpZ1stnmc7M,108
20
- qadence/analog/interaction.py,sha256=PiYORiIZUVggWXSNljyvb_-VCHRLt76TJ8OxzgKri0Y,7440
21
- qadence/analog/utils.py,sha256=5uSBZq16nMtsEY27zzqtnMasefreVFhR0XEvUSWTudc,3564
22
- qadence/backends/__init__.py,sha256=cg7wolh0jKwwE_6JZpSFaS7GOPIr6rdYobTQnvAAwqQ,291
18
+ qadence/types.py,sha256=pidqyNqpyeYz4KBKjK15Tm70y26FZfKDUwdfYgU9hb8,9586
19
+ qadence/utils.py,sha256=sWHQ8C6CVhXsaZif0jKnkiOaxKTG5EXSMDfk_lXmgRE,8257
20
+ qadence/analog/__init__.py,sha256=BCyS9R4KUjzUXN0Ax3b0eMo8ZAuSkGoJQVtZ4_pvAFs,279
21
+ qadence/analog/addressing.py,sha256=9KsZnmf-UDCy0rco2gvatd8ERlZd0QZGwt7SS_a_DZo,6410
22
+ qadence/analog/constants.py,sha256=B2phQoN1ASL8CwM-Dsa1rbraYwGwwPSeiB3HbVe-MPA,1243
23
+ qadence/analog/device.py,sha256=nY6esVJEHHJjK2tRZVMjdNy0SHcP3eSGh1Zi55KcX_4,2430
24
+ qadence/analog/hamiltonian_terms.py,sha256=9LKidqqEMJTTdXeaxkxP_otTmcv9i4yeJ-JKCLOCK3Y,3421
25
+ qadence/analog/parse_analog.py,sha256=L2mh0uU4JwTteInR07pe5gPM4kQz17y9yS2O7n8u-SU,4070
26
+ qadence/backends/__init__.py,sha256=ibm7wmZxuIoMYAQxgAx0MsfLYWOVHNWgLwyS1HjMuuI,215
23
27
  qadence/backends/adjoint.py,sha256=kX4QX_6UjVJcochm6dSjFHpFYmdV0DQRfXqybNnlRcU,6788
24
- qadence/backends/api.py,sha256=sfPGj2-NYHHKD64Z9Emg5oFa-Y4dvPUKycSNdhYaRoY,2358
28
+ qadence/backends/api.py,sha256=6PoK4ydhi2tj9w0ePMQl1G4kEFROoWe3lrkrtQwWxkc,3224
25
29
  qadence/backends/gpsr.py,sha256=nGNdXJi59vmEhrkysRscVQbWZs34A8YW9FlD1lolt4o,4356
26
- qadence/backends/pytorch_wrapper.py,sha256=PoyglpSg6YGjm2P6y7-urB-oVx_Uq3HoMoyP43sFYuc,15344
27
- qadence/backends/utils.py,sha256=O8PD-8kPaGaSlxJ9cgP-gDlWb8qVmipXFoOk6whEl-w,6530
30
+ qadence/backends/jax_utils.py,sha256=RMs1sSZmPANEKb7ZrMz_H2VJwkrW4WMrfPdWUd5UvKI,1350
31
+ qadence/backends/utils.py,sha256=E-IubQ5YWJnKxXlvh0vemof1G7zSBycva2xc_8KQIts,6402
28
32
  qadence/backends/braket/__init__.py,sha256=eruyDZKMqkh1LE7eJ980vcrLJbia35uUX6krAP78clI,121
29
- qadence/backends/braket/backend.py,sha256=X94HzXBsdeV6STFNFHTR8PdajNYMxSiLFvzpJB6RCSU,8560
33
+ qadence/backends/braket/backend.py,sha256=oZkLQb6kEiFporjlHqJe3j6E8mXnCJZaCi9x5SddsfY,8603
30
34
  qadence/backends/braket/config.py,sha256=b9aIdma0DRwC_3A6xUSLdXMCZe6z6kDcAgkp6MxcXIk,603
31
35
  qadence/backends/braket/convert_ops.py,sha256=D-hHfYkvxZtMaiK3I286CSsBg8vf854dEigeFgxaQ5Y,3422
32
- qadence/backends/pulser/__init__.py,sha256=D53znqi5Ltxl1rHZ6NeltRhwwEhicrD-jI_QtKBvj1g,144
33
- qadence/backends/pulser/backend.py,sha256=qZ1k7TMOoeUFfWF_Oc2f3iIMNgtM8idXP1CAa-qJOCg,12693
36
+ qadence/backends/horqrux/__init__.py,sha256=0OdVy6cq0oQggV48LO1WXdaZuSkDkz7OYNEPIkNAmfk,140
37
+ qadence/backends/horqrux/backend.py,sha256=tnW1jz3ScKQlwNeZ6n64sx33NeT0y4giDjq1NeDNmmA,8052
38
+ qadence/backends/horqrux/config.py,sha256=FmXVkN5L01CCB7Ae9Cnmw9bgUWHYC9X3Kp2PAbyfIYI,540
39
+ qadence/backends/horqrux/convert_ops.py,sha256=Aaq6SElReoJByE-XMn5OBDkMTKcmMQyfTshE6N-c41k,8717
40
+ qadence/backends/pulser/__init__.py,sha256=capQ-eHqwtOeLf4mWsI0BIseAHhiLGie5cFD4-iVhUo,116
41
+ qadence/backends/pulser/backend.py,sha256=Yl21WHl_IPVPt_4T1IytsMYN95cgto9BhnqLF2kpaEk,13499
34
42
  qadence/backends/pulser/channels.py,sha256=ZF0yEXUFHAmi3IdeXjzdTNGR5NzaRRFTiUpUGVg2sO4,329
35
43
  qadence/backends/pulser/cloud.py,sha256=0uUluvbFV9sOuCPraE-9uiVtC3Q8QaDY1IJMDi8grDM,2057
36
- qadence/backends/pulser/config.py,sha256=qprNFI_ZRG-GA5ipQrJkuvpt0dgkw7JiZxrx1woMjHM,2852
44
+ qadence/backends/pulser/config.py,sha256=DdboScn5TrtVwCcsHgZjNCQmWy46aSrf44FhOTJRxaw,3038
37
45
  qadence/backends/pulser/convert_ops.py,sha256=0HGWe5kIwI1ZALHf2j68B8aBOhwFNZV-mDy1_6zsF5g,1227
38
- qadence/backends/pulser/devices.py,sha256=i2vj0uWBSZ_oajJfjVE3ZOC_nre7H0eYLohK1_kjngI,2266
39
- qadence/backends/pulser/pulses.py,sha256=C9dYyIuVbj8N7pdmOsBKVXD6FqY3rzNEFShaH3kjtdo,9377
46
+ qadence/backends/pulser/devices.py,sha256=KBgyBbdL1ZLllHHoWY5W6Z_aALhxFZMlXABkN7tQsmQ,2439
47
+ qadence/backends/pulser/pulses.py,sha256=KwhiW3vcA7bKyYgADA2mHuUiah8J5Ytw2eocmAlasiA,11685
40
48
  qadence/backends/pulser/waveforms.py,sha256=0uz95b7rUaUUtN0tuHBZmJ0H6UBmfHST_59ozwsRCzg,2227
41
49
  qadence/backends/pyqtorch/__init__.py,sha256=0OdVy6cq0oQggV48LO1WXdaZuSkDkz7OYNEPIkNAmfk,140
42
- qadence/backends/pyqtorch/backend.py,sha256=U0cuJtClhsYFOykTQOxpKF_mCooHkZxK-mrsWph8KKI,9418
43
- qadence/backends/pyqtorch/config.py,sha256=6g14PV8Mw7171AAiyi3-9CAiJOhky1dvolbIs_kSwBg,1722
44
- qadence/backends/pyqtorch/convert_ops.py,sha256=S3nrBI_BsgtonZ9Tzp5PDEmVi0G7uuyh5d5YH2ne2Js,15130
50
+ qadence/backends/pyqtorch/backend.py,sha256=wKAzoKf_eoG2vpmFDD3PFsGGTtRva3UDUL5GH9oZAj8,9457
51
+ qadence/backends/pyqtorch/config.py,sha256=f5BjWehCqm9do2OahNWrv2w55y3orkw0Wj2f6flwRaU,1907
52
+ qadence/backends/pyqtorch/convert_ops.py,sha256=J20E5Lze2TyxA1ODClSH1d_TC32jr2VuEpDY2zb_yqY,15537
45
53
  qadence/blocks/__init__.py,sha256=SXj5NbnJkFcsEeyP4WJ2EfV-frmoL3qzz0XTExpMQpg,940
46
- qadence/blocks/abstract.py,sha256=khWoHxsv-wkNMTB7lrZZ0e9LmCeBXu6z_zH9pCd5stQ,11701
47
- qadence/blocks/analog.py,sha256=qS3Hy5Hnk4935WQ3hV0LY_OSTj-1HHZDx_2GXThYO8M,10328
48
- qadence/blocks/block_to_tensor.py,sha256=d6RqRTLXFpgZT2fQVGlr4xJBWhD1uh-7BbWq0fYt6do,15972
54
+ qadence/blocks/abstract.py,sha256=35RcVlNvD1BmBoJ8bbYJ3LrdU72wixt9ZmTbCtEwNus,11796
55
+ qadence/blocks/analog.py,sha256=ySzvniSF89dsTd_GzgAESkv3OVseBgUKkKTAQK7sqVc,10655
56
+ qadence/blocks/block_to_tensor.py,sha256=bt28er90ltu1GzRQCz4hziBLKoBgQhC8VZwKTziM1JE,16279
49
57
  qadence/blocks/composite.py,sha256=z_lXRBVnh-DdvfZdv6T0ZEmVhlU76zBt72P_FGGa-PQ,8897
50
- qadence/blocks/embedding.py,sha256=wNpvk3EG1ex9gJ0o_RI4ztIvlzMCK5GocgXV1WS8TMA,5670
58
+ qadence/blocks/embedding.py,sha256=TQt620UIVaNYHP34tpK9slv-PFiLvTQRYw5Ez9RuImE,6513
51
59
  qadence/blocks/manipulate.py,sha256=kPmzej7mnWFoqTJA2CkGulT7hcPha0GGPARC8rjZltg,2387
52
60
  qadence/blocks/matrix.py,sha256=XQI6D4CWhCf3j-hvA0jRKOgprs0RA6su7OythCoH6Ls,3785
53
- qadence/blocks/primitive.py,sha256=yfY7UWQmkaOSgNBV5-Tnq8cI95ARflTputRhQftcAX0,14642
54
- qadence/blocks/utils.py,sha256=pj0b3yEQ3wpiK_mdpkBS8shAPyaeHZii2bCjtts8jVE,15729
55
- qadence/constructors/__init__.py,sha256=IgujYHDgyRmxECLOyt4yv4wbBTAUfu_nRX_PytkurMw,965
61
+ qadence/blocks/primitive.py,sha256=rM-l5wvf3nGCrYFMJ6cI2ULPv_vhw1gxt1zd-77bupM,16716
62
+ qadence/blocks/utils.py,sha256=WQKx5e2Uq0TG8bwxFGaMsIbvYFJHfH95TBCVqlpuQ5s,16299
63
+ qadence/constructors/__init__.py,sha256=d4ndrNCTCDS_kUYeigGFQOUFSAMaPKL--_FcdZy7eQo,1152
56
64
  qadence/constructors/ansatze.py,sha256=PWC6ILioReF6vlS22UevCSLIHGR1HMQpUVPlCyZ4rNY,12026
57
- qadence/constructors/feature_maps.py,sha256=O4QkvCDDRk6yazzDe52YEchM15yMBzNdvjGVUZAa7_I,9808
58
- qadence/constructors/hamiltonians.py,sha256=nn3f93JZwTD3ALo_zxpU64gBw7jrvx11BkTObiN0ctQ,11380
65
+ qadence/constructors/feature_maps.py,sha256=PgbbwYcq2TrvJmn8BZefX2j20BTrVd7axmSVldbJxPk,10569
66
+ qadence/constructors/hamiltonians.py,sha256=d-rdOSsI7gEp9pn89M60EYierBpPFmEP3Y3W7BrdbMM,8327
59
67
  qadence/constructors/iia.py,sha256=12Dizl1BZwktmp4h4FNm-ISFCRVFkW_EsIAg7rqAo1E,4720
60
68
  qadence/constructors/qft.py,sha256=h_wVAEvb6kIr_pzx9RWK8PVsosqDB8np3qvZFkFmbf4,7508
69
+ qadence/constructors/rydberg_feature_maps.py,sha256=u_BTGfsgXqKSJb72DP_CyqBCfoSQFI6GRsc-Fqiuw5E,4729
61
70
  qadence/constructors/rydberg_hea.py,sha256=GrIrboyjEe1fJEbhtRYeCZ5dYzDVpMt-SQucS9UyNtw,8372
62
71
  qadence/constructors/utils.py,sha256=PKVkxD2Ev2OVl-aCC9jl6rTET6iEhDXOWIdXf30w4iw,3073
63
72
  qadence/constructors/daqc/__init__.py,sha256=50_4Ak32d5A4CZeR65l0s-0lUsxgKerWNDK7GDmkNY4,140
@@ -72,6 +81,14 @@ qadence/draw/assets/dark/measurement.png,sha256=hSMhZZCFKHNO2tCpYTTSYIF-nsAfNalR
72
81
  qadence/draw/assets/dark/measurement.svg,sha256=6ALGjaCX3xZ1NqB6RW6yzOchzZV-j8ukW4aGhEWe4Lk,7282
73
82
  qadence/draw/assets/light/measurement.png,sha256=q6AMI7Lmb1O42sEzvSiK9ZtyTpXOGj-zIAh4FiPbhsk,278
74
83
  qadence/draw/assets/light/measurement.svg,sha256=kL424wtIEU7ihxecZnthyYnvHhNW_F75daoO9pBHNiw,7282
84
+ qadence/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ qadence/engines/differentiable_backend.py,sha256=rrMA-54AC1wx4a1WFQKGZL_YIdgjoyvBGagT0H1bL1Y,5875
86
+ qadence/engines/jax/__init__.py,sha256=qcW09lcnblwRVQM6mDmW9su5kDVPe--buWCCuvPbOVM,223
87
+ qadence/engines/jax/differentiable_backend.py,sha256=W5rDA8wb-ECnFWoLj4dVugF9v1lecC0t9FTLBWnw2vM,3062
88
+ qadence/engines/jax/differentiable_expectation.py,sha256=XBYHT1XKRuZfKxTcNy8KJpSDPt-2PR4ZCanImCPI9OI,3677
89
+ qadence/engines/torch/__init__.py,sha256=iZFdD32ot0B0CVyC-f5dVViOBnqoalxa6M9Lj4WQuPE,160
90
+ qadence/engines/torch/differentiable_backend.py,sha256=AWthwvKE8pCOih4dZ3tXxQX4W1ps9mBcvo7n4V9V24Y,3553
91
+ qadence/engines/torch/differentiable_expectation.py,sha256=PoyglpSg6YGjm2P6y7-urB-oVx_Uq3HoMoyP43sFYuc,15344
75
92
  qadence/exceptions/__init__.py,sha256=BU6vWrI9mshzr1aTPm1Ticr_o_42GjTrWI4OZXhThsI,203
76
93
  qadence/exceptions/exceptions.py,sha256=4j_VJpx2sZ2Mir5BJUWu4nwb131FY1ygO4q8-XlyfRc,190
77
94
  qadence/measurements/__init__.py,sha256=RIjG9tVJMqhNzyj7maZI250Um0KgHl2PizDcKJag-JU,161
@@ -81,11 +98,11 @@ qadence/measurements/tomography.py,sha256=TiD6xwD9b7hK0cKoMccAZwpz56rCLz2xb-dZai
81
98
  qadence/mitigations/__init__.py,sha256=RzaxYJftePFMloGhBVSixZ8fSe-ps_Jc-EyPm6xz-bs,159
82
99
  qadence/mitigations/analog_zne.py,sha256=6B_rb0Od8sOvzyVwjAb6hM3hCe5Xcr1LnsxL3L9byRk,3579
83
100
  qadence/mitigations/protocols.py,sha256=Jq9MyLujfTyWmc7XVUGYVRUkJT1MmZw-GgmWpVjmX2Y,1608
84
- qadence/mitigations/readout.py,sha256=qSGly-yfYMX8QX_uGBvFKidUCOn3h0ybb3KiprVCF2k,3978
101
+ qadence/mitigations/readout.py,sha256=HPfYmdjRlieUdOBMZTghFK4DRWfveM4KkDkEI0bMI0E,6262
85
102
  qadence/ml_tools/__init__.py,sha256=_H5A_BWZRZVGoJszb9s8XRJnLnJxUNfYjuT9HT2yASo,786
86
103
  qadence/ml_tools/config.py,sha256=X8dHyjq4D9-ITjs7UQo0vjJTcHkpbZC0gChH5eEN2G8,2356
87
104
  qadence/ml_tools/data.py,sha256=GptMgStgpyLM0nLWT_SCWSkW8DWuhU7EcYEDgUTXXzs,3191
88
- qadence/ml_tools/models.py,sha256=z8_kcp0p5kZpuGmsBFLGMqQ1MQcrVFXC-UcCRRA3DqU,10815
105
+ qadence/ml_tools/models.py,sha256=BfGPb761riKjl5jpm2VFrk08IZPvDtCAc_lwqJ5QXuM,11096
89
106
  qadence/ml_tools/optimize_step.py,sha256=HfDbRPt-sPxq4QT2-8Ur63r11Tty6mgJb3CFPb_7YWs,1540
90
107
  qadence/ml_tools/parameters.py,sha256=gew2Kq_5-RgRpaTvs8eauVhgo0sTqqDQEV6WHFEiLGM,1301
91
108
  qadence/ml_tools/printing.py,sha256=kwwD9yLVqezaqWX5OAsXr8GLdJUnGrY-t5SnoKHtl9g,707
@@ -95,19 +112,20 @@ qadence/ml_tools/train_grad.py,sha256=wKltZZQ911tsUucjZp1uuqng_Zdr1D3vFmlqhqdXEc
95
112
  qadence/ml_tools/train_no_grad.py,sha256=erwus-pUOg8q6WgoQsDW6MeH80wlRPBh69W1ZMHKoL8,4714
96
113
  qadence/ml_tools/utils.py,sha256=_GZSN5Flk1nRFutkXih397Q3cWKdX0UP8c9CRXpUL7c,1654
97
114
  qadence/models/__init__.py,sha256=0nZzAC2TGr8Yuf40-R7m2cSsr_BlNq_GsMOwaOYZLqM,193
98
- qadence/models/qnn.py,sha256=_SkW76jFSyuXRhUlP5lmGQZlg0Y8vgiVkxz6gYuI1Hs,5833
99
- qadence/models/quantum_model.py,sha256=WmQVIbpdmDVIgcVPzRgoHDdCB0D0GCOqBroP0NcHrEw,11575
115
+ qadence/models/qnn.py,sha256=ne261gZn-1JDhCL2rzj-PykhkhP2MWhFlX7Ok7eCqFQ,8586
116
+ qadence/models/quantum_model.py,sha256=lADpj_HY1393JjE558ckH4RiiEM5qkYyfdBJ-rVVvXM,12053
100
117
  qadence/noise/__init__.py,sha256=r0nR8uEZeB1M9pI2UisjWq0bjw50fPFfVGzIMev923g,147
101
118
  qadence/noise/protocols.py,sha256=-aZ06JvMnpxCeT5v5lI_RNPOLbb9Ju1Pi1AB6uAXxVE,1653
102
119
  qadence/noise/readout.py,sha256=BqBIZbPXWqZaKi6EpBSpXXQ9NhQXdQ-YL6ZmwbSjgfE,6736
103
- qadence/transpile/__init__.py,sha256=NMCoKsy9vKoKycBxtD9oa1CYtmgG9U9XeTDFsOTq1_4,416
120
+ qadence/transpile/__init__.py,sha256=lb5LwsYb6lN5YFBsU3YBey7-0OcUQpYa3Q4hG6zmgi0,457
121
+ qadence/transpile/apply_fn.py,sha256=glZo2_wMOjw7_KgWKYbqg8j-9SDs-RefWIfxWgdQK8I,1336
104
122
  qadence/transpile/block.py,sha256=kuDATVQm-e1EbI22_bl4KzSpby5jfzMtboC_k8T8n6g,11591
105
123
  qadence/transpile/circuit.py,sha256=KTh6Gv1czZddFuA1JhNNszheZbwViVixiGh4rGvIgTM,451
106
124
  qadence/transpile/digitalize.py,sha256=iWRwYAYQsD2INHj0HNbGJriv_3fRCuBW1nDBrwtKSuI,1523
107
125
  qadence/transpile/flatten.py,sha256=EdhSG5WyF56nbnxINNLqrHgY84MRM1YFjT3fR4aph5Q,3427
108
126
  qadence/transpile/invert.py,sha256=KAefHTG2AWr39aengVhXrzCtJPhrZC-ZnL6vYvmbnY0,4867
109
127
  qadence/transpile/transpile.py,sha256=6MRRkk1OS279L1fwUQjazA6qlfpbd-T_EJMKT8hAhOU,2721
110
- qadence-1.1.1.dist-info/METADATA,sha256=Zu8IoHxF-4F9zj0V9u9NIGajXWwxLp-JLn7IKa-kBlo,6755
111
- qadence-1.1.1.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87
112
- qadence-1.1.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
113
- qadence-1.1.1.dist-info/RECORD,,
128
+ qadence-1.2.1.dist-info/METADATA,sha256=S3d0CDfRPyXuASpiupmqW7j6eKkdPcZJcOt0BJ1WafI,7648
129
+ qadence-1.2.1.dist-info/WHEEL,sha256=0wCxn4rnLsvRWBK-NC7mK2QMIQ_aZSl7Qvk-8IWl_pY,87
130
+ qadence-1.2.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
131
+ qadence-1.2.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.18.0
2
+ Generator: hatchling 1.19.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any