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/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)
@@ -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.2
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=00CnSIbrBDJK1w5pLXr3qrweMV-XKl67exMRg7gte3Q,25
3
- sxs/handlers.py,sha256=Rhj6HAKPKSCJYwpWcz2eUkd6yuQZdCndQjZhq71QQ1A,18308
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=GrZym0PHTULDg_hyFmISNzDfqVLz_hQo-djbgecZs54,134
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=OCkpzKtjkX6CgCbnY8d_CWv4oDKY7spaqvj8rEHM3TY,38223
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=FPu_MFwfzcLsWhvoLm_AXRLz59eBODes4MY2_taTE5c,1150
58
- sxs/waveforms/alignment.py,sha256=Z_fCnUIza89Vwzl5qo4spwd2-ZrzYxFU8Q7b6UKFtMU,21341
59
- sxs/waveforms/memory.py,sha256=1BOov3QJl9wexgGt8HA8MqVZZfLKbykff5pRVzLiILo,7763
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=NousbAeSedN1RNh21g_5LAh0K82ikIumHPELKf9X_tc,57143
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=8hGyjSaXRfS1RPiknbACi6mSLDU-xoD3EiDG2CqEit4,7861
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.2.dist-info/METADATA,sha256=1LSOQXL_n4JZSL1Z_EW-ShJ5JLvurIp2WbHYBFuHHqY,9288
83
- sxs-2025.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
- sxs-2025.0.2.dist-info/licenses/LICENSE,sha256=ptVOd5m7LDM5ZF0x32cxb8c2Nd5NDmAhy6DX7xt_7VA,1080
85
- sxs-2025.0.2.dist-info/RECORD,,
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