emu-sv 2.3.0__py3-none-any.whl → 2.4.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.
emu_sv/__init__.py CHANGED
@@ -38,4 +38,4 @@ __all__ = [
38
38
  "DensityMatrix",
39
39
  ]
40
40
 
41
- __version__ = "2.3.0"
41
+ __version__ = "2.4.1"
@@ -80,7 +80,9 @@ class DensityMatrix(State[complex, torch.Tensor]):
80
80
  self.matrix.shape == other.matrix.shape
81
81
  ), "States do not have the same number of sites"
82
82
 
83
- return torch.vdot(self.matrix.flatten(), other.matrix.flatten())
83
+ return torch.vdot(
84
+ self.matrix.flatten(), other.matrix.to(self.matrix.device).flatten()
85
+ )
84
86
 
85
87
  @classmethod
86
88
  def from_state_vector(cls, state: StateVector) -> DensityMatrix:
emu_sv/state_vector.py CHANGED
@@ -134,7 +134,7 @@ class StateVector(State[complex, torch.Tensor]):
134
134
  ), "States do not have the same shape"
135
135
 
136
136
  # by our internal convention inner and norm return to cpu
137
- return torch.vdot(self.vector, other.vector).cpu()
137
+ return torch.vdot(self.vector, other.vector.to(self.vector.device)).cpu()
138
138
 
