emu-mps 1.2.4__py3-none-any.whl → 1.2.6__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_mps/__init__.py CHANGED
@@ -35,4 +35,4 @@ __all__ = [
35
35
  "SecondMomentOfEnergy",
36
36
  ]
37
37
 
38
- __version__ = "1.2.4"
38
+ __version__ = "1.2.6"
emu_mps/hamiltonian.py CHANGED
@@ -360,7 +360,6 @@ def make_H(
360
360
 
361
361
  nqubits = interaction_matrix.size(dim=1)
362
362
  middle = nqubits // 2
363
-
364
363
  interactions_to_keep = _get_interactions_to_keep(interaction_matrix)
365
364
 
366
365
  cores = [_first_factor(interactions_to_keep[0].item() != 0.0)]
emu_mps/mpo.py CHANGED
@@ -6,10 +6,9 @@ import torch
6
6
 
7
7
  from emu_mps.algebra import add_factors, scale_factors, zip_right
8
8
  from emu_base.base_classes.operator import FullOp, QuditOp
9
- from emu_base import Operator, State
9
+ from emu_base import Operator, State, DEVICE_COUNT
10
10
  from emu_mps.mps import MPS
11
11
  from emu_mps.utils import new_left_bath, assign_devices
12
- from emu_mps.constants import DEVICE_COUNT
13
12
 
14
13
 
15
14
  def _validate_operator_targets(operations: FullOp, nqubits: int) -> None:
emu_mps/mps.py CHANGED
@@ -6,7 +6,7 @@ from typing import Any, List, Optional, Iterable
6
6
 
7
7
  import torch
8
8
 
9
- from emu_base import State
9
+ from emu_base import State, DEVICE_COUNT
10
10
  from emu_mps import MPSConfig
11
11
  from emu_mps.algebra import add_factors, scale_factors
12
12
  from emu_mps.utils import (
@@ -16,7 +16,6 @@ from emu_mps.utils import (
16
16
  tensor_trace,
17
17
  n_operator,
18
18
  )
19
- from emu_mps.constants import DEVICE_COUNT
20
19
 
21
20
 
22
21
  class MPS(State):
@@ -11,7 +11,7 @@ import torch
11
11
  import time
12
12
  from pulser import Sequence
13
13
 
14
- from emu_base import Results, State, PulserData
14
+ from emu_base import Results, State, PulserData, DEVICE_COUNT
15
15
  from emu_base.math.brents_root_finding import BrentsRootFinder
16
16
  from emu_mps.hamiltonian import make_H, update_H
17
17
  from emu_mps.mpo import MPO
@@ -83,6 +83,12 @@ class MPSBackendImpl:
83
83
  )
84
84
  self.last_save_time = time.time()
85
85
 
86
+ if self.config.num_gpus_to_use > DEVICE_COUNT:
87
+ self.config.logger.warning(
88
+ f"Requested to use {self.config.num_gpus_to_use} GPU(s) "
89
+ f"but only {DEVICE_COUNT if DEVICE_COUNT > 0 else 'cpu'} available"
90
+ )
91
+
86
92
  @staticmethod
87
93
  def _get_autosave_filepath(autosave_prefix: str) -> pathlib.Path:
88
94
  return pathlib.Path(os.getcwd()) / (autosave_prefix + str(uuid.uuid1()) + ".dat")
emu_mps/mps_config.py CHANGED
@@ -1,7 +1,6 @@
1
1
  from typing import Any
2
2
 
3
- from emu_base import BackendConfig, State
4
- from emu_mps.constants import DEVICE_COUNT
3
+ from emu_base import BackendConfig, State, DEVICE_COUNT
5
4
 
6
5
 
7
6
  class MPSConfig(BackendConfig):
@@ -0,0 +1,9 @@
1
+ from .optimiser import minimize_bandwidth
2
+ from .permutations import permute_list, permute_matrix, invert_permutation
3
+
4
+ __all__ = [
5
+ "minimize_bandwidth",
6
+ "permute_list",
7
+ "permute_matrix",
8
+ "invert_permutation",
9
+ ]
@@ -0,0 +1,234 @@
1
+ from scipy.sparse import csr_matrix
2
+ from scipy.sparse.csgraph import reverse_cuthill_mckee
3
+ import numpy as np
4
+ from emu_mps.optimatrix.permutations import permute_matrix, permute_list
5
+ import itertools
6
+
7
+
8
+ def is_symmetric(mat: np.ndarray) -> bool:
9
+ if mat.shape[0] != mat.shape[1]:
10
+ return False
11
+ if not np.allclose(mat, mat.T, atol=1e-8):
12
+ return False
13
+
14
+ return True
15
+
16
+
17
+ def matrix_bandwidth(mat: np.ndarray) -> float:
18
+ """matrix_bandwidth(matrix: np.ndarray) -> float
19
+
20
+ Computes bandwidth as max weighted distance between columns of
21
+ a square matrix as `max (abs(matrix[i, j] * (j - i))`.
22
+
23
+ abs(j-i)
24
+ |<--------->|
25
+ (i,i) (i,j)
26
+ | |
27
+ | * . . . . . |
28
+ | . * . . a . |
29
+ | . . * . . . |
30
+ | . . . * . . |
31
+ | . . . . * . |
32
+ | . . . . . * |
33
+
34
+ Distance from the main diagonal `[i,i]` and element `m[i,j]` along row is
35
+ `abs(j-i)` and therefore the weighted distance is `abs(matrix[i, j] * (j - i))`
36
+
37
+ Parameters
38
+ -------
39
+ matrix :
40
+ square matrix nxn
41
+
42
+ Returns
43
+ -------
44
+ bandwidth of the input matrix
45
+
46
+ Example:
47
+ -------
48
+ >>> matrix = np.array([
49
+ ... [ 1, -17, 2.4],
50
+ ... [ 9, 1, -10],
51
+ ... [-15, 20, 1],])
52
+ >>> matrix_bandwidth(matrix) # 30.0 because abs(-15 * (2-0) == 30)
53
+ 30.0
54
+ """
55
+
56
+ bandwidth = max(abs(el * (index[0] - index[1])) for index, el in np.ndenumerate(mat))
57
+ return float(bandwidth)
58
+
59
+
60
+ def minimize_bandwidth_above_threshold(mat: np.ndarray, threshold: float) -> np.ndarray:
61
+ """
62
+ minimize_bandwidth_above_threshold(matrix, trunc) -> permutation_lists
63
+
64
+ Finds a permutation list that minimizes a bandwidth of a symmetric matrix `A = A.T`
65
+ using the reverse Cuthill-Mckee algorithm from `scipy.sparse.csgraph.reverse_cuthill_mckee`.
66
+ Matrix elements below a threshold `m[i,j] < threshold` are considered as 0.
67
+
68
+ Parameters
69
+ -------
70
+ matrix :
71
+ symmetric square matrix
72
+ threshold :
73
+ matrix elements `m[i,j] < threshold` are considered as 0
74
+
75
+ Returns
76
+ -------
77
+ permutation list that minimizes matrix bandwidth for a given threshold
78
+
79
+ Example:
80
+ -------
81
+ >>> matrix = np.array([
82
+ ... [1, 2, 3],
83
+ ... [2, 5, 6],
84
+ ... [3, 6, 9]])
85
+ >>> threshold = 3
86
+ >>> minimize_bandwidth_above_threshold(matrix, threshold)
87
+ array([1, 2, 0], dtype=int32)
88
+ """
89
+
90
+ matrix_truncated = mat.copy()
91
+ matrix_truncated[mat < threshold] = 0
92
+ rcm_permutation = reverse_cuthill_mckee(
93
+ csr_matrix(matrix_truncated), symmetric_mode=True
94
+ )
95
+ return np.array(rcm_permutation)
96
+
97
+
98
+ def minimize_bandwidth_global(mat: np.ndarray) -> list[int]:
99
+ """
100
+ minimize_bandwidth_global(matrix) -> list
101
+
102
+ Does one optimisation step towards finding
103
+ a permutation of a matrix that minimizes matrix bandwidth.
104
+
105
+ Parameters
106
+ -------
107
+ matrix :
108
+ symmetric square matrix
109
+
110
+ Returns
111
+ -------
112
+ permutation order that minimizes matrix bandwidth
113
+
114
+ Example:
115
+ -------
116
+ >>> matrix = np.array([
117
+ ... [1, 2, 3],
118
+ ... [2, 5, 6],
119
+ ... [3, 6, 9]])
120
+ >>> minimize_bandwidth_global(matrix)
121
+ [2, 1, 0]
122
+ """
123
+ mat_amplitude = np.max(np.abs(mat))
124
+ # Search from 1.0 to 0.1 doesn't change result
125
+ permutations = (
126
+ minimize_bandwidth_above_threshold(mat, trunc * mat_amplitude)
127
+ for trunc in np.arange(start=0.1, stop=1.0, step=0.01)
128
+ )
129
+
130
+ opt_permutation = min(
131
+ permutations, key=lambda perm: matrix_bandwidth(permute_matrix(mat, list(perm)))
132
+ )
133
+ return list(opt_permutation) # opt_permutation is np.ndarray
134
+
135
+
136
+ def minimize_bandwidth_impl(
137
+ matrix: np.ndarray, initial_perm: list[int]
138
+ ) -> tuple[list[int], float]:
139
+ """
140
+ minimize_bandwidth_impl(matrix, initial_perm) -> list
141
+
142
+ Applies initial_perm to a matrix and
143
+ finds the permutation list for a symmetric matrix that iteratively minimizes matrix bandwidth.
144
+
145
+ Parameters
146
+ -------
147
+ matrix :
148
+ symmetric square matrix
149
+ initial_perm: list of integers
150
+
151
+
152
+ Returns
153
+ -------
154
+ permutation order that minimizes matrix bandwidth
155
+
156
+ Example:
157
+ -------
158
+ Periodic 1D chain
159
+ >>> matrix = np.array([
160
+ ... [0, 1, 0, 0, 1],
161
+ ... [1, 0, 1, 0, 0],
162
+ ... [0, 1, 0, 1, 0],
163
+ ... [0, 0, 1, 0, 1],
164
+ ... [1, 0, 0, 1, 0]])
165
+ >>> id_perm = list(range(matrix.shape[0]))
166
+ >>> minimize_bandwidth_impl(matrix, id_perm) # [3, 2, 4, 1, 0] does zig-zag
167
+ ([3, 2, 4, 1, 0], 2.0)
168
+
169
+ Simple 1D chain. Cannot be optimised further
170
+ >>> matrix = np.array([
171
+ ... [0, 1, 0, 0, 0],
172
+ ... [1, 0, 1, 0, 0],
173
+ ... [0, 1, 0, 1, 0],
174
+ ... [0, 0, 1, 0, 1],
175
+ ... [0, 0, 0, 1, 0]])
176
+ >>> id_perm = list(range(matrix.shape[0]))
177
+ >>> minimize_bandwidth_impl(matrix, id_perm)
178
+ ([0, 1, 2, 3, 4], 1.0)
179
+ """
180
+ if initial_perm != list(range(matrix.shape[0])):
181
+ matrix = permute_matrix(matrix, initial_perm)
182
+ bandwidth = matrix_bandwidth(matrix)
183
+ acc_permutation = initial_perm
184
+
185
+ for counter in range(101):
186
+ if counter == 100:
187
+ raise (
188
+ NotImplementedError(
189
+ "The algorithm takes too many steps, " "probably not converging."
190
+ )
191
+ )
192
+
193
+ optimal_perm = minimize_bandwidth_global(matrix)
194
+ test_mat = permute_matrix(matrix, optimal_perm)
195
+ new_bandwidth = matrix_bandwidth(test_mat)
196
+
197
+ if bandwidth <= new_bandwidth:
198
+ break
199
+
200
+ matrix = test_mat
201
+ acc_permutation = permute_list(acc_permutation, optimal_perm)
202
+ bandwidth = new_bandwidth
203
+
204
+ return acc_permutation, bandwidth
205
+
206
+
207
+ def minimize_bandwidth(input_matrix: np.ndarray, samples: int = 100) -> list[int]:
208
+ assert is_symmetric(input_matrix), "Input matrix is not symmetric"
209
+ input_mat = abs(input_matrix)
210
+ # We are interested in strength of the interaction, not sign
211
+
212
+ L = input_mat.shape[0]
213
+ rnd_permutations = itertools.chain(
214
+ [list(range(L))], # First element is always the identity list
215
+ (np.random.permutation(L).tolist() for _ in range(samples)),
216
+ )
217
+
218
+ opt_permutations_and_opt_bandwidth = (
219
+ minimize_bandwidth_impl(input_mat, rnd_perm) for rnd_perm in rnd_permutations
220
+ )
221
+
222
+ best_perm, best_bandwidth = min(
223
+ opt_permutations_and_opt_bandwidth,
224
+ key=lambda perm_and_bandwidth: perm_and_bandwidth[1],
225
+ )
226
+
227
+ assert best_bandwidth <= matrix_bandwidth(input_matrix), "Matrix is not optimised"
228
+ return best_perm
229
+
230
+
231
+ if __name__ == "__main__":
232
+ import doctest
233
+
234
+ doctest.testmod()
@@ -0,0 +1,94 @@
1
+ import numpy as np
2
+
3
+
4
+ def permute_list(input_list: list, permutation: list[int]) -> list:
5
+ """
6
+ Permutes the input list according to the given permutation.
7
+
8
+ Parameters
9
+ -------
10
+ input_list :
11
+ A list to permute.
12
+ permutation :
13
+ A list of indices representing the new order.
14
+
15
+ Returns
16
+ -------
17
+ The permuted list.
18
+
19
+ Example
20
+ -------
21
+ >>> permute_list(['a', 'b', 'c'], [2, 0, 1])
22
+ ['c', 'a', 'b']
23
+ """
24
+
25
+ permuted_list = [None] * len(input_list)
26
+ for i, p in enumerate(permutation):
27
+ permuted_list[i] = input_list[p]
28
+ return permuted_list
29
+
30
+
31
+ def invert_permutation(permutation: list[int]) -> list[int]:
32
+ """
33
+ invert_permutation(permutation) -> inv_permutation
34
+
35
+ Inverts the input permutation list.
36
+
37
+ Parameters
38
+ -------
39
+ permutation :
40
+ A list of indices representing the order
41
+
42
+ Returns
43
+ -------
44
+ permutation list inverse to the input list
45
+
46
+ Example:
47
+ -------
48
+ >>> invert_permutation([2, 0, 1])
49
+ [1, 2, 0]
50
+ """
51
+
52
+ inv_perm = np.empty_like(permutation)
53
+ inv_perm[permutation] = np.arange(len(permutation))
54
+ return list(inv_perm)
55
+
56
+
57
+ def permute_matrix(mat: np.ndarray, permutation: list[int]) -> np.ndarray:
58
+ """
59
+ permute_matrix(matrix, permutation_list) -> permuted_matrix
60
+
61
+ Simultaneously permutes columns and rows according to a permutation list.
62
+
63
+ Parameters
64
+ -------
65
+ matrix :
66
+ square matrix nxn
67
+ permutation :
68
+ permutation list
69
+
70
+ Returns
71
+ -------
72
+ matrix with permuted columns and rows
73
+
74
+ Example:
75
+ -------
76
+ >>> matrix = np.array([
77
+ ... [1, 2, 3],
78
+ ... [4, 5, 6],
79
+ ... [7, 8, 9]])
80
+ >>> permutation = [1, 0, 2]
81
+ >>> permute_matrix(matrix, permutation)
82
+ array([[5, 4, 6],
83
+ [2, 1, 3],
84
+ [8, 7, 9]])
85
+ """
86
+
87
+ perm = np.array(permutation)
88
+ return mat[perm, :][:, perm]
89
+
90
+
91
+ if __name__ == "__main__":
92
+ import doctest
93
+
94
+ doctest.testmod()
@@ -1,7 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emu-mps
3
- Version: 1.2.4
3
+ Version: 1.2.6
4
4
  Summary: Pasqal MPS based pulse emulator built on PyTorch
5
+ Project-URL: Documentation, https://pasqal-io.github.io/emulators/
6
+ Project-URL: Repository, https://github.com/pasqal-io/emulators
7
+ Project-URL: Issues, https://github.com/pasqal-io/emulators/issues
5
8
  Author-email: Anton Quelle <anton.quelle@pasqal.com>, Mauro Mendizabal <mauro.mendizabal-pico@pasqal.com>, Stefano Grava <stefano.grava@pasqal.com>, Pablo Le Henaff <pablo.le-henaff@pasqal.com>
6
9
  License: PASQAL OPEN-SOURCE SOFTWARE LICENSE AGREEMENT (MIT-derived)
7
10
 
@@ -22,78 +25,13 @@ Classifier: Programming Language :: Python :: 3.10
22
25
  Classifier: Programming Language :: Python :: Implementation :: CPython
23
26
  Classifier: Programming Language :: Python :: Implementation :: PyPy
24
27
  Requires-Python: >=3.10
25
- Requires-Dist: emu-base==1.2.4
28
+ Requires-Dist: emu-base==1.2.6
26
29
  Description-Content-Type: text/markdown
27
30
 
28
31
  <div align="center">
29
32
  <img src="docs/logos/LogoTaglineSoftGreen.svg">
30
-
31
- # Emu-MPS
32
33
  </div>
33
34
 
34
- **Emu-mps** is a backend for the [Pulser low-level Quantum Programming toolkit](https://pulser.readthedocs.io) that lets you run Quantum Algorithms on a simulated device, using GPU acceleration if available. More in depth, emu-mps is designed to **emu**late the dynamics of programmable arrays of neutral atoms, with matrix product states (**mps**). While benchmarking is incomplete as of this writing, early results suggest that this design makes emu-mps faster and more memory-efficient than previous generations of quantum emulators at running simulations with large numbers of qubits.
35
-
36
- ## Installation
37
-
38
- **Warning:** installing emu-mps will update pulser-core
39
-
40
- ### Using `hatch`, `uv` or any pyproject-compatible Python manager
41
-
42
- To add `emu-mps` to your project, edit your `pyproject.toml` to add the line
43
-
44
- ```toml
45
- "emu-mps"
46
- ```
47
-
48
- to the list of `dependencies`.
49
-
50
-
51
- ### Using `pip` or `pipx`
52
- To install the `pipy` package using `pip` or `pipx`
53
-
54
- 1. Create a `venv` if that's not done yet
55
-
56
- ```sh
57
- $ python -m venv venv
58
-
59
- ```
60
-
61
- 2. Enter the venv
62
-
63
- If you're running Unix:
64
-
65
- ```sh
66
- $ . venv/bin/activate
67
- ```
68
-
69
- If you're running Windows:
70
-
71
- ```sh
72
- C:\> /path/to/new/virtual/environment/Scripts/activate
73
- ```
74
-
75
- 3. Install the package
76
-
77
- ```sh
78
- $ pip install emu-mps
79
- # or
80
- $ pipx install emu-mps
81
- ```
82
-
83
-
84
- Join us on [Slack](https://pasqalworkspace.slack.com/archives/C07MUV5K7EU) or by [e-mail](mailto:emulation@pasqal.com) to give us feedback about how you plan to use Emu-MPS or if you require specific feature-upgrades.
85
-
86
- ## Usage
87
-
88
- For the time being, the easiest way to learn how to use this package is to look
89
- at the [examples](examples/emu_mps_examples) and [notebooks](https://pasqal-io.github.io/emulators/latest/).
90
-
91
- See also the [full documentation](https://github.com/pasqal-io/emulators/blob/main/docs/index.md) for
92
- the API, information about contributing, benchmarks, etc.
93
-
94
-
95
- ## Getting in touch
35
+ # Welcome to the Pasqal analog emulators
96
36
 
97
- - [Pasqal Community Portal](https://community.pasqal.com/) (forums, chat, tutorials, examples, code library).
98
- - [GitHub Repository](https://github.com/pasqal-io/quantum-evolution-kernel) (source code, issue tracker).
99
- - [Professional Support](https://www.pasqal.com/contact-us/) (if you need tech support, custom licenses, a variant of this library optimized for your workload, your own QPU, remote access to a QPU, ...)
37
+ Welcome, and please see the [GitHub pages](https://pasqal-io.github.io/emulators/) for a landing page to this repo.
@@ -0,0 +1,17 @@
1
+ emu_mps/__init__.py,sha256=KphiJUrBt3vjS0e2_tQejeB12X3YwqrEhxwfF1QRXQE,646
2
+ emu_mps/algebra.py,sha256=ngPtTH-j2ZCBWoaJZXlkUyIlug7dY7Q92gzfnRlpPMA,5485
3
+ emu_mps/hamiltonian.py,sha256=LcBs6CKBb643a1e9AAVtQoUfa4L_0dIhLOKecx5OOWs,15864
4
+ emu_mps/mpo.py,sha256=H5vkJvz4AfXfnPbvgWznBWpMUO8LnGL3_NAP3IhxZzQ,8740
5
+ emu_mps/mps.py,sha256=CcduX2BC4ArBwwF41w_FQCa6wqmynegQQC9zkK0EmgQ,17826
6
+ emu_mps/mps_backend.py,sha256=6fVaq-D4xyicYRjGjhqMEieC7---90LpfpbV7ZD7zkQ,2192
7
+ emu_mps/mps_backend_impl.py,sha256=Rp7WbT0Dto1G4ArqSLEzSHkJAuMIEZfUqUMP9Dyz31M,20838
8
+ emu_mps/mps_config.py,sha256=ydKN0OOaWCBcNd9V-4CU5ZZ4w1FRT-bbKyZQD2WCaME,3317
9
+ emu_mps/noise.py,sha256=h4X2EFjoC_Ok0gZ8I9wN77RANXaVehTBbjkcbY_GAmY,784
10
+ emu_mps/tdvp.py,sha256=TH4CcBNczRURXYGPXndWKDs0jWXz_x9ozM961uGiSOw,5711
11
+ emu_mps/utils.py,sha256=n9BcpuIz4Kl6EYlATaK8TKsyF-T7FTwbBo6KSAQYzl8,8066
12
+ emu_mps/optimatrix/__init__.py,sha256=lHWYNeThHp57ZrwTwXd0p8bNvcCv0w_AZ31iCWflBUo,226
13
+ emu_mps/optimatrix/optimiser.py,sha256=cVMdm2r_4OpbthcQuFMrJ9rNR9WEJRga9c_lHrJFkhw,6687
14
+ emu_mps/optimatrix/permutations.py,sha256=JRXGont8B4QgbkV9CzrA0w7uzLgBrmZ1J9aa0G52hPo,1979
15
+ emu_mps-1.2.6.dist-info/METADATA,sha256=iUObGpVmQN3Y6GM_ScEFmFlY80htsWrIjo53ER2Flvw,3505
16
+ emu_mps-1.2.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
+ emu_mps-1.2.6.dist-info/RECORD,,
emu_mps/constants.py DELETED
@@ -1,4 +0,0 @@
1
- import torch
2
-
3
-
4
- DEVICE_COUNT = torch.cuda.device_count()
@@ -1,15 +0,0 @@
1
- emu_mps/__init__.py,sha256=ou1n7ieIHlszqg9hBVYhvA8IBOpeduAWno3GC7X2dWE,646
2
- emu_mps/algebra.py,sha256=ngPtTH-j2ZCBWoaJZXlkUyIlug7dY7Q92gzfnRlpPMA,5485
3
- emu_mps/constants.py,sha256=41LYkKLUCz-oxPbd-j7nUDZuhIbUrnez6prT0uR0jcE,56
4
- emu_mps/hamiltonian.py,sha256=LALCdAQyYQgqFLVvtB9cHoUilT_7eU-6bAHRhu39lqM,15865
5
- emu_mps/mpo.py,sha256=7y6q0UIfyX9igQknqtgt6nymuVcgjHlH3-Qv7N7uOZE,8769
6
- emu_mps/mps.py,sha256=OjG_caqPOioCdOt-bFUkOf2xuNGnKzj0LaMc3EJCHi4,17855
7
- emu_mps/mps_backend.py,sha256=6fVaq-D4xyicYRjGjhqMEieC7---90LpfpbV7ZD7zkQ,2192
8
- emu_mps/mps_backend_impl.py,sha256=XCrmIjV-ZzI0nTOoaIaM6RGtfo4WHoJakVtoqoTZ7zI,20556
9
- emu_mps/mps_config.py,sha256=MxahrPDaOpfdB6SLG1610iDUOuLR04IaCjKQRk99ICY,3346
10
- emu_mps/noise.py,sha256=h4X2EFjoC_Ok0gZ8I9wN77RANXaVehTBbjkcbY_GAmY,784
11
- emu_mps/tdvp.py,sha256=TH4CcBNczRURXYGPXndWKDs0jWXz_x9ozM961uGiSOw,5711
12
- emu_mps/utils.py,sha256=n9BcpuIz4Kl6EYlATaK8TKsyF-T7FTwbBo6KSAQYzl8,8066
13
- emu_mps-1.2.4.dist-info/METADATA,sha256=nAxhFZeRlvVOqTdfJ-szluFRpa0q8EwbmogczPni3kM,5465
14
- emu_mps-1.2.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
15
- emu_mps-1.2.4.dist-info/RECORD,,