Trajectree 0.0.0__py3-none-any.whl → 0.0.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.
- trajectree/__init__.py +3 -0
- trajectree/fock_optics/devices.py +1 -1
- trajectree/fock_optics/light_sources.py +2 -2
- trajectree/fock_optics/measurement.py +3 -3
- trajectree/fock_optics/utils.py +6 -6
- trajectree/quimb/docs/_pygments/_pygments_dark.py +118 -0
- trajectree/quimb/docs/_pygments/_pygments_light.py +118 -0
- trajectree/quimb/docs/conf.py +158 -0
- trajectree/quimb/docs/examples/ex_mpi_expm_evo.py +62 -0
- trajectree/quimb/quimb/__init__.py +507 -0
- trajectree/quimb/quimb/calc.py +1491 -0
- trajectree/quimb/quimb/core.py +2279 -0
- trajectree/quimb/quimb/evo.py +712 -0
- trajectree/quimb/quimb/experimental/__init__.py +0 -0
- trajectree/quimb/quimb/experimental/autojittn.py +129 -0
- trajectree/quimb/quimb/experimental/belief_propagation/__init__.py +109 -0
- trajectree/quimb/quimb/experimental/belief_propagation/bp_common.py +397 -0
- trajectree/quimb/quimb/experimental/belief_propagation/d1bp.py +316 -0
- trajectree/quimb/quimb/experimental/belief_propagation/d2bp.py +653 -0
- trajectree/quimb/quimb/experimental/belief_propagation/hd1bp.py +571 -0
- trajectree/quimb/quimb/experimental/belief_propagation/hv1bp.py +775 -0
- trajectree/quimb/quimb/experimental/belief_propagation/l1bp.py +316 -0
- trajectree/quimb/quimb/experimental/belief_propagation/l2bp.py +537 -0
- trajectree/quimb/quimb/experimental/belief_propagation/regions.py +194 -0
- trajectree/quimb/quimb/experimental/cluster_update.py +286 -0
- trajectree/quimb/quimb/experimental/merabuilder.py +865 -0
- trajectree/quimb/quimb/experimental/operatorbuilder/__init__.py +15 -0
- trajectree/quimb/quimb/experimental/operatorbuilder/operatorbuilder.py +1631 -0
- trajectree/quimb/quimb/experimental/schematic.py +7 -0
- trajectree/quimb/quimb/experimental/tn_marginals.py +130 -0
- trajectree/quimb/quimb/experimental/tnvmc.py +1483 -0
- trajectree/quimb/quimb/gates.py +36 -0
- trajectree/quimb/quimb/gen/__init__.py +2 -0
- trajectree/quimb/quimb/gen/operators.py +1167 -0
- trajectree/quimb/quimb/gen/rand.py +713 -0
- trajectree/quimb/quimb/gen/states.py +479 -0
- trajectree/quimb/quimb/linalg/__init__.py +6 -0
- trajectree/quimb/quimb/linalg/approx_spectral.py +1109 -0
- trajectree/quimb/quimb/linalg/autoblock.py +258 -0
- trajectree/quimb/quimb/linalg/base_linalg.py +719 -0
- trajectree/quimb/quimb/linalg/mpi_launcher.py +397 -0
- trajectree/quimb/quimb/linalg/numpy_linalg.py +244 -0
- trajectree/quimb/quimb/linalg/rand_linalg.py +514 -0
- trajectree/quimb/quimb/linalg/scipy_linalg.py +293 -0
- trajectree/quimb/quimb/linalg/slepc_linalg.py +892 -0
- trajectree/quimb/quimb/schematic.py +1518 -0
- trajectree/quimb/quimb/tensor/__init__.py +401 -0
- trajectree/quimb/quimb/tensor/array_ops.py +610 -0
- trajectree/quimb/quimb/tensor/circuit.py +4824 -0
- trajectree/quimb/quimb/tensor/circuit_gen.py +411 -0
- trajectree/quimb/quimb/tensor/contraction.py +336 -0
- trajectree/quimb/quimb/tensor/decomp.py +1255 -0
- trajectree/quimb/quimb/tensor/drawing.py +1646 -0
- trajectree/quimb/quimb/tensor/fitting.py +385 -0
- trajectree/quimb/quimb/tensor/geometry.py +583 -0
- trajectree/quimb/quimb/tensor/interface.py +114 -0
- trajectree/quimb/quimb/tensor/networking.py +1058 -0
- trajectree/quimb/quimb/tensor/optimize.py +1818 -0
- trajectree/quimb/quimb/tensor/tensor_1d.py +4778 -0
- trajectree/quimb/quimb/tensor/tensor_1d_compress.py +1854 -0
- trajectree/quimb/quimb/tensor/tensor_1d_tebd.py +662 -0
- trajectree/quimb/quimb/tensor/tensor_2d.py +5954 -0
- trajectree/quimb/quimb/tensor/tensor_2d_compress.py +96 -0
- trajectree/quimb/quimb/tensor/tensor_2d_tebd.py +1230 -0
- trajectree/quimb/quimb/tensor/tensor_3d.py +2869 -0
- trajectree/quimb/quimb/tensor/tensor_3d_tebd.py +46 -0
- trajectree/quimb/quimb/tensor/tensor_approx_spectral.py +60 -0
- trajectree/quimb/quimb/tensor/tensor_arbgeom.py +3237 -0
- trajectree/quimb/quimb/tensor/tensor_arbgeom_compress.py +565 -0
- trajectree/quimb/quimb/tensor/tensor_arbgeom_tebd.py +1138 -0
- trajectree/quimb/quimb/tensor/tensor_builder.py +5411 -0
- trajectree/quimb/quimb/tensor/tensor_core.py +11179 -0
- trajectree/quimb/quimb/tensor/tensor_dmrg.py +1472 -0
- trajectree/quimb/quimb/tensor/tensor_mera.py +204 -0
- trajectree/quimb/quimb/utils.py +892 -0
- trajectree/quimb/tests/__init__.py +0 -0
- trajectree/quimb/tests/test_accel.py +501 -0
- trajectree/quimb/tests/test_calc.py +788 -0
- trajectree/quimb/tests/test_core.py +847 -0
- trajectree/quimb/tests/test_evo.py +565 -0
- trajectree/quimb/tests/test_gen/__init__.py +0 -0
- trajectree/quimb/tests/test_gen/test_operators.py +361 -0
- trajectree/quimb/tests/test_gen/test_rand.py +296 -0
- trajectree/quimb/tests/test_gen/test_states.py +261 -0
- trajectree/quimb/tests/test_linalg/__init__.py +0 -0
- trajectree/quimb/tests/test_linalg/test_approx_spectral.py +368 -0
- trajectree/quimb/tests/test_linalg/test_base_linalg.py +351 -0
- trajectree/quimb/tests/test_linalg/test_mpi_linalg.py +127 -0
- trajectree/quimb/tests/test_linalg/test_numpy_linalg.py +84 -0
- trajectree/quimb/tests/test_linalg/test_rand_linalg.py +134 -0
- trajectree/quimb/tests/test_linalg/test_slepc_linalg.py +283 -0
- trajectree/quimb/tests/test_tensor/__init__.py +0 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/__init__.py +0 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_d1bp.py +39 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_d2bp.py +67 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_hd1bp.py +64 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_hv1bp.py +51 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_l1bp.py +142 -0
- trajectree/quimb/tests/test_tensor/test_belief_propagation/test_l2bp.py +101 -0
- trajectree/quimb/tests/test_tensor/test_circuit.py +816 -0
- trajectree/quimb/tests/test_tensor/test_contract.py +67 -0
- trajectree/quimb/tests/test_tensor/test_decomp.py +40 -0
- trajectree/quimb/tests/test_tensor/test_mera.py +52 -0
- trajectree/quimb/tests/test_tensor/test_optimizers.py +488 -0
- trajectree/quimb/tests/test_tensor/test_tensor_1d.py +1171 -0
- trajectree/quimb/tests/test_tensor/test_tensor_2d.py +606 -0
- trajectree/quimb/tests/test_tensor/test_tensor_2d_tebd.py +144 -0
- trajectree/quimb/tests/test_tensor/test_tensor_3d.py +123 -0
- trajectree/quimb/tests/test_tensor/test_tensor_arbgeom.py +226 -0
- trajectree/quimb/tests/test_tensor/test_tensor_builder.py +441 -0
- trajectree/quimb/tests/test_tensor/test_tensor_core.py +2066 -0
- trajectree/quimb/tests/test_tensor/test_tensor_dmrg.py +388 -0
- trajectree/quimb/tests/test_tensor/test_tensor_spectral_approx.py +63 -0
- trajectree/quimb/tests/test_tensor/test_tensor_tebd.py +270 -0
- trajectree/quimb/tests/test_utils.py +85 -0
- trajectree/trajectory.py +2 -2
- {trajectree-0.0.0.dist-info → trajectree-0.0.1.dist-info}/METADATA +2 -2
- trajectree-0.0.1.dist-info/RECORD +126 -0
- trajectree-0.0.0.dist-info/RECORD +0 -16
- {trajectree-0.0.0.dist-info → trajectree-0.0.1.dist-info}/WHEEL +0 -0
- {trajectree-0.0.0.dist-info → trajectree-0.0.1.dist-info}/licenses/LICENSE +0 -0
- {trajectree-0.0.0.dist-info → trajectree-0.0.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""Numba accelerated functions for finding charge sectors and subselecting
|
|
2
|
+
submatrices.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import numba
|
|
7
|
+
|
|
8
|
+
from ..core import njit, pnjit, qarray
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@njit
|
|
12
|
+
def get_nz(A): # pragma: no cover
|
|
13
|
+
return np.nonzero(A)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@njit
|
|
17
|
+
def compute_blocks(ix, jx, d): # pragma: no cover
|
|
18
|
+
"""Find the charge sectors (blocks in matrix terms) given element
|
|
19
|
+
coordinates ``ix`` and ``jx`` and total size ``d``.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
ix : array of int
|
|
24
|
+
The row coordinates of non-zero elements.
|
|
25
|
+
jx : array of int
|
|
26
|
+
The column coordinates of non-zero elements.
|
|
27
|
+
d : int
|
|
28
|
+
The total size of the operator.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
sectors : list[list[int]]
|
|
33
|
+
The list of charge sectors. Each element is itself a sorted list of the
|
|
34
|
+
basis numbers that make up that sector. The permutation that would
|
|
35
|
+
block diagonalize the operator is then ``np.concatenate(sectors)``.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
|
|
40
|
+
>>> H = ham_hubbard_hardcore(4, sparse=True)
|
|
41
|
+
>>> ix, jx = H.nonzero()
|
|
42
|
+
>>> d = H.shape[0]
|
|
43
|
+
>>> sectors = compute_blocks(ix, jx, d)
|
|
44
|
+
>>> sectors
|
|
45
|
+
[[0], [1, 2, 4, 8], [3, 5, 6, 9, 10, 12], [7, 11, 13, 14], [15]]
|
|
46
|
+
"""
|
|
47
|
+
groups = []
|
|
48
|
+
|
|
49
|
+
# go through actual nz -> these define edges of a graph and we are
|
|
50
|
+
# looking for all connected components (disconnected subgraphs)
|
|
51
|
+
for i, j in zip(ix, jx):
|
|
52
|
+
merge = []
|
|
53
|
+
for g, group in enumerate(groups):
|
|
54
|
+
if i in group:
|
|
55
|
+
group.add(j)
|
|
56
|
+
merge.append(g)
|
|
57
|
+
elif j in group:
|
|
58
|
+
group.add(i)
|
|
59
|
+
merge.append(g)
|
|
60
|
+
|
|
61
|
+
if len(merge) == 0:
|
|
62
|
+
# new group
|
|
63
|
+
groups.append({i, j})
|
|
64
|
+
|
|
65
|
+
elif len(merge) > 1:
|
|
66
|
+
# merge groups
|
|
67
|
+
group0 = groups[merge[0]]
|
|
68
|
+
for g in merge[-1:0:-1]:
|
|
69
|
+
# XXX: just popping here causes numba big problems?
|
|
70
|
+
# so we clear and filter empty groups later
|
|
71
|
+
other_group = groups[g]
|
|
72
|
+
group0.update(other_group)
|
|
73
|
+
other_group.clear()
|
|
74
|
+
|
|
75
|
+
# make sure kernel added as subspace
|
|
76
|
+
for i in range(d):
|
|
77
|
+
for group in groups:
|
|
78
|
+
if i in group:
|
|
79
|
+
break
|
|
80
|
+
else: # no break
|
|
81
|
+
groups.append({i})
|
|
82
|
+
|
|
83
|
+
# sort indices in each group and groups by first element
|
|
84
|
+
return sorted([sorted(g) for g in groups if g])
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@pnjit
|
|
88
|
+
def subselect(A, p): # pragma: no cover
|
|
89
|
+
"""Select only the intersection of rows and columns of ``A`` matching the
|
|
90
|
+
basis indices ``p``. Faster than double numpy slicing.
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
A : 2D-array
|
|
95
|
+
Dense matrix to select from.
|
|
96
|
+
p : sequence of int
|
|
97
|
+
The basis indices to select.
|
|
98
|
+
|
|
99
|
+
Returns
|
|
100
|
+
-------
|
|
101
|
+
B : 2D-array
|
|
102
|
+
The matrix, of size ``(len(p), len(p))``.
|
|
103
|
+
|
|
104
|
+
Examples
|
|
105
|
+
--------
|
|
106
|
+
>>> A = np.arange(25).reshape(5, 5)
|
|
107
|
+
>>> A
|
|
108
|
+
array([[ 0, 1, 2, 3, 4],
|
|
109
|
+
[ 5, 6, 7, 8, 9],
|
|
110
|
+
[10, 11, 12, 13, 14],
|
|
111
|
+
[15, 16, 17, 18, 19],
|
|
112
|
+
[20, 21, 22, 23, 24]])
|
|
113
|
+
|
|
114
|
+
>>> subselect(A, [1, 3])
|
|
115
|
+
array([[ 6, 8],
|
|
116
|
+
[16, 18]])
|
|
117
|
+
"""
|
|
118
|
+
dp = len(p)
|
|
119
|
+
out = np.empty((dp, dp), dtype=A.dtype)
|
|
120
|
+
|
|
121
|
+
for i in numba.prange(dp):
|
|
122
|
+
for j in numba.prange(dp):
|
|
123
|
+
out[i, j] = A[p[i], p[j]]
|
|
124
|
+
|
|
125
|
+
return out
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@pnjit
|
|
129
|
+
def subselect_set(A, B, p): # pragma: no cover
|
|
130
|
+
"""Set only the intersection of rows and colums of ``A`` matching the
|
|
131
|
+
basis indices ``p`` to ``B``.
|
|
132
|
+
|
|
133
|
+
Parameters
|
|
134
|
+
----------
|
|
135
|
+
A : array with shape (d, d)
|
|
136
|
+
The matrix to set elements in.
|
|
137
|
+
B : array with shape (dp, dp)
|
|
138
|
+
The matrix to set elements from.
|
|
139
|
+
p : sequence of size dp
|
|
140
|
+
The basis indices.
|
|
141
|
+
|
|
142
|
+
Examples
|
|
143
|
+
--------
|
|
144
|
+
>>> A = np.zeros((5, 5))
|
|
145
|
+
>>> B = np.random.randn(3, 3)
|
|
146
|
+
>>> p = [0, 2, 4]
|
|
147
|
+
>>> subselect_set(A, B, p)
|
|
148
|
+
array([[-0.31888218, 0. , 0.39293245, 0. , 0.21822712],
|
|
149
|
+
[ 0. , 0. , 0. , 0. , 0. ],
|
|
150
|
+
[ 0.66674486, 0. , 1.03388035, 0. , 1.7319345 ],
|
|
151
|
+
[ 0. , 0. , 0. , 0. , 0. ],
|
|
152
|
+
[-0.94542733, 0. , -0.37211882, 0. , 0.51951555]])
|
|
153
|
+
"""
|
|
154
|
+
dp = len(p)
|
|
155
|
+
|
|
156
|
+
for i in numba.prange(dp):
|
|
157
|
+
for j in numba.prange(dp):
|
|
158
|
+
A[p[i], p[j]] = B[i, j]
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# XXX: want to cache this eventaully -> need parallel+cache numba support?
|
|
162
|
+
@njit
|
|
163
|
+
def _eigh_autoblocked(A, sort=True): # pragma: no cover
|
|
164
|
+
d = A.shape[0]
|
|
165
|
+
|
|
166
|
+
# allocate output arrays
|
|
167
|
+
el = np.empty(d)
|
|
168
|
+
ev = np.zeros_like(A)
|
|
169
|
+
|
|
170
|
+
# find non-zero elements and group into charge sectors
|
|
171
|
+
ix, jx = get_nz(A)
|
|
172
|
+
gs = compute_blocks(ix, jx, d)
|
|
173
|
+
gs = [np.array(g) for g in gs]
|
|
174
|
+
|
|
175
|
+
# diagonalize each charge sector seperately
|
|
176
|
+
for g in gs:
|
|
177
|
+
ng = len(g)
|
|
178
|
+
|
|
179
|
+
# check if trivial
|
|
180
|
+
if ng == 1:
|
|
181
|
+
el[g[0]] = A[g[0], g[0]].real
|
|
182
|
+
ev[g[0], g[0]] = 1.0
|
|
183
|
+
continue
|
|
184
|
+
|
|
185
|
+
# else diagonalize just the block
|
|
186
|
+
sub_el, sub_ev = np.linalg.eigh(subselect(A, g))
|
|
187
|
+
|
|
188
|
+
# set the correct eigenpairs in the output
|
|
189
|
+
el[g] = sub_el
|
|
190
|
+
subselect_set(ev, sub_ev, g)
|
|
191
|
+
|
|
192
|
+
# sort into ascending eigenvalue order
|
|
193
|
+
if sort:
|
|
194
|
+
so = np.argsort(el)
|
|
195
|
+
el[:] = el[so]
|
|
196
|
+
ev[:, :] = ev[:, so]
|
|
197
|
+
|
|
198
|
+
return el, ev
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# XXX: want to cache this eventaully -> need parallel+cache numba support?
|
|
202
|
+
@njit
|
|
203
|
+
def _eigvalsh_autoblocked(A, sort=True): # pragma: no cover
|
|
204
|
+
# as above but ignore eigenvector for extra speed
|
|
205
|
+
d = A.shape[0]
|
|
206
|
+
|
|
207
|
+
el = np.empty(d)
|
|
208
|
+
|
|
209
|
+
ix, jx = get_nz(A)
|
|
210
|
+
gs = compute_blocks(ix, jx, d)
|
|
211
|
+
gs = [np.array(g) for g in gs]
|
|
212
|
+
|
|
213
|
+
for _, g in enumerate(gs):
|
|
214
|
+
if len(g) == 1:
|
|
215
|
+
el[g[0]] = A[g[0], g[0]]
|
|
216
|
+
continue
|
|
217
|
+
|
|
218
|
+
el[g] = np.linalg.eigvalsh(subselect(A, g))
|
|
219
|
+
|
|
220
|
+
if sort:
|
|
221
|
+
return np.sort(el)
|
|
222
|
+
|
|
223
|
+
return el
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def eigensystem_autoblocked(A, sort=True, return_vecs=True, isherm=True):
|
|
227
|
+
"""Perform Hermitian eigen-decomposition, automatically identifying and
|
|
228
|
+
exploiting symmetries appearing in the current basis as block diagonals
|
|
229
|
+
formed via permutation of rows and columns. The whole process is
|
|
230
|
+
accelerated using ``numba``.
|
|
231
|
+
|
|
232
|
+
Parameters
|
|
233
|
+
----------
|
|
234
|
+
A : array_like
|
|
235
|
+
The operator to eigen-decompose.
|
|
236
|
+
sort : bool, optional
|
|
237
|
+
Whether to sort into ascending order, default True.
|
|
238
|
+
isherm : bool, optional
|
|
239
|
+
Whether ``A`` is hermitian, default True.
|
|
240
|
+
return_vecs : bool, optional
|
|
241
|
+
Whether to return the eigenvectors, default True.
|
|
242
|
+
|
|
243
|
+
Returns
|
|
244
|
+
-------
|
|
245
|
+
evals : 1D-array
|
|
246
|
+
The eigenvalues.
|
|
247
|
+
evecs : qarray
|
|
248
|
+
If ``return_vecs=True``, the eigenvectors.
|
|
249
|
+
"""
|
|
250
|
+
if not isherm:
|
|
251
|
+
err_msg = "Non-hermitian autoblocking not implemented yet."
|
|
252
|
+
raise NotImplementedError(err_msg)
|
|
253
|
+
|
|
254
|
+
if not return_vecs:
|
|
255
|
+
return _eigvalsh_autoblocked(A, sort=sort)
|
|
256
|
+
|
|
257
|
+
el, ev = _eigh_autoblocked(A, sort=sort)
|
|
258
|
+
return el, qarray(ev)
|