139
139
  def sample(
140
140
  self,
@@ -275,7 +275,7 @@ class StateVector(State[complex, torch.Tensor]):
275
275
  return accum_state, amplitudes
276
276
 
277
277
  def overlap(self, other: StateVector, /) -> torch.Tensor:
278
- return self.inner(other)
278
+ return torch.abs(self.inner(other)) ** 2
279
279
 
280
280
 
281
281
  def inner(left: StateVector, right: StateVector) -> torch.Tensor:
emu_sv/sv_backend_impl.py CHANGED
@@ -1,16 +1,14 @@
1
1
  from abc import abstractmethod
2
2
  import time
3
3
  import typing
4
+ import torch
4
5
 
5
6
  from emu_sv.hamiltonian import RydbergHamiltonian
6
7
  from emu_sv.lindblad_operator import RydbergLindbladian
7
8
  from pulser import Sequence
8
- import torch
9
- from resource import RUSAGE_SELF, getrusage
10
9
 
11
10
  from pulser.backend import Results, Observable, State, EmulationConfig
12
- from emu_base import PulserData
13
- from emu_base.noise import pick_dark_qubits
11
+ from emu_base import PulserData, get_max_rss
14
12
 
15
13
  from emu_sv.state_vector import StateVector
16
14
  from emu_sv.density_matrix_state import DensityMatrix
@@ -46,20 +44,12 @@ class Statistics(Observable):
46
44
  assert isinstance(state, StateVector | DensityMatrix)
47
45
  assert isinstance(config, SVConfig)
48
46
  duration = self.data[-1]
49
- if isinstance(state, StateVector) and state.vector.is_cuda:
50
- max_mem_per_device = (
51
- torch.cuda.max_memory_allocated(device) * 1e-6
52
- for device in range(torch.cuda.device_count())
53
- )
54
- max_mem = max(max_mem_per_device)
55
- elif isinstance(state, DensityMatrix) and state.matrix.is_cuda:
56
- max_mem_per_device = (
57
- torch.cuda.max_memory_allocated(device) * 1e-6
58
- for device in range(torch.cuda.device_count())
59
- )
60
- max_mem = max(max_mem_per_device)
61
- else:
62
- max_mem = getrusage(RUSAGE_SELF).ru_maxrss * 1e-3
47
+ max_mem = get_max_rss(
48
+ isinstance(state, StateVector)
49
+ and state.vector.is_cuda
50
+ or isinstance(state, DensityMatrix)
51
+ and state.matrix.is_cuda
52
+ )
63
53
 
64
54
  config.logger.info(
65
55
  f"step = {len(self.data)}/{self.timestep_count}, "
@@ -118,8 +108,9 @@ class BaseSVBackendImpl:
118
108
 
119
109
  def init_dark_qubits(self) -> None:
120
110
  if self._config.noise_model.state_prep_error > 0.0:
121
- self.well_prepared_qubits_filter = pick_dark_qubits(
122
- self._config.noise_model.state_prep_error, self.nqubits
111
+ bad_atoms = self._pulser_data.hamiltonian.bad_atoms
112
+ self.well_prepared_qubits_filter = torch.tensor(
113
+ [bool(bad_atoms[x]) for x in self._pulser_data.qubit_ids]
123
114
  )
124
115
  else:
125
116
  self.well_prepared_qubits_filter = None
emu_sv/sv_config.py CHANGED
@@ -6,6 +6,8 @@ from types import MethodType
6
6
  from typing import Any, ClassVar
7
7
 
8
8
  from emu_sv.utils import choose
9
+ from emu_sv.state_vector import StateVector
10
+ from emu_sv.dense_operator import DenseOperator
9
11
 
10
12
  from emu_sv.custom_callback_implementations import (
11
13
  qubit_occupation_sv_impl,
@@ -59,6 +61,8 @@ class SVConfig(EmulationConfig):
59
61
 
60
62
  # Whether to warn if unexpected kwargs are received
61
63
  _enforce_expected_kwargs: ClassVar[bool] = True
64
+ _state_type = StateVector
65
+ _operator_type = DenseOperator
62
66
 
63
67
  def __init__(
64
68
  self,
emu_sv/time_evolution.py CHANGED
@@ -140,7 +140,10 @@ class EvolveStateVector(torch.autograd.Function):
140
140
  interaction_matrix=interaction_matrix,
141
141
  device=state.device,
142
142
  )
143
- op = lambda x: -1j * dt * (ham * x)
143
+
144
+ def op(x: torch.Tensor) -> torch.Tensor:
145
+ return -1j * dt * (ham * x)
146
+
144
147
  res = krylov_exp(
145
148
  op,
146
149
  state,
@@ -273,7 +276,10 @@ class EvolveStateVector(torch.autograd.Function):
273
276
  )
274
277
 
275
278
  if any(ctx.needs_input_grad[1:5]):
276
- op = lambda x: -1j * dt * (ham * x)
279
+
280
+ def op(x: torch.Tensor):
281
+ return -1j * dt * (ham * x)
282
+
277
283
  lanczos_vectors_state, dS, lanczos_vectors_grad = double_krylov(
278
284
  op, state, grad_state_out, tolerance
279
285
  )
@@ -316,7 +322,10 @@ class EvolveStateVector(torch.autograd.Function):
316
322
  grad_int_mat[i, j] = (-1j * dt * torch.tensordot(Vg.conj(), v)).real
317
323
 
318
324
  if ctx.needs_input_grad[5]:
319
- op = lambda x: (1j * dt) * (ham * x)
325
+
326
+ def op(x: torch.Tensor):
327
+ return (1j * dt) * (ham * x)
328
+
320
329
  grad_state_in = krylov_exp(op, grad_state_out.detach(), tolerance, tolerance)
321
330
 
322
331
  return (
@@ -353,7 +362,9 @@ class EvolveDensityMatrix:
353
362
  device=density_matrix.device,
354
363
  )
355
364
 
356
- op = lambda x: -1j * dt * (ham @ x)
365
+ def op(x: torch.Tensor) -> torch.Tensor:
366
+ return -1j * dt * (ham @ x)
367
+
357
368
  return (
358
369
  krylov_exp(
359
370
  op,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emu-sv
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: Pasqal State Vector based pulse emulator built on PyTorch
5
5
  Project-URL: Documentation, https://pasqal-io.github.io/emulators/
6
6
  Project-URL: Repository, https://github.com/pasqal-io/emulators
@@ -25,7 +25,7 @@ Classifier: Programming Language :: Python :: 3.10
25
25
  Classifier: Programming Language :: Python :: Implementation :: CPython
26
26
  Classifier: Programming Language :: Python :: Implementation :: PyPy
27
27
  Requires-Python: >=3.10
28
- Requires-Dist: emu-base==2.3.0
28
+ Requires-Dist: emu-base==2.4.1
29
29
  Description-Content-Type: text/markdown
30
30
 
31
31
  <div align="center">
@@ -0,0 +1,15 @@
1
+ emu_sv/__init__.py,sha256=Sv7BbiGYuZzUh30AqMZpyA9m2zM8z-UKh_D2C6LACNs,771
2
+ emu_sv/custom_callback_implementations.py,sha256=_7XLIDzJ-p3DVqz-Jyv0eYbl8nih2x2p-pM4cBCLumA,6367
3
+ emu_sv/dense_operator.py,sha256=AvgntJNwwtf3Wl66CIWSwUezVYV3vignCL24SQQQwQg,5901
4
+ emu_sv/density_matrix_state.py,sha256=6QmLZvqEHLR64r0nD7D2jZIiAYOgciNVCjh3ywfvIs0,7243
5
+ emu_sv/hamiltonian.py,sha256=CqNGuWJlO2ZljK47wt130s-5uKiOldQUsC3tjwk1mKA,6106
6
+ emu_sv/lindblad_operator.py,sha256=pgjRNLBcvEM2-qxM8uy9wL74OtrD4A8trQeERi_AXH8,8892
7
+ emu_sv/state_vector.py,sha256=Ookw_BDqzs9OFppQd7kaMxDSkaj5F_clhOCgo-LSaMg,9910
8
+ emu_sv/sv_backend.py,sha256=-soOkSEzEBK1dCKnYnbtvYjmNZtZra1_4jP3H1ROOtM,737
9
+ emu_sv/sv_backend_impl.py,sha256=OYsJK_DJ8dmq3QZLKiBejXrq22R5Auyye-pai07NeeY,8798
10
+ emu_sv/sv_config.py,sha256=6fcuC9RKc7Pp55Yb-lWCGtZ7UJP53oLyZsy1f9wBtRg,6100
11
+ emu_sv/time_evolution.py,sha256=Uy3qMdt3BlLB6Aq1-o5uajRTu_3fPuBCtcusHxFPPJc,13545
12
+ emu_sv/utils.py,sha256=t0nMDVo6DF5bQW-vbsyRMCmvkyNxCU-v0Enmns9aOAU,1151
13
+ emu_sv-2.4.1.dist-info/METADATA,sha256=5nUzMJNramhABPKHG1D7h78W6L2MeSJpkZg1wAmDg2c,3595
14
+ emu_sv-2.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
15
+ emu_sv-2.4.1.dist-info/RECORD,,
@@ -1,15 +0,0 @@
1
- emu_sv/__init__.py,sha256=BWI-O-rXdn7xncmWEUdxtx7gFbWflcPD2lKcsll6t9w,771
2
- emu_sv/custom_callback_implementations.py,sha256=_7XLIDzJ-p3DVqz-Jyv0eYbl8nih2x2p-pM4cBCLumA,6367
3
- emu_sv/dense_operator.py,sha256=AvgntJNwwtf3Wl66CIWSwUezVYV3vignCL24SQQQwQg,5901
4
- emu_sv/density_matrix_state.py,sha256=BJpFzxjgWQOb_D6dehdA6dRUUQKP1iVccTDrZKicwRE,7198
5
- emu_sv/hamiltonian.py,sha256=CqNGuWJlO2ZljK47wt130s-5uKiOldQUsC3tjwk1mKA,6106
6
- emu_sv/lindblad_operator.py,sha256=pgjRNLBcvEM2-qxM8uy9wL74OtrD4A8trQeERi_AXH8,8892
7
- emu_sv/state_vector.py,sha256=oZeTr44Wt1zYEmPc3yN-Zz8aKxIBTjKA0XM23T8MQkU,9871
8
- emu_sv/sv_backend.py,sha256=-soOkSEzEBK1dCKnYnbtvYjmNZtZra1_4jP3H1ROOtM,737
9
- emu_sv/sv_backend_impl.py,sha256=ISls8DGZNHrH3Z7kmrzk3oQU3J8lgBg2V4KG09Zt3jA,9263
10
- emu_sv/sv_config.py,sha256=J4yb9-Na5hAbShDySzPfbt0WXvL8JpfrTEikTK8nH9s,5943
11
- emu_sv/time_evolution.py,sha256=_VH4f2RF6lGKzO08WxTYJ5Aw8_pTTMRKcyMnIuxH03I,13382
12
- emu_sv/utils.py,sha256=t0nMDVo6DF5bQW-vbsyRMCmvkyNxCU-v0Enmns9aOAU,1151
13
- emu_sv-2.3.0.dist-info/METADATA,sha256=yc7Z-DlF125zrnUeErZ24WrRnFKjbyPxeNAfz6RwjDI,3595
14
- emu_sv-2.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
15
- emu_sv-2.3.0.dist-info/RECORD,,
File without changes