sxs 2025.0.2__py3-none-any.whl → 2025.0.3__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.
- sxs/__version__.py +1 -1
- sxs/handlers.py +4 -2
- sxs/simulations/__init__.py +1 -0
- sxs/simulations/analyze.py +276 -0
- sxs/simulations/simulation.py +95 -21
- sxs/waveforms/__init__.py +1 -1
- sxs/waveforms/alignment.py +379 -55
- sxs/waveforms/format_handlers/lvc.py +3 -0
- sxs/waveforms/memory.py +11 -41
- sxs/waveforms/norms.py +270 -0
- sxs/waveforms/waveform_modes.py +84 -0
- sxs/waveforms/waveform_mts.py +30 -0
- {sxs-2025.0.2.dist-info → sxs-2025.0.3.dist-info}/METADATA +2 -1
- {sxs-2025.0.2.dist-info → sxs-2025.0.3.dist-info}/RECORD +16 -13
- {sxs-2025.0.2.dist-info → sxs-2025.0.3.dist-info}/WHEEL +0 -0
- {sxs-2025.0.2.dist-info → sxs-2025.0.3.dist-info}/licenses/LICENSE +0 -0
sxs/waveforms/norms.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from scipy.integrate import trapezoid
|
|
3
|
+
|
|
4
|
+
from .waveform_modes import WaveformModes
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def check_time_constraint(wa, wb, t1, t2):
|
|
8
|
+
"""Check that the times t1 and t2 are contained in wa.t and wb.t.
|
|
9
|
+
|
|
10
|
+
Parameters
|
|
11
|
+
----------
|
|
12
|
+
wa : WaveformModes
|
|
13
|
+
wb : WaveformModes
|
|
14
|
+
t1 : float
|
|
15
|
+
t2 : float
|
|
16
|
+
"""
|
|
17
|
+
time_intersection = (max(wa.t[0], wb.t[0]), min(wa.t[-1], wb.t[-1]))
|
|
18
|
+
if t1 < time_intersection[0]:
|
|
19
|
+
raise ValueError(f"{t1} is not contained in intersection of waveform time arrays: {time_intersection}.")
|
|
20
|
+
if t2 > time_intersection[1]:
|
|
21
|
+
raise ValueError(f"{t2} is not contained in intersection of waveform time arrays: {time_intersection}.")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def create_unified_waveforms(wa, wb, t1, t2, padding_time_factor=0.2):
|
|
25
|
+
"""Convert WaveformModes to common time and modes
|
|
26
|
+
|
|
27
|
+
The output waveforms will be interpolated to a set of times
|
|
28
|
+
including — as nearly as possible — the times `t1` and `t2`,
|
|
29
|
+
padded by the given fraction of `(t2-t1)` on other side.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
wa : WaveformModes
|
|
34
|
+
wb : WaveformModes
|
|
35
|
+
t1 : float
|
|
36
|
+
t2 : float
|
|
37
|
+
padding_time_factor : float, optional
|
|
38
|
+
Extra time of size (t2 - t1)*padding_time_factor to include
|
|
39
|
+
int the waveforms. Default is 0.2.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
wa_interp : WaveformModes
|
|
44
|
+
wb_interp : WaveformModes
|
|
45
|
+
"""
|
|
46
|
+
check_time_constraint(wa, wb, t1, t2)
|
|
47
|
+
|
|
48
|
+
padding_time = (t2 - t1) * padding_time_factor
|
|
49
|
+
t1_padded = max(wa.t[0], wb.t[0], t1 - padding_time)
|
|
50
|
+
t2_padded = min(wa.t[-1], wb.t[-1], t2 + padding_time)
|
|
51
|
+
|
|
52
|
+
idx1 = np.argmin(abs(wa.t - t1_padded))
|
|
53
|
+
idx2 = np.argmin(abs(wa.t - t2_padded)) + 1
|
|
54
|
+
|
|
55
|
+
wa_interp = wa.interpolate(wa.t[idx1:idx2])
|
|
56
|
+
wb_interp = wb.interpolate(wa_interp.t)
|
|
57
|
+
|
|
58
|
+
ell_min = max(wa_interp.ell_min, wb_interp.ell_min)
|
|
59
|
+
ell_max = min(wa_interp.ell_max, wb_interp.ell_max)
|
|
60
|
+
ia1 = wa_interp.index(ell_min, -ell_min)
|
|
61
|
+
ia2 = wa_interp.index(ell_max, ell_max) + 1
|
|
62
|
+
ib1 = wb_interp.index(ell_min, -ell_min)
|
|
63
|
+
ib2 = wb_interp.index(ell_max, ell_max) + 1
|
|
64
|
+
|
|
65
|
+
return wa_interp[:,ia1:ia2], wb_interp[:,ib1:ib2]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def L2_difference(wa, wb, t1=-np.inf, t2=np.inf, modes=None, modes_for_norm=None, normalize=True):
|
|
69
|
+
"""Compute L² norm of difference between two waveforms
|
|
70
|
+
|
|
71
|
+
The norm is integrated over the time window (`t1`, `t2`), and over
|
|
72
|
+
the sphere using the modes specified by `modes`.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
wa : WaveformModes
|
|
77
|
+
wb : WaveformModes
|
|
78
|
+
Waveforms to compare.
|
|
79
|
+
t1 : float
|
|
80
|
+
Beginning of L² norm integral.
|
|
81
|
+
t2 : float
|
|
82
|
+
End of L² norm integral.
|
|
83
|
+
modes : list, optional
|
|
84
|
+
Modes (ell, m) to include in numerator of L² norm calculation.
|
|
85
|
+
Default is all modes.
|
|
86
|
+
modes_for_norm : list, optional
|
|
87
|
+
Modes (ell, m) to include in denominator of L² norm
|
|
88
|
+
calculation. Default is all modes.
|
|
89
|
+
normalize : bool, optional
|
|
90
|
+
Whether or not to divide by sqrt(||wa||²||wb||²) in the sqrt.
|
|
91
|
+
If False, returns the unnormalized L² norm of the residual and
|
|
92
|
+
what would have been the normalization. Default is True.
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
L2_norm: float
|
|
97
|
+
L² norm of the residual between the waveforms. This is sqrt(
|
|
98
|
+
||wa - wb||² / sqrt(||wa||² ||wb||²) )
|
|
99
|
+
"""
|
|
100
|
+
t1 = max(wa.t[0], wb.t[0], t1)
|
|
101
|
+
t2 = min(wa.t[-1], wb.t[-1], t2)
|
|
102
|
+
|
|
103
|
+
already_unified = (
|
|
104
|
+
np.array_equal(wa.t, wb.t)
|
|
105
|
+
and (wa.ndim == wb.ndim == 1 or np.array_equal(wa.LM, wb.LM))
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if already_unified:
|
|
109
|
+
i1, i2 = np.argmin(abs(wa.t - t1)), np.argmin(abs(wa.t - t2)) + 1
|
|
110
|
+
wa = wa.copy()[i1:i2]
|
|
111
|
+
wb = wb.copy()[i1:i2]
|
|
112
|
+
else:
|
|
113
|
+
wa, wb = create_unified_waveforms(wa, wb, t1, t2, padding_time_factor=0)
|
|
114
|
+
|
|
115
|
+
data_diff = wa.data - wb.data
|
|
116
|
+
|
|
117
|
+
data_for_norm1 = wa.data
|
|
118
|
+
data_for_norm2 = wb.data
|
|
119
|
+
|
|
120
|
+
# Eliminate unwanted modes
|
|
121
|
+
if modes is not None or modes_for_norm is not None:
|
|
122
|
+
for L in range(wa.ell_min, wa.ell_max + 1):
|
|
123
|
+
for M in range(-L, L + 1):
|
|
124
|
+
if modes is not None:
|
|
125
|
+
if not (L, M) in modes:
|
|
126
|
+
data_diff[:, wa.index(L, M)] *= 0
|
|
127
|
+
if modes_for_norm is not None:
|
|
128
|
+
if not (L, M) in modes_for_norm:
|
|
129
|
+
data_for_norm1[:, wa.index(L, M)] *= 0
|
|
130
|
+
data_for_norm2[:, wb.index(L, M)] *= 0
|
|
131
|
+
|
|
132
|
+
if normalize:
|
|
133
|
+
L2_norm = np.sqrt(
|
|
134
|
+
trapezoid(np.linalg.norm(data_diff, axis=wa.modes_axis) ** 2, wa.t)
|
|
135
|
+
/ np.sqrt(
|
|
136
|
+
trapezoid(np.linalg.norm(data_for_norm1, axis=wa.modes_axis) ** 2, wa.t)
|
|
137
|
+
* trapezoid(np.linalg.norm(data_for_norm2, axis=wa.modes_axis) ** 2, wb.t)
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
return L2_norm
|
|
142
|
+
else:
|
|
143
|
+
L2_norm_unnormalized = np.sqrt(trapezoid(np.linalg.norm(data_diff, axis=wa.modes_axis) ** 2, wa.t))
|
|
144
|
+
norm = np.sqrt(
|
|
145
|
+
np.sqrt(
|
|
146
|
+
trapezoid(np.linalg.norm(data_for_norm1, axis=wa.modes_axis) ** 2, wa.t)
|
|
147
|
+
* trapezoid(np.linalg.norm(data_for_norm2, axis=wb.modes_axis) ** 2, wb.t)
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
return L2_norm_unnormalized, norm
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def inner_product(wa, wb, ASD_values=None):
|
|
155
|
+
"""Compute the inner product between two waveforms
|
|
156
|
+
|
|
157
|
+
No interpolation is performed, including for the `ASD`. If the
|
|
158
|
+
inputs are `WaveformModes` objects, the modes are assumed to match
|
|
159
|
+
between the two waveforms.
|
|
160
|
+
|
|
161
|
+
Note that this can be provided with time-domain or
|
|
162
|
+
frequency-domain waveforms, either over the two-sphere
|
|
163
|
+
(WaveformModes) or at a point on the two-sphere (TimeSeries).
|
|
164
|
+
|
|
165
|
+
For frequency-domain waveforms, the .t attribute should be the
|
|
166
|
+
frequency.
|
|
167
|
+
|
|
168
|
+
Parameters
|
|
169
|
+
----------
|
|
170
|
+
wa : WaveformModes or TimeSeries
|
|
171
|
+
wb : WaveformModes or TimeSeries
|
|
172
|
+
ASD_values : ndarray, optioanl
|
|
173
|
+
ASD values for frequency-domain overlaps.
|
|
174
|
+
Default is flat ASD.
|
|
175
|
+
|
|
176
|
+
Returns
|
|
177
|
+
-------
|
|
178
|
+
inner_product : float
|
|
179
|
+
Inner product between the two waveforms.
|
|
180
|
+
"""
|
|
181
|
+
if ASD_values is None:
|
|
182
|
+
ASD_values = 1
|
|
183
|
+
|
|
184
|
+
if not wa.ndim == wb.ndim == 1:
|
|
185
|
+
inner_product = trapezoid(
|
|
186
|
+
np.sum(wa.data * np.conjugate(wb.data), axis=1) / ASD_values**2,
|
|
187
|
+
wa.t,
|
|
188
|
+
)
|
|
189
|
+
else:
|
|
190
|
+
inner_product = trapezoid(
|
|
191
|
+
(wa * np.conjugate(wb)).ndarray / ASD_values**2,
|
|
192
|
+
wa.t,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return inner_product
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def mismatch(wa, wb, x1=-np.inf, x2=np.inf, modes=None, ASD=None):
|
|
199
|
+
"""Compute the mismatch between two waveforms
|
|
200
|
+
|
|
201
|
+
The mismatch is calculated over the time or frequency window
|
|
202
|
+
(`x1`, `x2`), and — if relevant — over the sphere using the modes
|
|
203
|
+
specified by `modes`.
|
|
204
|
+
|
|
205
|
+
Note that this can be provided with time-domain or
|
|
206
|
+
frequency-domain waveforms, either over the two-sphere
|
|
207
|
+
(WaveformModes) or at a point on the two-sphere (TimeSeries).
|
|
208
|
+
|
|
209
|
+
For frequency-domain waveforms, the .t attribute should be the
|
|
210
|
+
frequency.
|
|
211
|
+
|
|
212
|
+
Parameters
|
|
213
|
+
----------
|
|
214
|
+
wa : WaveformModes or TimeSeries
|
|
215
|
+
wb : WaveformModes or TimeSeries
|
|
216
|
+
x1 : float, optional
|
|
217
|
+
Beginning of mismatch integral. Default uses all values.
|
|
218
|
+
x2 : float, optional
|
|
219
|
+
End of mismatch integral. Default uses all values.
|
|
220
|
+
modes : list, optional
|
|
221
|
+
Modes (ell, m) to include in the mismatch calculation.
|
|
222
|
+
Default is all modes.
|
|
223
|
+
ASD : func, optional
|
|
224
|
+
Function mapping frequencies to the ASD of a detector.
|
|
225
|
+
Default is flat ASD.
|
|
226
|
+
|
|
227
|
+
Returns
|
|
228
|
+
-------
|
|
229
|
+
mismatch : float
|
|
230
|
+
Mismatch between the two waveforms.
|
|
231
|
+
"""
|
|
232
|
+
x1 = max(wa.t[0], wb.t[0], x1)
|
|
233
|
+
x2 = min(wa.t[-1], wb.t[-1], x2)
|
|
234
|
+
|
|
235
|
+
already_unified = (
|
|
236
|
+
np.array_equal(wa.t, wb.t)
|
|
237
|
+
and (wa.ndim == wb.ndim == 1 or np.array_equal(wa.LM, wb.LM))
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
if already_unified:
|
|
241
|
+
i1, i2 = np.argmin(abs(wa.t - x1)), np.argmin(abs(wa.t - x2)) + 1
|
|
242
|
+
wa = wa.copy()[i1:i2]
|
|
243
|
+
wb = wb.copy()[i1:i2]
|
|
244
|
+
else:
|
|
245
|
+
wa, wb = create_unified_waveforms(wa, wb, x1, x2, padding_time_factor=0)
|
|
246
|
+
|
|
247
|
+
# Eliminate unwanted modes
|
|
248
|
+
if modes is not None:
|
|
249
|
+
if wa.ndim > 1:
|
|
250
|
+
for L in range(wa.ell_min, wa.ell_max + 1):
|
|
251
|
+
for M in range(-L, L + 1):
|
|
252
|
+
if not (L, M) in modes:
|
|
253
|
+
wa.data[:, wa.index(L, M)] *= 0
|
|
254
|
+
wb.data[:, wb.index(L, M)] *= 0
|
|
255
|
+
else:
|
|
256
|
+
raise ValueError(
|
|
257
|
+
"A `modes` argument was provided, but the input `wa` "
|
|
258
|
+
"and `wb` only have one dimension."
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
if ASD is not None:
|
|
262
|
+
ASD_values = ASD(wa.t)
|
|
263
|
+
else:
|
|
264
|
+
ASD_values = 1
|
|
265
|
+
|
|
266
|
+
wa_wb_overlap = inner_product(wa, wb, ASD_values=ASD_values).real
|
|
267
|
+
wa_norm = inner_product(wa, wa, ASD_values=ASD_values).real
|
|
268
|
+
wb_norm = inner_product(wb, wb, ASD_values=ASD_values).real
|
|
269
|
+
|
|
270
|
+
return 1 - wa_wb_overlap / np.sqrt(wa_norm * wb_norm)
|
sxs/waveforms/waveform_modes.py
CHANGED
|
@@ -7,6 +7,7 @@ import warnings
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
from scipy.interpolate import CubicSpline
|
|
9
9
|
from scipy.optimize import minimize_scalar
|
|
10
|
+
from scipy import fft
|
|
10
11
|
import quaternionic
|
|
11
12
|
import spherical
|
|
12
13
|
from .. import TimeSeries
|
|
@@ -1275,6 +1276,89 @@ class WaveformModes(WaveformMixin, TimeSeries):
|
|
|
1275
1276
|
result = result.line_subtraction(treat_as_zero=treat_as_zero)
|
|
1276
1277
|
return result
|
|
1277
1278
|
|
|
1279
|
+
def fourier_transform(self, theta_phi=None, total_mass=None, luminosity_distance=None):
|
|
1280
|
+
"""Fourier transform the modes of a waveform.
|
|
1281
|
+
|
|
1282
|
+
This Fourier transforms the mode time series
|
|
1283
|
+
of the WaveformModes object and replaces the
|
|
1284
|
+
time attribute with the frequencies.
|
|
1285
|
+
|
|
1286
|
+
Parameters
|
|
1287
|
+
----------
|
|
1288
|
+
theta_phi : tuple, optional
|
|
1289
|
+
Point on the two-sphere to evaluate the waveform at.
|
|
1290
|
+
Default is None.
|
|
1291
|
+
total_mass : float, optional
|
|
1292
|
+
Total mass in solar masses.
|
|
1293
|
+
Default is no scaling is applied.
|
|
1294
|
+
luminosity_distance : float, optional
|
|
1295
|
+
Luminosity distance in Mpc.
|
|
1296
|
+
|
|
1297
|
+
Returns
|
|
1298
|
+
-------
|
|
1299
|
+
h_tilde : TimeSeries
|
|
1300
|
+
Unitful Fourier transform.
|
|
1301
|
+
"""
|
|
1302
|
+
from .. import m_sun_in_meters, m_sun_in_seconds, parsec_in_meters
|
|
1303
|
+
|
|
1304
|
+
dt = np.diff(self.t)
|
|
1305
|
+
max_dt = np.max(dt)
|
|
1306
|
+
min_dt = np.min(dt)
|
|
1307
|
+
if max_dt - min_dt > (self.t[-1] - self.t[0]) * 10 * np.finfo(self.t.dtype).eps:
|
|
1308
|
+
raise ValueError("Time array must be uniform! Maybe run .preprocess first.")
|
|
1309
|
+
|
|
1310
|
+
h_factor = 1
|
|
1311
|
+
t_factor = 1
|
|
1312
|
+
if total_mass is not None:
|
|
1313
|
+
h_factor = total_mass * m_sun_in_meters
|
|
1314
|
+
t_factor = total_mass * m_sun_in_seconds
|
|
1315
|
+
|
|
1316
|
+
if luminosity_distance is not None:
|
|
1317
|
+
h_factor /= (luminosity_distance * 1e6 * parsec_in_meters)
|
|
1318
|
+
|
|
1319
|
+
if theta_phi is not None:
|
|
1320
|
+
h_unitful = self.evaluate(*theta_phi)
|
|
1321
|
+
if total_mass is not None and luminosity_distance is not None:
|
|
1322
|
+
h_unitful *= h_factor
|
|
1323
|
+
h_unitful.t *= t_factor
|
|
1324
|
+
else:
|
|
1325
|
+
h_unitful = WaveformModes(
|
|
1326
|
+
input_array=self.data * h_factor,
|
|
1327
|
+
time=self.t * t_factor,
|
|
1328
|
+
time_axis=self.time_axis,
|
|
1329
|
+
modes_axis=self.modes_axis,
|
|
1330
|
+
ell_min=self.ell_min,
|
|
1331
|
+
ell_max=self.ell_max,
|
|
1332
|
+
spin_weight=self.spin_weight,
|
|
1333
|
+
)
|
|
1334
|
+
|
|
1335
|
+
N = h_unitful.t.size
|
|
1336
|
+
max_dt = max(np.diff(h_unitful.t))
|
|
1337
|
+
|
|
1338
|
+
if theta_phi is not None:
|
|
1339
|
+
h_tilde = TimeSeries(
|
|
1340
|
+
fft.fftshift(
|
|
1341
|
+
max_dt * fft.fft(h_unitful.data, axis=self.time_axis), axes=self.time_axis
|
|
1342
|
+
),
|
|
1343
|
+
fft.fftshift(fft.fftfreq(N, max_dt)),
|
|
1344
|
+
)
|
|
1345
|
+
else:
|
|
1346
|
+
h_tilde = WaveformModes(
|
|
1347
|
+
input_array=fft.fftshift(
|
|
1348
|
+
max_dt * fft.fft(h_unitful.data, axis=self.time_axis), axes=self.time_axis
|
|
1349
|
+
),
|
|
1350
|
+
time=fft.fftshift(fft.fftfreq(N, max_dt)),
|
|
1351
|
+
time_axis=self.time_axis,
|
|
1352
|
+
modes_axis=self.modes_axis,
|
|
1353
|
+
ell_min=self.ell_min,
|
|
1354
|
+
ell_max=self.ell_max,
|
|
1355
|
+
spin_weight=self.spin_weight,
|
|
1356
|
+
)
|
|
1357
|
+
|
|
1358
|
+
h_tilde = h_tilde[h_tilde.t.size//2:]
|
|
1359
|
+
|
|
1360
|
+
return h_tilde
|
|
1361
|
+
|
|
1278
1362
|
|
|
1279
1363
|
class WaveformModesDict(MutableMapping, WaveformModes):
|
|
1280
1364
|
"""A dictionary-like class for storing waveform modes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import spherical
|
|
2
|
+
from . import WaveformModes
|
|
3
|
+
|
|
4
|
+
class _ModesTimeSeries(WaveformModes):
|
|
5
|
+
|
|
6
|
+
@property
|
|
7
|
+
def s(self):
|
|
8
|
+
return self.spin_weight
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def u(self):
|
|
12
|
+
return self.time
|
|
13
|
+
|
|
14
|
+
from spherical.modes.algebra import (
|
|
15
|
+
conjugate, bar, _real_func, real, _imag_func, imag, norm,
|
|
16
|
+
add, subtract, multiply, divide
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
conj = conjugate
|
|
20
|
+
|
|
21
|
+
from spherical.modes.utilities import (
|
|
22
|
+
truncate_ell, _check_broadcasting
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
from spherical.modes.ufuncs import __array_ufunc__
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def MTS(*args, **kwargs):
|
|
29
|
+
kwargs.setdefault('multiplication_truncator', max)
|
|
30
|
+
return _ModesTimeSeries(*args, **kwargs)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sxs
|
|
3
|
-
Version: 2025.0.
|
|
3
|
+
Version: 2025.0.3
|
|
4
4
|
Summary: Interface to data produced by the Simulating eXtreme Spacetimes collaboration
|
|
5
5
|
Project-URL: Homepage, https://github.com/sxs-collaboration/sxs
|
|
6
6
|
Project-URL: Documentation, https://sxs.readthedocs.io/
|
|
@@ -40,6 +40,7 @@ Requires-Dist: inflection>=0.5.1
|
|
|
40
40
|
Requires-Dist: juliacall>=0.9.20
|
|
41
41
|
Requires-Dist: numba>=0.55; implementation_name == 'cpython'
|
|
42
42
|
Requires-Dist: numpy>=1.25
|
|
43
|
+
Requires-Dist: packaging
|
|
43
44
|
Requires-Dist: pandas>=1.1.2
|
|
44
45
|
Requires-Dist: pytz>=2020.1
|
|
45
46
|
Requires-Dist: quaternionic>=1.0.15
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
sxs/__init__.py,sha256=8PntABL6yx7Ad70hP7WedNAVDTZiwm_2At5xIQGo4k8,2610
|
|
2
|
-
sxs/__version__.py,sha256=
|
|
3
|
-
sxs/handlers.py,sha256=
|
|
2
|
+
sxs/__version__.py,sha256=KcF5yAdb5CxfI3m_tuljFiWg8XFkWLOA922PgZ-Lf1g,25
|
|
3
|
+
sxs/handlers.py,sha256=jVV-HK-omzoBx5N2wcpLHvyoWq86hUfWCjnGbPpD91I,18343
|
|
4
4
|
sxs/juliapkg.json,sha256=-baaa3Za_KBmmiGjlh2YYLWmvUvZl6GaKKXwNI4S7qU,178
|
|
5
5
|
sxs/time_series.py,sha256=OKaLg8tFyrtKcef7900ri-a0C6A8wKxA68KovZXvH6I,41081
|
|
6
6
|
sxs/catalog/__init__.py,sha256=9-WTMTPDmqqkFyIHOtEbPA6etXm3_RSRrLWvHtLrjLg,205
|
|
@@ -15,9 +15,10 @@ sxs/julia/__init__.py,sha256=uSLP_xfU-GZG7IO5vs0TEkCR4LH8aBYMF-852wDY3kI,3490
|
|
|
15
15
|
sxs/metadata/__init__.py,sha256=vEb633hoKAnI9O7kBtejZXFFsWM6h_ShuTq2_Xl3hUs,72
|
|
16
16
|
sxs/metadata/metadata.py,sha256=8LBDWeUAtLOP-MTqbwf_m5eb6k8UKj0L_yKthidF7lA,98
|
|
17
17
|
sxs/metadata/metric.py,sha256=Tsig1Jm50OO8r89zfjCuQ4i3JAoiazSb4J9qYtPWKgM,41
|
|
18
|
-
sxs/simulations/__init__.py,sha256=
|
|
18
|
+
sxs/simulations/__init__.py,sha256=eXkheYhRaYyKjul5J1IXpoJ7Wq4nr3Tgwr-HSS3BTek,156
|
|
19
|
+
sxs/simulations/analyze.py,sha256=RaImREx3fWlXgJRCI-Wsq0-LjidL-Mb8SIN3-n-TMqM,10373
|
|
19
20
|
sxs/simulations/local.py,sha256=e77SeaWMl2PWX_EndQtShOXZxcFKhQsUDQ55R2Njcuc,43
|
|
20
|
-
sxs/simulations/simulation.py,sha256=
|
|
21
|
+
sxs/simulations/simulation.py,sha256=to8iAofvW_TMIfyO1tYSiCwuVUC7v-2ykGsjN0WvTGY,41104
|
|
21
22
|
sxs/simulations/simulations.py,sha256=sMle89VoD1CQni1N23Vjo3h2yj9LHHAtuaB_qfD3Wgg,109
|
|
22
23
|
sxs/utilities/__init__.py,sha256=WSStlqljfgQheMxHGfuofSc5LdmASGvO3FNO3f_zaT0,4806
|
|
23
24
|
sxs/utilities/bitwise.py,sha256=G9ZNYgwDQRhq5wbDf-p2HcUqkEP_IRDiQoXW4KyU17k,13205
|
|
@@ -54,18 +55,20 @@ sxs/utilities/references/fairchild_report.py,sha256=MUnYQD7zJcz202Vt3-j9ueXglthG
|
|
|
54
55
|
sxs/utilities/references/inspire.py,sha256=kDjY-UFJT-VTS3yJOT8fT6LJG-pRrX9TK8nv3RZqrbo,8431
|
|
55
56
|
sxs/utilities/references/journal_abbreviations.py,sha256=SuRXcr4rv9YPbXD4mzujSvE7M6KS1lwELimuyn7mfCE,31018
|
|
56
57
|
sxs/utilities/references/references.py,sha256=29rPUZKw3dztXQLRDEt1hGYjZaONFd0qX--xQxzOmUU,418
|
|
57
|
-
sxs/waveforms/__init__.py,sha256=
|
|
58
|
-
sxs/waveforms/alignment.py,sha256=
|
|
59
|
-
sxs/waveforms/memory.py,sha256=
|
|
58
|
+
sxs/waveforms/__init__.py,sha256=yfPzExhZZqNrPOe784f8BC8mHUiwb85urKM_4_pzUFo,1157
|
|
59
|
+
sxs/waveforms/alignment.py,sha256=TYSsGq3dRQwoookyzkNkT02pGViPC0TqQ64RksX4OxU,32649
|
|
60
|
+
sxs/waveforms/memory.py,sha256=zuph5JgeBog6xrCbcSYzXegPfUtoPUXnYmmY5KfYUj8,7272
|
|
60
61
|
sxs/waveforms/mode_utilities.py,sha256=gxsW-hunCoIReBVv9IrkGLdshr0rmztbH-JRgD6D9z0,5253
|
|
62
|
+
sxs/waveforms/norms.py,sha256=zemgJsWNhng3QAi3ixHAZ8P5SSIUcHysSQIcqRGDeyI,8944
|
|
61
63
|
sxs/waveforms/transformations.py,sha256=S5C-xnCk2umZlVsYgciyp7VMGZA8NI6md7OZp72upJU,9124
|
|
62
64
|
sxs/waveforms/waveform_grid.py,sha256=aBlcsudj1XozZD7n42sh6-nzysKNalAdHJkVQ7M6fE4,180
|
|
63
65
|
sxs/waveforms/waveform_mixin.py,sha256=S0RNe2HkwnqdCyGEarGYmoXD_DkTWGorsiGGIBWOam8,1179
|
|
64
|
-
sxs/waveforms/waveform_modes.py,sha256=
|
|
66
|
+
sxs/waveforms/waveform_modes.py,sha256=BpjjB42COmr9A3Li5MjhPs_jr9FOfOWRGN_tykQyEYA,60177
|
|
67
|
+
sxs/waveforms/waveform_mts.py,sha256=rdEDlAK4TA4F6hFCVi0DrdYucJIGneqmWkEHaScDh0I,660
|
|
65
68
|
sxs/waveforms/waveform_signal.py,sha256=Ojrt6DSDdleB0qmu6UwjjPnYdaWsrjnpBA_8dhnM_q4,182
|
|
66
69
|
sxs/waveforms/format_handlers/__init__.py,sha256=0wsnuBYCYsCkN19L2ipga7BtigvPyBcqiy_4qrzmLpE,50
|
|
67
70
|
sxs/waveforms/format_handlers/grathena.py,sha256=5NrHL3K0mRHApnFx5YsMUufDKUD1A_dZu8mGQqOdBeE,3622
|
|
68
|
-
sxs/waveforms/format_handlers/lvc.py,sha256=
|
|
71
|
+
sxs/waveforms/format_handlers/lvc.py,sha256=bGAB2k1vXIloA25dUKu4ZUJde5Y4CHrjkPXtQ93aw7w,8006
|
|
69
72
|
sxs/waveforms/format_handlers/nrar.py,sha256=3ycVoqQcWAAixV3mKp58_wUhYBHt6QeLv2YGSvy-EGM,21538
|
|
70
73
|
sxs/waveforms/format_handlers/rotating_paired_diff_multishuffle_bzip2.py,sha256=7XgXnroQ-3dHCYnN6KrDkz8z9EVl57f8W6iOX6bUemA,27745
|
|
71
74
|
sxs/waveforms/format_handlers/rotating_paired_xor_multishuffle_bzip2.py,sha256=pFEJIlb6OQQNhv6r48ALFnZMKNZjuQY55ydWBADCDgU,2348
|
|
@@ -79,7 +82,7 @@ sxs/zenodo/api/__init__.py,sha256=EM_eh4Q8R5E0vIfMhyIR1IYFfOBu6vA0UTasgX9gHys,21
|
|
|
79
82
|
sxs/zenodo/api/deposit.py,sha256=J4RGvGjh0cEOrN4bBZWEDcPAhNscqB2fzLlvRZ5HTHM,36948
|
|
80
83
|
sxs/zenodo/api/login.py,sha256=Yz0ytgi81_5BpDzhrS0WPMXlvU2qUaCK8yn8zxfEbko,18007
|
|
81
84
|
sxs/zenodo/api/records.py,sha256=nKkhoHZ95CTztHF9Zzaug5p7IiUCJG4Em1i-l-WqH6U,3689
|
|
82
|
-
sxs-2025.0.
|
|
83
|
-
sxs-2025.0.
|
|
84
|
-
sxs-2025.0.
|
|
85
|
-
sxs-2025.0.
|
|
85
|
+
sxs-2025.0.3.dist-info/METADATA,sha256=07jpPE3ytnWTOb_fPvoCCy4ux8cBMzP5LeNEQhvv0n4,9313
|
|
86
|
+
sxs-2025.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
87
|
+
sxs-2025.0.3.dist-info/licenses/LICENSE,sha256=ptVOd5m7LDM5ZF0x32cxb8c2Nd5NDmAhy6DX7xt_7VA,1080
|
|
88
|
+
sxs-2025.0.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|