From 2ebb71872c35f195d0ae2b70200be1e8b25adb5d Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Tue, 8 Apr 2025 00:09:15 -0400 Subject: [PATCH 01/13] Refactor threshold_crossing as BaseStatefulTransformer from updated ezmsg-sigproc. --- pyproject.toml | 5 +- src/ezmsg/event/peak.py | 467 +++++++++++++++++++++------------------- uv.lock | 402 +++++----------------------------- 3 files changed, 307 insertions(+), 567 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 61070b3..cd5e10c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" requires-python = ">=3.10.15" dynamic = ["version"] dependencies = [ - "ezmsg-sigproc>=1.6.0", + "ezmsg-sigproc", "numpy>=1.26", "sparse>=0.15.4", ] @@ -34,3 +34,6 @@ version-file = "src/ezmsg/event/__version__.py" [tool.hatch.build.targets.wheel] packages = ["src/ezmsg"] + +[tool.uv.sources] +ezmsg-sigproc = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git", branch = "70-use-protocols-for-axisarray-transformers" } diff --git a/src/ezmsg/event/peak.py b/src/ezmsg/event/peak.py index 934da02..b18a6d1 100644 --- a/src/ezmsg/event/peak.py +++ b/src/ezmsg/event/peak.py @@ -2,14 +2,13 @@ Detects peaks in a signal. """ -from dataclasses import replace import typing import ezmsg.core as ez -from ezmsg.sigproc.base import GenAxisArray -from ezmsg.util.messages.axisarray import AxisArray +from ezmsg.util.messages.axisarray import AxisArray, replace # slice_along_axis, from ezmsg.util.generator import consumer -from ezmsg.sigproc.scaler import scaler_np +from ezmsg.sigproc.base import BaseStatefulTransformer, processor_state, BaseTransformerUnit +from ezmsg.sigproc.scaler import AdaptiveStandardScalerTransformer import numpy as np import numpy.typing as npt import sparse @@ -17,160 +16,159 @@ from .message import EventMessage -@consumer -def threshold_crossing( - threshold: float = -3.5, - max_peak_dur: float = 0.002, - refrac_dur: float = 0.001, - align_on_peak: bool = False, - return_peak_val: bool = False, - auto_scale_tau: float = 0.0, -) -> typing.Generator[ - list[EventMessage] | AxisArray, AxisArray, None -]: - """ - Detect threshold crossing events. +class ThresholdSettings(ez.Settings): + threshold: float = -3.5 + """the value the signal must cross before the peak is found.""" - Args: - threshold: the value the signal must cross before the peak is found. - max_peak_dur: The maximum duration of a peak in seconds. - refrac_dur: The minimum duration between peaks in seconds. If 0 (default), no refractory period is enforced. - align_on_peak: If False (default), the returned sample index indicates the first sample across threshold. - If True, the sample index indicates the sample with the largest deviation after threshold crossing. - return_peak_val: If True then the peak value is included in the EventMessage or sparse matrix payload. - auto_scale_tau: If > 0, the data will be passed through a standard scaler prior to thresholding. + max_peak_dur: float = 0.002 + """The maximum duration of a peak in seconds.""" - Note: If either align_on_peak or return_peak_val are True then it is necessary to find the actual peak and not - just the threshold crossing. This will drastically increase the computational demand. It is recommended to - tune max_peak_dur to a minimal-yet-reasonable value to limit the search space. + min_peak_dur: float = 0.0 + """The minimum duration of a peak in seconds. If 0 (default), no minimum duration is enforced.""" - Returns: - A primed generator object that yields a list of :obj:`EventMessage` objects for every - :obj:`AxisArray` it receives via `send`. - """ + refrac_dur: float = 0.001 + """The minimum duration between peaks in seconds. If 0 (default), no refractory period is enforced.""" - msg_out = AxisArray(np.array([]), dims=[""]) + align_on_peak: bool = False + """If False (default), the returned sample index indicates the first sample across threshold. + If True, the sample index indicates the sample with the largest deviation after threshold crossing.""" - # Initialize state variables - sample_shape: tuple[int, ...] | None = None - fs: float | None = None - max_width: int = 0 - min_width: int = 1 # Consider making this a parameter. - refrac_width: int = 0 + return_peak_val: bool = False + """If True then the peak value is included in the EventMessage or sparse matrix payload.""" - scaler: typing.Generator[AxisArray, AxisArray, None] | None = None - # adaptive z-scoring. - # TODO: This sample-by-sample adaptation is probably overkill. ezmsg-sigproc should add chunk-wise scaler updating. + auto_scale_tau: float = 0.0 + """If > 0, the data will be passed through a standard scaler prior to thresholding.""" - _overs: npt.NDArray | None = None # (n_feats, <=max_width) int == -1 or +1 - # Trailing buffer to track whether the previous sample(s) were past threshold. - _data: npt.NDArray | None = None # (n_feats, <=max_width) in_dtype - # Trailing buffer in case peak spans sample chunks. Only used if align_on_peak or return_peak_val. +@processor_state +class ThresholdCrossingState: + """State for ThresholdCrossingTransformer.""" - _data_raw: npt.NDArray | None = None # (n_feats, <=max_width) in_dtype - # Only used if return_peak_val and scaler is not None + max_width: int = 0 - _elapsed: npt.NDArray | None = None # (n_feats,) int - # Number of samples since last event. Used to enforce refractory period across iterations. - # - # _n_skip: npt.NDArray | None = None # (n_feats,) int + min_width: int = 1 - while True: - msg_in: AxisArray = yield msg_out - - # Extract basic metadata from message - ax_idx = msg_in.get_axis_idx("time") - in_sample_shape = msg_in.data.shape[:ax_idx] + msg_in.data.shape[ax_idx + 1 :] - in_fs = 1 / msg_in.axes["time"].gain - - # If metadata has changed substantially, then reset state variables - b_reset = sample_shape is None or sample_shape != in_sample_shape - b_reset = b_reset or fs != in_fs - if b_reset: - sample_shape = in_sample_shape - fs = in_fs - max_width = int(max_peak_dur * fs) - refrac_width = int(refrac_dur * fs) - if auto_scale_tau > 0: - scaler = scaler_np(time_constant=auto_scale_tau, axis="time") - _overs = None - _data = None - _data_raw = None - n_flat_feats = np.prod(sample_shape) - _elapsed = np.zeros((n_flat_feats,), dtype=int) + (refrac_width + 1) - # _n_skip = np.zeros((n_flat_feats,), dtype=int) - # TODO: Support > 2 dim output with pydata.sparse - other_dim = "*".join([_ for _ in msg_in.dims if _ != "time"]) - out_axes = ( - msg_in.axes.copy() - if msg_in.data.ndim == 2 - else {"time": msg_in.axes["time"]} - ) - template = AxisArray( - sparse.SparseArray((0, 0)), dims=[other_dim, "time"], axes=out_axes - ) + refrac_width: int = 0 - # Optionally scale data - data_raw: npt.NDArray | None = None - if scaler is not None: - if return_peak_val: - data_raw = msg_in.data.copy() - msg_in = scaler.send(msg_in) - - data = msg_in.data - - # Put the time axis in the 0th dim. - if ax_idx != data.ndim - 1: - data = np.moveaxis(data, ax_idx, -1) - if data_raw is not None: - data_raw = np.moveaxis(data_raw, ax_idx, -1) - - # Flatten the feature dimensions - if data.ndim > 2: - data = data.reshape((-1, data.shape[-1])) - if data_raw is not None: - data_raw = data_raw.reshape((-1, data_raw.shape[-1])) - - # Check each sample relative to threshold. - overs = data >= threshold if threshold >= 0 else data <= threshold - - # Prepend our variables with previous iteration's values. We always expect at least 1 sample to carry over. - overs = np.concatenate( - (_overs if _overs is not None else overs[..., :1], overs), axis=-1 - ) - # If we need to identify _where_ the peak was then we must prepend previous data values. - if align_on_peak or return_peak_val: - data = np.concatenate( - (_data if _data is not None else data[..., :1], data), axis=-1 + scaler: AdaptiveStandardScalerTransformer | None = None + """Object performing adaptive z-scoring.""" + + data: npt.NDArray | None = None + """Trailing buffer in case peak spans sample chunks. Only used if align_on_peak or return_peak_val.""" + + data_raw: npt.NDArray | None = None + """Keep track of the raw data so we can return_peak_val. Only needed if using the scaler.""" + + elapsed: npt.NDArray | None = None + """Track number of samples since last event for each feature. Used especially for refractory period.""" + + template: AxisArray = None + """Template for the output message to reduce memory allocation. TODO: Maybe unnecessary.""" + + +class ThresholdCrossingTransformer( + BaseStatefulTransformer[ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingState] +): + """Transformer that detects threshold crossing events.""" + + def _hash_message(self, message: AxisArray) -> int: + ax_idx = message.get_axis_idx("time") + sample_shape = message.data.shape[:ax_idx] + message.data.shape[ax_idx + 1:] + return hash((message.key, sample_shape, message.axes["time"].gain)) + + def _reset_state(self, message: AxisArray) -> None: + """Reset the state variables.""" + ax_idx = message.get_axis_idx("time") + + # Precalculate some simple math we'd otherwise have to calculate on every iteration. + fs = 1 / message.axes["time"].gain + self._state.max_width = int(self.settings.max_peak_dur * fs) + self._state.min_width = int(self.settings.min_peak_dur * fs) + self._state.refrac_width = int(self.settings.refrac_dur * fs) + + # We'll need the first sample (keep time dim!) for a few of our state initializations + data = np.moveaxis(message.data, ax_idx, -1) + first_samp = data[..., :1] + + # Prepare optional state variables + self._state.scaler = None + self._state.data_raw = None + if self.settings.auto_scale_tau > 0: + self._state.scaler = AdaptiveStandardScalerTransformer( + time_constant=self.settings.auto_scale_tau, + axis="time" ) - # If we're doing z-scoring but we need the actual peak value then we must prepend previous RAW values too. - if return_peak_val and scaler is not None: - data_raw = np.concatenate( - (_data_raw if _data_raw is not None else data_raw[..., :1], data_raw), - axis=-1, + if self.settings.return_peak_val: + self._state.data_raw = first_samp + + # We always need at least the previous iteration's last sample for tracking whether we are newly over threshold, + # and potentially for aligning on peak or returning the peak value. + self._state.data = first_samp if self._state.scaler is None else np.zeros_like(first_samp) + + # Initialize the count of samples since last event for each feature. We initialize at refrac_width+1 + # to ensure that even the first sample is eligible for events. + self._state.elapsed = np.zeros((np.prod(data.shape[:-1]),), dtype=int) + (self._state.refrac_width + 1) + + def _process(self, message: AxisArray) -> AxisArray: + """ + Process incoming samples and detect threshold crossings. + + Args: + msg: The input AxisArray containing signal data + + Returns: + AxisArray with sparse data containing detected events + """ + ax_idx = message.get_axis_idx("time") + + # If the time axis is not the last axis, we need to move it to the end. + if ax_idx != (message.data.ndim - 1): + message = replace( + message, + data=np.moveaxis(message.data, ax_idx, -1), + dims=message.dims[:ax_idx] + message.dims[ax_idx + 1:] + ["time"], ) - # We will modify _overs later, so for now we take note of how many samples were prepended. - n_prepended = 1 if _overs is None else _overs.shape[-1] - # Find threshold crossing where sample k is over and sample k-1 is not over. - b_cross_over = np.logical_and(~overs[..., :-1], overs[..., 1:]) + # Take a copy of the raw data if needed and prepend to our state data_raw + # This will only exist if we are autoscaling AND we need to capture the true peak value. + if self._state.data_raw is not None: + self._state.data_raw = np.concatenate((self._state.data_raw, message.data), axis=-1) + + # Run the message through the standard scaler if needed. Note: raw value is lost unless we copied it above. + if self._state.scaler is not None: + message = self._state.scaler(message) + + # Prepend the previous iteration's last (maybe z-scored) sample to the current (maybe z-scored) data. + data = np.concatenate((self._state.data, message.data), axis=-1) + # Take note of how many samples were prepended. We will need this later when we modify `overs`. + n_prepended = self._state.data.shape[-1] + + # Identify which data points are over threshold + overs = data >= self.settings.threshold if self.settings.threshold >= 0 else data <= self.settings.threshold + + # Find threshold _crossing_: where sample k is over and sample k-1 is not over. + b_cross_over = np.logical_and(overs[..., 1:], ~overs[..., :-1]) + cross_idx = list(np.where(b_cross_over)) # List of indices into each dim + # We ignored the first sample when looking for crosses so we increment the sample index by 1. + cross_idx[-1] += 1 - feat_idx, samp_idx = np.where(b_cross_over) - # Because we looked at samples [1:]... - samp_idx += 1 # Note: There is an assumption that the 0th sample only serves as a reference and is not part of the output; # this will be trimmed at the very end. For now the offset is useful for bookkeeping (peak finding, etc.). # Optionally drop crossings during refractory period - if refrac_width > 2 and len(samp_idx) > 0: - # TODO: Consider putting this into its own unit. The downside to moving it out is that some of the remaining - # computation in this function is unnecessary for to-be-dropped events. - uq_feats, feat_splits = np.unique(feat_idx, return_index=True) - ieis = np.diff(np.hstack(([samp_idx[0] + 1], samp_idx))) - # Reset elapsed time at feature boundaries. - ieis[feat_splits] = samp_idx[feat_splits] + _elapsed[uq_feats] - b_drop = ieis <= refrac_width + # TODO: This should go in its own transformer. + # However, a general purpose refractory-period-enforcer would keep track of its own event history, + # so we would probably do this step before prepending with historical samples. + if self._state.refrac_width > 2 and len(cross_idx[-1]) > 0: + # Find the unique set of features that have at least one cross-over, + # and the indices of the first crossover for each. + ravel_feat_inds = np.ravel_multi_index(cross_idx[:-1], overs.shape[:-1]) + uq_feats, feat_splits = np.unique(ravel_feat_inds, return_index=True) + # Calculate the inter-event intervals (IEIs) for each feature. First get all the IEIs. + ieis = np.diff(np.hstack(([cross_idx[-1][0] + 1], cross_idx[-1]))) + # Then reset the interval at feature boundaries. + ieis[feat_splits] = cross_idx[-1][feat_splits] + self._state.elapsed[uq_feats] + b_drop = ieis <= self._state.refrac_width drop_idx = np.where(b_drop)[0] final_drop = [] while len(drop_idx) > 0: @@ -179,80 +177,78 @@ def threshold_crossing( # but only if the next iei belongs to the same feature. if ((d_idx + 1) < len(ieis)) and (d_idx + 1) not in feat_splits: ieis[d_idx + 1] += ieis[d_idx] - # We will later remove this event from samp_idx and feat_idx + # We will later remove this event from samp_idx and cross_idx final_drop.append(d_idx) # Remove the dropped event from drop_idx. drop_idx = drop_idx[1:] # If the next event is now outside the refractory period then it will not be dropped. - # TODO: Maybe we don't want this feature? e.g., if the 3rd in a triplet is not within the refractory - # period of the first, but it is within the refractory period of the 2nd which is now dropped, - # maybe the 3rd event should still be dropped? If so then we can refactor above to drop all at once. - if len(drop_idx) > 0 and ieis[drop_idx[0]] > refrac_width: + if len(drop_idx) > 0 and ieis[drop_idx[0]] > self._state.refrac_width: drop_idx = drop_idx[1:] + cross_idx = [np.delete(_, final_drop) for _ in cross_idx] - samp_idx = np.delete(samp_idx, final_drop) - feat_idx = np.delete(feat_idx, final_drop) - + # Calculate the 'value' at each event. hold_idx = overs.shape[-1] - 1 - if len(samp_idx) == 0: - # No events. + if len(cross_idx[-1]) == 0: + # No events; not values to calculate. result_val = np.ones( - samp_idx.shape, dtype=data.dtype if return_peak_val else bool + cross_idx[-1].shape, dtype=data.dtype if self.settings.return_peak_val else bool ) - elif not (min_width > 1 or align_on_peak or return_peak_val): - # No postprocessing required. - result_val = np.ones(samp_idx.shape, dtype=bool) + elif not (self._state.min_width > 1 or self.settings.align_on_peak or self.settings.return_peak_val): + # No postprocessing required. TODO: Why is min_width <= 1 a requirement here? + result_val = np.ones(cross_idx[-1].shape, dtype=bool) else: - # Do postprocessing of events. - - # We extract max_width-length vectors of `overs` values for each event. - # Pad using last sample until last crossover has at least max_width following samples. - n_pad = max(0, max(samp_idx) + max_width - overs.shape[-1]) + # Do postprocessing of events: width-checking, align-on-peak, and/or include peak value in return. + # Each of these requires finding the true peak, which requires pulling out a snippet around the + # threshold crossing event. + # We extract max_width-length vectors of `overs` values for each event. This might require some padding + # if the event is near the end of the data. Pad with the last sample until the expected end of the event. + n_pad = max(0, max(cross_idx[-1]) + self._state.max_width - overs.shape[-1]) pad_width = ((0, 0),) * (overs.ndim - 1) + ((0, n_pad),) overs_padded = np.pad(overs, pad_width, mode="edge") - # Multi-index to extract the vectors for each event - s_idx = np.arange(max_width)[None, :] + samp_idx[:, None] - ep_overs = overs_padded[feat_idx[:, None], s_idx] # (n_events, max_width) + # Extract the segments for each event. + # First we get the sample indices. This is 2-dimensional; first dim for offset and remaining for seg length. + s_idx = np.arange(self._state.max_width)[None, :] + cross_idx[-1][:, None] + # Combine feature indices and time indices to extract segments of overs. + # Note: We had to expand each of our feature indices also be 2-dimensional + # -> ndarray (eat dims ..., max_width) + ep_overs = overs_padded[tuple(_[:, None] for _ in cross_idx[:-1]) + (s_idx,)] # Find the event lengths: i.e., the first non-over-threshold value for each event. # Warning: Values are invalid for events that don't cross back. ev_len = ep_overs[..., 1:].argmin(axis=-1) - ev_len += 1 + ev_len += 1 # Adjust because we skipped first sample # Identify peaks that successfully cross back b_ev_crossback = np.any(~ep_overs[..., 1:], axis=-1) - if min_width > 1: + if self._state.min_width > 1: # Drop events that have crossed back but fail min_width - b_short = np.logical_and(b_ev_crossback, ev_len < min_width) - b_long = ~b_short - samp_idx = samp_idx[b_long] - feat_idx = feat_idx[b_long] + b_long = ~np.logical_and(b_ev_crossback, ev_len < self._state.min_width) + cross_idx = tuple(_[b_long] for _ in cross_idx) ev_len = ev_len[b_long] b_ev_crossback = b_ev_crossback[b_long] # We are returning a sparse array and unfinished peaks must be buffered for the next iteration. # Find the earliest unfinished event. If none, we still buffer the final sample. b_unf = ~b_ev_crossback - hold_idx = samp_idx[b_unf].min() if np.any(b_unf) else hold_idx + hold_idx = cross_idx[-1][b_unf].min() if np.any(b_unf) else hold_idx # Trim events that are past the hold_idx. They will be processed next iteration. - b_pass_ev = samp_idx < hold_idx - samp_idx = samp_idx[b_pass_ev] - feat_idx = feat_idx[b_pass_ev] + b_pass_ev = cross_idx[-1] < hold_idx + cross_idx = [_[b_pass_ev] for _ in cross_idx] ev_len = ev_len[b_pass_ev] if np.any(b_unf): # Must hold back at least 1 sample before start of unfinished events so we can re-detect. hold_idx = max(hold_idx - 1, 0) - if not return_peak_val: - result_val = np.ones(samp_idx.shape, dtype=bool) + # If we are not returning peak values, we can just return bools at the event locations. + result_val = np.ones(cross_idx[-1].shape, dtype=bool) # For remaining _finished_ peaks, get the peak location -- for alignment or if returning its value. - if align_on_peak or return_peak_val: + if self.settings.align_on_peak or self.settings.return_peak_val: # We process peaks in batches based on their length, otherwise short peaks could give # incorrect argmax results. # TODO: Check performance of using a masked array instead. Might take longer to create the mask. @@ -260,68 +256,105 @@ def threshold_crossing( uq_lens, len_grps = np.unique(ev_len, return_inverse=True) for len_idx, ep_len in enumerate(uq_lens): b_grp = len_grps == len_idx - ep_resamp = np.arange(ep_len)[None, :] + samp_idx[b_grp, None] - eps = data[feat_idx[b_grp, None], ep_resamp] - if threshold >= 0: + ep_resamp = np.arange(ep_len)[None, :] + cross_idx[-1][b_grp, None] + ep_inds_tuple = tuple(_[b_grp, None] for _ in cross_idx[:-1]) + (ep_resamp,) + eps = data[ep_inds_tuple] + if self.settings.threshold >= 0: pk_offset[b_grp] = np.argmax(eps, axis=1) else: pk_offset[b_grp] = np.argmin(eps, axis=1) - # Now that we have the offset to the peak for each event, we can find the peak value and/or align. - if return_peak_val: - if scaler is None: - result_val = data[feat_idx, samp_idx + pk_offset] - else: - result_val = data_raw[feat_idx, samp_idx + pk_offset] - if align_on_peak: - samp_idx += pk_offset + if self.settings.align_on_peak: + # We want to align on the peak, so add the peak offset. + cross_idx[-1] += pk_offset + + if self.settings.return_peak_val: + # We need the actual peak value. + peak_inds_tuple = cross_idx if self.settings.align_on_peak else tuple(cross_idx[:-1]) + (cross_idx[-1] + pk_offset,) + result_val = (self._state.data_raw if self._state.data_raw is not None else data)[peak_inds_tuple] # Save data for next iteration - _overs = overs[..., hold_idx:] - if align_on_peak or return_peak_val: - _data = data[..., hold_idx:] - if return_peak_val and scaler is not None: - _data_raw = data_raw[..., hold_idx:] - _elapsed += hold_idx - _elapsed[feat_idx] = hold_idx - samp_idx - # ^ multiple-write to same index is fine because last value is desired. + self._state.data = data[..., hold_idx:] + if self._state.data_raw is not None: + # Likely because we are using the scaler, we need a separate copy of the raw data. + self._state.data_raw = self._state.data_raw[..., hold_idx:] + # Clear out `elapsed` by adding the max number of samples since the last event. + self._state.elapsed += hold_idx + # Yet for features that actually had events, replace the elapsed time with the actual event time + self._state.elapsed[tuple(cross_idx[:-1])] = hold_idx - cross_idx[-1] + # Note: multiple-write to same index ^ is fine because it is sorted and the last value for each is correct. # Prepare sparse matrix output - # Note: The first of the "held" samples is part of this iteration's return. - # Likewise, the first prepended sample was part of the previous iteration's return. + # Note: The first of the held back samples for next iteration is part of this iteration's return. + # Likewise, the first prepended sample on this iteration was part of the previous iteration's return. n_out_samps = hold_idx - t0 = msg_in.axes["time"].offset - (n_prepended - 1) * msg_in.axes["time"].gain - samp_idx -= 1 # Discard first prepended sample. + t0 = message.axes["time"].offset - (n_prepended - 1) * message.axes["time"].gain + cross_idx[-1] -= 1 # Discard first prepended sample. result = sparse.COO( - (feat_idx, samp_idx), + cross_idx, data=result_val, shape=data.shape[:-1] + (n_out_samps,), ) msg_out = replace( - template, + message, data=result, - axes={**template.axes, "time": replace(template.axes["time"], offset=t0)}, + axes={ + **self._state.template.axes, + "time": replace(message.axes["time"], offset=t0) + }, ) + return msg_out -class ThresholdSettings(ez.Settings): - threshold: float = -3.5 - max_peak_dur: float = 0.002 - refrac_dur: float = 0.001 - align_on_peak: bool = False - return_peak_val: bool = False - auto_scale_tau: float = 0.0 +class ThresholdCrossing( + BaseTransformerUnit[ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingTransformer] +): + SETTINGS = ThresholdSettings -class ThresholdCrossing(GenAxisArray): - SETTINGS = ThresholdSettings +# Legacy API support +@consumer +def threshold_crossing( + threshold: float = -3.5, + max_peak_dur: float = 0.002, + refrac_dur: float = 0.001, + align_on_peak: bool = False, + return_peak_val: bool = False, + auto_scale_tau: float = 0.0, +) -> typing.Generator[ + list[EventMessage] | AxisArray, AxisArray, None +]: + """ + Detect threshold crossing events. - def construct_generator(self): - self.STATE.gen = threshold_crossing( - threshold=self.SETTINGS.threshold, - max_peak_dur=self.SETTINGS.max_peak_dur, - refrac_dur=self.SETTINGS.refrac_dur, - align_on_peak=self.SETTINGS.align_on_peak, - return_peak_val=self.SETTINGS.return_peak_val, - auto_scale_tau=self.SETTINGS.auto_scale_tau, - ) + Args: + threshold: the value the signal must cross before the peak is found. + max_peak_dur: The maximum duration of a peak in seconds. + refrac_dur: The minimum duration between peaks in seconds. If 0 (default), no refractory period is enforced. + align_on_peak: If False (default), the returned sample index indicates the first sample across threshold. + If True, the sample index indicates the sample with the largest deviation after threshold crossing. + return_peak_val: If True then the peak value is included in the EventMessage or sparse matrix payload. + auto_scale_tau: If > 0, the data will be passed through a standard scaler prior to thresholding. + + Note: If either align_on_peak or return_peak_val are True then it is necessary to find the actual peak and not + just the threshold crossing. This will drastically increase the computational demand. It is recommended to + tune max_peak_dur to a minimal-yet-reasonable value to limit the search space. + + Returns: + A primed generator object that yields a list of :obj:`EventMessage` objects for every + :obj:`AxisArray` it receives via `send`. + """ + transformer = ThresholdCrossingTransformer( + threshold=threshold, + max_peak_dur=max_peak_dur, + refrac_dur=refrac_dur, + align_on_peak=align_on_peak, + return_peak_val=return_peak_val, + auto_scale_tau=auto_scale_tau, + ) + + msg_out = AxisArray(np.array([]), dims=[""]) + + while True: + msg_in = yield msg_out + msg_out = transformer(msg_in) diff --git a/uv.lock b/uv.lock index 27b7b48..7d7eb53 100644 --- a/uv.lock +++ b/uv.lock @@ -49,13 +49,12 @@ wheels = [ [[package]] name = "ezmsg-event" -version = "0.1.2.dev15+g8e32a61.d20241123" +version = "0.2.2.dev7+g66e94d2.d20250403" source = { editable = "." } dependencies = [ { name = "ezmsg-sigproc" }, { name = "numpy" }, { name = "sparse" }, - { name = "torch" }, ] [package.optional-dependencies] @@ -69,46 +68,25 @@ test = [ [package.metadata] requires-dist = [ - { name = "ezmsg-sigproc", specifier = ">=1.6.0" }, + { name = "ezmsg-sigproc", git = "https://github.com/ezmsg-org/ezmsg-sigproc.git?branch=70-use-protocols-for-axisarray-transformers" }, { name = "numpy", specifier = ">=1.26" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.3.3" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.8" }, { name = "sparse", specifier = ">=0.15.4" }, - { name = "torch", specifier = ">=2.5.1" }, { name = "typer", marker = "extra == 'dev'", specifier = ">=0.12.5" }, ] [[package]] name = "ezmsg-sigproc" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } +version = "1.8.2.dev113+g8c59dab" +source = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git?branch=70-use-protocols-for-axisarray-transformers#8c59dabbaeb7b06e89bd6a314ef637f976a8fc77" } dependencies = [ { name = "ezmsg" }, + { name = "numba" }, { name = "numpy" }, { name = "pywavelets" }, { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/fb4487ab867c9661793bf7cce12130734aca90daaa7e31dfdd38d9335343/ezmsg_sigproc-1.6.0.tar.gz", hash = "sha256:71c947f2ef02e9483964bf7b18c8fa82dbd78b9af814fb67130403bd092febdb", size = 102064 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/7a/07b7657671dedb9b3cc84de64ad433ec87a3e670d2ee6d4a5a120eb0ba89/ezmsg_sigproc-1.6.0-py3-none-any.whl", hash = "sha256:dd22cae8b0e2ba40a30257b2175b6d4dc4711c3f82445f63ecd9b4a0a24166b5", size = 56301 }, -] - -[[package]] -name = "filelock" -version = "3.16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, -] - -[[package]] -name = "fsspec" -version = "2024.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/52/f16a068ebadae42526484c31f4398e62962504e5724a8ba5dc3409483df2/fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493", size = 286853 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/b2/454d6e7f0158951d8a78c2e1eb4f69ae81beb8dca5fee9809c6c99e9d0d0/fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871", size = 179641 }, + { name = "sparse" }, ] [[package]] @@ -120,39 +98,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] -[[package]] -name = "jinja2" -version = "3.1.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, -] - [[package]] name = "llvmlite" -version = "0.43.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/3d/f513755f285db51ab363a53e898b85562e950f79a2e6767a364530c2f645/llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5", size = 157069 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/ff/6ca7e98998b573b4bd6566f15c35e5c8bea829663a6df0c7aa55ab559da9/llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761", size = 31064408 }, - { url = "https://files.pythonhosted.org/packages/ca/5c/a27f9257f86f0cda3f764ff21d9f4217b9f6a0d45e7a39ecfa7905f524ce/llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc", size = 28793153 }, - { url = "https://files.pythonhosted.org/packages/7e/3c/4410f670ad0a911227ea2ecfcba9f672a77cf1924df5280c4562032ec32d/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead", size = 42857276 }, - { url = "https://files.pythonhosted.org/packages/c6/21/2ffbab5714e72f2483207b4a1de79b2eecd9debbf666ff4e7067bcc5c134/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a", size = 43871781 }, - { url = "https://files.pythonhosted.org/packages/f2/26/b5478037c453554a61625ef1125f7e12bb1429ae11c6376f47beba9b0179/llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed", size = 28123487 }, - { url = "https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98", size = 31064409 }, - { url = "https://files.pythonhosted.org/packages/ee/e1/38deed89ced4cf378c61e232265cfe933ccde56ae83c901aa68b477d14b1/llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57", size = 28793149 }, - { url = "https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2", size = 42857277 }, - { url = "https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749", size = 43871781 }, - { url = "https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91", size = 28107433 }, - { url = "https://files.pythonhosted.org/packages/0b/67/9443509e5d2b6d8587bae3ede5598fa8bd586b1c7701696663ea8af15b5b/llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7", size = 31064409 }, - { url = "https://files.pythonhosted.org/packages/a2/9c/24139d3712d2d352e300c39c0e00d167472c08b3bd350c3c33d72c88ff8d/llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7", size = 28793145 }, - { url = "https://files.pythonhosted.org/packages/bf/f1/4c205a48488e574ee9f6505d50e84370a978c90f08dab41a42d8f2c576b6/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f", size = 42857276 }, - { url = "https://files.pythonhosted.org/packages/00/5f/323c4d56e8401c50185fd0e875fcf06b71bf825a863699be1eb10aa2a9cb/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844", size = 43871781 }, - { url = "https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9", size = 28107442 }, +version = "0.44.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306 }, + { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096 }, + { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859 }, + { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199 }, + { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381 }, + { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305 }, + { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090 }, + { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200 }, + { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193 }, + { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297 }, + { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105 }, + { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901 }, + { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247 }, + { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380 }, + { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306 }, + { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090 }, + { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904 }, + { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245 }, + { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193 }, ] [[package]] @@ -167,64 +138,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -234,49 +147,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] -[[package]] -name = "mpmath" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, -] - -[[package]] -name = "networkx" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, -] - [[package]] name = "numba" -version = "0.60.0" +version = "0.61.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/93/2849300a9184775ba274aba6f82f303343669b0592b7bb0849ea713dabb0/numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16", size = 2702171 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/cf/baa13a7e3556d73d9e38021e6d6aa4aeb30d8b94545aa8b70d0f24a1ccc4/numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651", size = 2647627 }, - { url = "https://files.pythonhosted.org/packages/ac/ba/4b57fa498564457c3cc9fc9e570a6b08e6086c74220f24baaf04e54b995f/numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b", size = 2650322 }, - { url = "https://files.pythonhosted.org/packages/28/98/7ea97ee75870a54f938a8c70f7e0be4495ba5349c5f9db09d467c4a5d5b7/numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781", size = 3407390 }, - { url = "https://files.pythonhosted.org/packages/79/58/cb4ac5b8f7ec64200460aef1fed88258fb872ceef504ab1f989d2ff0f684/numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e", size = 3699694 }, - { url = "https://files.pythonhosted.org/packages/1c/b0/c61a93ca947d12233ff45de506ddbf52af3f752066a0b8be4d27426e16da/numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198", size = 2687030 }, - { url = "https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8", size = 2647254 }, - { url = "https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b", size = 2649970 }, - { url = "https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703", size = 3412492 }, - { url = "https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8", size = 3705018 }, - { url = "https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2", size = 2686920 }, - { url = "https://files.pythonhosted.org/packages/eb/5c/b5ec752c475e78a6c3676b67c514220dbde2725896bbb0b6ec6ea54b2738/numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404", size = 2647866 }, - { url = "https://files.pythonhosted.org/packages/65/42/39559664b2e7c15689a638c2a38b3b74c6e69a04e2b3019b9f7742479188/numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c", size = 2650208 }, - { url = "https://files.pythonhosted.org/packages/67/88/c4459ccc05674ef02119abf2888ccd3e2fed12a323f52255f4982fc95876/numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e", size = 3466946 }, - { url = "https://files.pythonhosted.org/packages/8b/41/ac11cf33524def12aa5bd698226ae196a1185831c05ed29dc0c56eaa308b/numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d", size = 3761463 }, - { url = "https://files.pythonhosted.org/packages/ca/bd/0fe29fcd1b6a8de479a4ed25c6e56470e467e3611c079d55869ceef2b6d1/numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347", size = 2707588 }, +sdist = { url = "https://files.pythonhosted.org/packages/3c/88/c13a935f200fda51384411e49840a8e7f70c9cb1ee8d809dd0f2477cf7ef/numba-0.61.0.tar.gz", hash = "sha256:888d2e89b8160899e19591467e8fdd4970e07606e1fbc248f239c89818d5f925", size = 2816484 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/97/8568a025b9ab8b4d53491e70d4206d5f3fc71fbe94f3097058e01ad8e7ff/numba-0.61.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9cab9783a700fa428b1a54d65295122bc03b3de1d01fb819a6b9dbbddfdb8c43", size = 2769008 }, + { url = "https://files.pythonhosted.org/packages/8c/ab/a88c20755f66543ee01c85c98b866595b92e1bd0ed80565a4889e22929a8/numba-0.61.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46c5ae094fb3706f5adf9021bfb7fc11e44818d61afee695cdee4eadfed45e98", size = 2771815 }, + { url = "https://files.pythonhosted.org/packages/ae/f4/b357913089ecec1a9ddc6adc04090396928f36a484a5ab9e71b24ddba4cd/numba-0.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6fb74e81aa78a2303e30593d8331327dfc0d2522b5db05ac967556a26db3ef87", size = 3820233 }, + { url = "https://files.pythonhosted.org/packages/ea/60/0e21bcf3baaf10e39d48cd224618e46a6b75d3394f465c37ce57bf98cbfa/numba-0.61.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0ebbd4827091384ab8c4615ba1b3ca8bc639a3a000157d9c37ba85d34cd0da1b", size = 3514707 }, + { url = "https://files.pythonhosted.org/packages/a0/08/45c136ab59e6b11e61ce15a0d17ef03fd89eaccb0db05ad67912aaf5218a/numba-0.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:43aa4d7d10c542d3c78106b8481e0cbaaec788c39ee8e3d7901682748ffdf0b4", size = 2827753 }, + { url = "https://files.pythonhosted.org/packages/63/8f/f983a7c859ccad73d3cc3f86fbba94f16e137cd1ee464631d61b624363b2/numba-0.61.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:bf64c2d0f3d161af603de3825172fb83c2600bcb1d53ae8ea568d4c53ba6ac08", size = 2768960 }, + { url = "https://files.pythonhosted.org/packages/be/1b/c33dc847d475d5b647b4ad5aefc38df7a72283763f4cda47745050375a81/numba-0.61.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de5aa7904741425f28e1028b85850b31f0a245e9eb4f7c38507fb893283a066c", size = 2771862 }, + { url = "https://files.pythonhosted.org/packages/14/91/18b9f64b34ff318a14d072251480547f89ebfb864b2b7168e5dc5f64f502/numba-0.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21c2fe25019267a608e2710a6a947f557486b4b0478b02e45a81cf606a05a7d4", size = 3825411 }, + { url = "https://files.pythonhosted.org/packages/f2/97/1a38030c2a331e273ace1de2b61988e33d80878fda8a5eedee0cd78399d3/numba-0.61.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:74250b26ed6a1428763e774dc5b2d4e70d93f73795635b5412b8346a4d054574", size = 3519604 }, + { url = "https://files.pythonhosted.org/packages/df/a7/56f547de8fc197963f238fd62beb5f1d2cace047602d0577956bf6840970/numba-0.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:b72bbc8708e98b3741ad0c63f9929c47b623cc4ee86e17030a4f3e301e8401ac", size = 2827642 }, + { url = "https://files.pythonhosted.org/packages/63/c9/c61881e7f2e253e745209f078bbd428ce23b6cf901f7d93afe166720ff95/numba-0.61.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:152146ecdbb8d8176f294e9f755411e6f270103a11c3ff50cecc413f794e52c8", size = 2769758 }, + { url = "https://files.pythonhosted.org/packages/e1/28/ddec0147a4933f86ceaca580aa9bb767d5632ecdb1ece6cfb3eab4ac78e5/numba-0.61.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5cafa6095716fcb081618c28a8d27bf7c001e09696f595b41836dec114be2905", size = 2772445 }, + { url = "https://files.pythonhosted.org/packages/18/74/6a9f0e6c76c088f8a6aa702eab31734068061dca5cc0f34e8bc1eb447de1/numba-0.61.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ffe9fe373ed30638d6e20a0269f817b2c75d447141f55a675bfcf2d1fe2e87fb", size = 3882115 }, + { url = "https://files.pythonhosted.org/packages/53/68/d7c31e53f08e6b4669c9b5a3cd7c5fb9097220c5ef388bc099ca8ab9749f/numba-0.61.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9f25f7fef0206d55c1cfb796ad833cbbc044e2884751e56e798351280038484c", size = 3573296 }, + { url = "https://files.pythonhosted.org/packages/94/4f/8357a99a14f331b865a42cb4756ae37da85599b9c95e01277ea10361e91a/numba-0.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:550d389573bc3b895e1ccb18289feea11d937011de4d278b09dc7ed585d1cdcb", size = 2828077 }, + { url = "https://files.pythonhosted.org/packages/3b/54/71fba18e4af5619f1ea8175ee92e82dd8e220bd6feb8c0153c6b814c8a60/numba-0.61.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:b96fafbdcf6f69b69855273e988696aae4974115a815f6818fef4af7afa1f6b8", size = 2768024 }, + { url = "https://files.pythonhosted.org/packages/39/76/2448b43d08e904aad1b1b9cd12835b19411e84a81aa9192f83642a5e0afd/numba-0.61.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f6c452dca1de8e60e593f7066df052dd8da09b243566ecd26d2b796e5d3087d", size = 2769541 }, + { url = "https://files.pythonhosted.org/packages/32/8f/4bb2374247ab988c9eac587b304b2947a36d605b9bb9ba4bf06e955c17d3/numba-0.61.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44240e694d4aa321430c97b21453e46014fe6c7b8b7d932afa7f6a88cc5d7e5e", size = 3890102 }, + { url = "https://files.pythonhosted.org/packages/ab/bc/dc2d03555289ae5263f65c01d45eb186ce347585c191daf0e60021d5ed39/numba-0.61.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:764f0e47004f126f58c3b28e0a02374c420a9d15157b90806d68590f5c20cc89", size = 3580239 }, + { url = "https://files.pythonhosted.org/packages/61/08/71247ce560d2c222d9ca705c7d3547fc4069b96fc85d71aabeb890befe9f/numba-0.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:074cd38c5b1f9c65a4319d1f3928165f48975ef0537ad43385b2bd908e6e2e35", size = 2828035 }, ] [[package]] @@ -317,126 +217,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, ] -[[package]] -name = "nvidia-cublas-cu12" -version = "12.4.5.8" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/7f/7fbae15a3982dc9595e49ce0f19332423b260045d0a6afe93cdbe2f1f624/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", size = 363333771 }, - { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 }, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/b5/9fb3d00386d3361b03874246190dfec7b206fd74e6e287b26a8fcb359d95/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", size = 12354556 }, - { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 }, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/aa/083b01c427e963ad0b314040565ea396f914349914c298556484f799e61b/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", size = 24133372 }, - { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 }, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/aa/b656d755f474e2084971e9a297def515938d56b466ab39624012070cb773/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", size = 894177 }, - { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 }, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.1.0.70" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.2.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/8a/0e728f749baca3fbeffad762738276e5df60851958be7783af121a7221e7/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", size = 211422548 }, - { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 }, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.5.147" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/9c/a79180e4d70995fdf030c6946991d0171555c6edf95c265c6b2bf7011112/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", size = 56314811 }, - { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 }, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.6.1.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/6b/a5c33cf16af09166845345275c34ad2190944bcc6026797a39f8e0a282e0/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", size = 127634111 }, - { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 }, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.3.1.170" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/a9/c0d2f83a53d40a4a41be14cea6a0bf9e668ffcf8b004bd65633f433050c0/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", size = 207381987 }, - { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 }, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.21.5" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414 }, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/45/239d52c05074898a80a900f49b1615d81c07fceadd5ad6c4f86a987c0bc4/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", size = 20552510 }, - { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 }, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.4.127" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/39/471f581edbb7804b39e8063d92fc8305bdc7a80ae5c07dbe6ea5c50d14a5/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", size = 100417 }, - { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, -] - [[package]] name = "packaging" version = "24.2" @@ -609,15 +389,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524 }, ] -[[package]] -name = "setuptools" -version = "75.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/54/292f26c208734e9a7f067aea4a7e282c080750c4546559b58e2e45413ca0/setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", size = 1337429 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/55/21/47d163f615df1d30c094f6c8bbb353619274edccf0327b185cc2493c2c33/setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d", size = 1224032 }, -] - [[package]] name = "shellingham" version = "1.5.4" @@ -641,18 +412,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/f2/8d5bc8cc6b822feac1cd671dac6fb0249a5202ad15ee9549d1a61d4141b5/sparse-0.15.4-py2.py3-none-any.whl", hash = "sha256:76ec76fee2aee82a84eb97155dd530a9644e3b1fdea2406bc4b454698b36d938", size = 237311 }, ] -[[package]] -name = "sympy" -version = "1.13.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mpmath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 }, -] - [[package]] name = "tomli" version = "2.1.0" @@ -662,61 +421,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/f7/4da0ffe1892122c9ea096c57f64c2753ae5dd3ce85488802d11b0992cc6d/tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391", size = 13750 }, ] -[[package]] -name = "torch" -version = "2.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "setuptools", marker = "python_full_version >= '3.12'" }, - { name = "sympy" }, - { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/ef/834af4a885b31a0b32fff2d80e1e40f771e1566ea8ded55347502440786a/torch-2.5.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:71328e1bbe39d213b8721678f9dcac30dfc452a46d586f1d514a6aa0a99d4744", size = 906446312 }, - { url = "https://files.pythonhosted.org/packages/69/f0/46e74e0d145f43fa506cb336eaefb2d240547e4ce1f496e442711093ab25/torch-2.5.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:34bfa1a852e5714cbfa17f27c49d8ce35e1b7af5608c4bc6e81392c352dbc601", size = 91919522 }, - { url = "https://files.pythonhosted.org/packages/a5/13/1eb674c8efbd04d71e4a157ceba991904f633e009a584dd65dccbafbb648/torch-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:32a037bd98a241df6c93e4c789b683335da76a2ac142c0973675b715102dc5fa", size = 203088048 }, - { url = "https://files.pythonhosted.org/packages/a9/9d/e0860474ee0ff8f6ef2c50ec8f71a250f38d78a9b9df9fd241ad3397a65b/torch-2.5.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:23d062bf70776a3d04dbe74db950db2a5245e1ba4f27208a87f0d743b0d06e86", size = 63877046 }, - { url = "https://files.pythonhosted.org/packages/d1/35/e8b2daf02ce933e4518e6f5682c72fd0ed66c15910ea1fb4168f442b71c4/torch-2.5.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:de5b7d6740c4b636ef4db92be922f0edc425b65ed78c5076c43c42d362a45457", size = 906474467 }, - { url = "https://files.pythonhosted.org/packages/40/04/bd91593a4ca178ece93ca55f27e2783aa524aaccbfda66831d59a054c31e/torch-2.5.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:340ce0432cad0d37f5a31be666896e16788f1adf8ad7be481196b503dad675b9", size = 91919450 }, - { url = "https://files.pythonhosted.org/packages/0d/4a/e51420d46cfc90562e85af2fee912237c662ab31140ab179e49bd69401d6/torch-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:603c52d2fe06433c18b747d25f5c333f9c1d58615620578c326d66f258686f9a", size = 203098237 }, - { url = "https://files.pythonhosted.org/packages/d0/db/5d9cbfbc7968d79c5c09a0bc0bc3735da079f2fd07cc10498a62b320a480/torch-2.5.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:31f8c39660962f9ae4eeec995e3049b5492eb7360dd4f07377658ef4d728fa4c", size = 63884466 }, - { url = "https://files.pythonhosted.org/packages/8b/5c/36c114d120bfe10f9323ed35061bc5878cc74f3f594003854b0ea298942f/torch-2.5.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:ed231a4b3a5952177fafb661213d690a72caaad97d5824dd4fc17ab9e15cec03", size = 906389343 }, - { url = "https://files.pythonhosted.org/packages/6d/69/d8ada8b6e0a4257556d5b4ddeb4345ea8eeaaef3c98b60d1cca197c7ad8e/torch-2.5.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3f4b7f10a247e0dcd7ea97dc2d3bfbfc90302ed36d7f3952b0008d0df264e697", size = 91811673 }, - { url = "https://files.pythonhosted.org/packages/5f/ba/607d013b55b9fd805db2a5c2662ec7551f1910b4eef39653eeaba182c5b2/torch-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:73e58e78f7d220917c5dbfad1a40e09df9929d3b95d25e57d9f8558f84c9a11c", size = 203046841 }, - { url = "https://files.pythonhosted.org/packages/57/6c/bf52ff061da33deb9f94f4121fde7ff3058812cb7d2036c97bc167793bd1/torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1", size = 63858109 }, - { url = "https://files.pythonhosted.org/packages/69/72/20cb30f3b39a9face296491a86adb6ff8f1a47a897e4d14667e6cf89d5c3/torch-2.5.1-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:9b61edf3b4f6e3b0e0adda8b3960266b9009d02b37555971f4d1c8f7a05afed7", size = 906393265 }, -] - -[[package]] -name = "triton" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013 }, - { url = "https://files.pythonhosted.org/packages/86/17/d9a5cf4fcf46291856d1e90762e36cbabd2a56c7265da0d1d9508c8e3943/triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c", size = 209506424 }, - { url = "https://files.pythonhosted.org/packages/78/eb/65f5ba83c2a123f6498a3097746607e5b2f16add29e36765305e4ac7fdd8/triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc", size = 209551444 }, -] - [[package]] name = "typer" version = "0.13.1" From ae83426c4511ae3fc2d59464b8eba629d928d8dd Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 18 Apr 2025 15:20:48 -0400 Subject: [PATCH 02/13] Remove windowing node now that ezmsg-sigproc windowing has sparse support --- src/ezmsg/event/rate.py | 3 +- src/ezmsg/event/window.py | 225 -------------------------------------- tests/test_window.py | 42 ------- 3 files changed, 1 insertion(+), 269 deletions(-) delete mode 100644 src/ezmsg/event/window.py delete mode 100644 tests/test_window.py diff --git a/src/ezmsg/event/rate.py b/src/ezmsg/event/rate.py index efdfca1..4140eec 100644 --- a/src/ezmsg/event/rate.py +++ b/src/ezmsg/event/rate.py @@ -10,8 +10,7 @@ from ezmsg.util.messages.axisarray import AxisArray from ezmsg.util.generator import consumer from ezmsg.sigproc.base import GenAxisArray - -from .window import windowing +from ezmsg.sigproc.window import windowing @consumer diff --git a/src/ezmsg/event/window.py b/src/ezmsg/event/window.py deleted file mode 100644 index 76a3679..0000000 --- a/src/ezmsg/event/window.py +++ /dev/null @@ -1,225 +0,0 @@ -from dataclasses import replace -import typing - -import numpy as np -import sparse -import ezmsg.core as ez -from ezmsg.sigproc.base import GenAxisArray -from ezmsg.util.generator import consumer -from ezmsg.util.messages.axisarray import ( - AxisArray, - slice_along_axis, - sliding_win_oneaxis, -) - -from .util.array import sliding_win_oneaxis as sparse_sliding_win - - -@consumer -def windowing( - axis: str | None = None, - newaxis: str = "win", - window_dur: float | None = None, - window_shift: float | None = None, - zero_pad_until: str = "input", -) -> typing.Generator[AxisArray, AxisArray, None]: - """ - Construct a generator that yields windows of data from an input :obj:`AxisArray`. - - Args: - axis: The axis along which to segment windows. - If None, defaults to the first dimension of the first seen AxisArray. - newaxis: New axis on which windows are delimited, immediately - preceding the target windowed axis. The data length along newaxis may be 0 if - this most recent push did not provide enough data for a new window. - If window_shift is None then the newaxis length will always be 1. - window_dur: The duration of the window in seconds. - If None, the function acts as a passthrough and all other parameters are ignored. - window_shift: The shift of the window in seconds. - If None (default), windowing operates in "1:1 mode", where each input yields exactly one most-recent window. - zero_pad_until: Determines how the function initializes the buffer. - Can be one of "input" (default), "full", "shift", or "none". If `window_shift` is None then this field is - ignored and "input" is always used. - - - "input" (default) initializes the buffer with the input then prepends with zeros to the window size. - The first input will always yield at least one output. - - "shift" fills the buffer until `window_shift`. - No outputs will be yielded until at least `window_shift` data has been seen. - - "none" does not pad the buffer. No outputs will be yielded until at least `window_dur` data has been seen. - - Returns: - A (primed) generator that accepts .send(an AxisArray object) and yields a list of windowed - AxisArray objects. The list will always be length-1 if `newaxis` is not None or `window_shift` is None. - """ - # Check arguments - if newaxis is None: - ez.logger.warning("`newaxis` must not be None. Setting to 'win'.") - newaxis = "win" - if window_shift is None and zero_pad_until != "input": - ez.logger.warning( - "`zero_pad_until` must be 'input' if `window_shift` is None. " - f"Ignoring received argument value: {zero_pad_until}" - ) - zero_pad_until = "input" - elif window_shift is not None and zero_pad_until == "input": - ez.logger.warning( - "windowing is non-deterministic with `zero_pad_until='input'` as it depends on the size " - "of the first input. We recommend using 'shift' when `window_shift` is float-valued." - ) - - msg_out = AxisArray(np.array([]), dims=[""]) - - # State variables - buffer: sparse.SparseArray | None = None - window_samples: int | None = None - window_shift_samples: int | None = None - shift_deficit: int = 0 - b_1to1 = window_shift is None - newaxis_warned: bool = b_1to1 - out_newaxis: AxisArray.Axis | None = None - out_dims: list[str] | None = None - - check_inputs = {"samp_shape": None, "fs": None, "key": None} - - while True: - msg_in: AxisArray = yield msg_out - - if window_dur is None: - msg_out = msg_in - continue - - axis = axis or msg_in.dims[0] - axis_idx = msg_in.get_axis_idx(axis) - axis_info = msg_in.get_axis(axis) - fs = 1.0 / axis_info.gain - - if not newaxis_warned and newaxis in msg_in.dims: - ez.logger.warning( - f"newaxis {newaxis} present in input dims. Using {newaxis}_win instead" - ) - newaxis_warned = True - newaxis = f"{newaxis}_win" - - samp_shape = msg_in.data.shape[:axis_idx] + msg_in.data.shape[axis_idx + 1 :] - - # If buffer unset or input stats changed, create a new buffer - b_reset = buffer is None - b_reset = b_reset or samp_shape != check_inputs["samp_shape"] - b_reset = b_reset or fs != check_inputs["fs"] - b_reset = b_reset or msg_in.key != check_inputs["key"] - if b_reset: - # Update check variables - check_inputs["samp_shape"] = samp_shape - check_inputs["fs"] = fs - check_inputs["key"] = msg_in.key - - window_samples = int(window_dur * fs) - if not b_1to1: - window_shift_samples = int(window_shift * fs) - if zero_pad_until == "none": - req_samples = window_samples - elif zero_pad_until == "shift" and not b_1to1: - req_samples = window_shift_samples - else: # i.e. zero_pad_until == "input" - req_samples = msg_in.data.shape[axis_idx] - n_zero = max(0, window_samples - req_samples) - buffer = sparse.zeros( - msg_in.data.shape[:axis_idx] - + (n_zero,) - + msg_in.data.shape[axis_idx + 1 :] - ) - - # Add new data to buffer. - buffer = sparse.concatenate((buffer, msg_in.data), axis=axis_idx) - - # Create a vector of buffer timestamps to track axis `offset` in output(s) - buffer_offset = np.arange(buffer.shape[axis_idx]).astype(float) - # Adjust so first _new_ sample at index 0 - buffer_offset -= buffer_offset[-msg_in.data.shape[axis_idx]] - # Convert form indices to 'units' (probably seconds). - buffer_offset *= axis_info.gain - buffer_offset += axis_info.offset - - if not b_1to1 and shift_deficit > 0: - n_skip = min(buffer.shape[axis_idx], shift_deficit) - if n_skip > 0: - buffer = slice_along_axis(buffer, slice(n_skip, None), axis_idx) - buffer_offset = buffer_offset[n_skip:] - shift_deficit -= n_skip - - # Prepare reusable parts of output - if out_newaxis is None: - out_dims = msg_in.dims[:axis_idx] + [newaxis] + msg_in.dims[axis_idx:] - out_newaxis = replace( - axis_info, - gain=0.0 if b_1to1 else axis_info.gain * window_shift_samples, - offset=0.0, # offset modified per-msg below - ) - - # Generate outputs. - # Preliminary copy of axes without the axes that we are modifying. - out_axes = {k: v for k, v in msg_in.axes.items() if k not in [newaxis, axis]} - - # Update targeted (windowed) axis so that its offset is relative to the new axis - # TODO: If we have `anchor_newest=True` then offset should be -win_dur - out_axes[axis] = replace(axis_info, offset=0.0) - - # How we update .data and .axes[newaxis] depends on the windowing mode. - if b_1to1: - # one-to-one mode -- Each send yields exactly one window containing only the most recent samples. - buffer = slice_along_axis(buffer, slice(-window_samples, None), axis_idx) - out_dat = buffer.reshape( - buffer.shape[:axis_idx] + (1,) + buffer.shape[axis_idx:] - ) - out_newaxis = replace(out_newaxis, offset=buffer_offset[-window_samples]) - elif buffer.shape[axis_idx] >= window_samples: - # Deterministic window shifts. - out_dat = sparse_sliding_win( - buffer, window_samples, axis_idx, step=window_shift_samples - ) - offset_view = sliding_win_oneaxis(buffer_offset, window_samples, 0)[ - ::window_shift_samples - ] - out_newaxis = replace(out_newaxis, offset=offset_view[0, 0]) - - # Drop expired beginning of buffer and update shift_deficit - multi_shift = window_shift_samples * out_dat.shape[axis_idx] - shift_deficit = max(0, multi_shift - buffer.shape[axis_idx]) - buffer = slice_along_axis(buffer, slice(multi_shift, None), axis_idx) - else: - # Not enough data to make a new window. Return empty data. - empty_data_shape = ( - msg_in.data.shape[:axis_idx] - + (0, window_samples) - + msg_in.data.shape[axis_idx + 1 :] - ) - out_dat = sparse.zeros(empty_data_shape, dtype=msg_in.data.dtype) - # out_newaxis will have first timestamp in input... but mostly meaningless because output is size-zero. - out_newaxis = replace(out_newaxis, offset=axis_info.offset) - - msg_out = replace( - msg_in, data=out_dat, dims=out_dims, axes={**out_axes, newaxis: out_newaxis} - ) - - -class WindowSettings(ez.Settings): - axis: str | None = None - newaxis: str | None = None # new axis for output. No new axes if None - window_dur: float | None = None # Sec. passthrough if None - window_shift: float | None = None # Sec. Use "1:1 mode" if None - zero_pad_until: str = "full" # "full", "shift", "input", "none" - - -class Window(GenAxisArray): - """:obj:`Unit` for :obj:`bandpower`.""" - - SETTINGS = WindowSettings - - def construct_generator(self): - self.STATE.gen = windowing( - axis=self.SETTINGS.axis, - newaxis=self.SETTINGS.newaxis, - window_dur=self.SETTINGS.window_dur, - window_shift=self.SETTINGS.window_shift, - zero_pad_until=self.SETTINGS.zero_pad_until, - ) diff --git a/tests/test_window.py b/tests/test_window.py deleted file mode 100644 index 5f0dcfb..0000000 --- a/tests/test_window.py +++ /dev/null @@ -1,42 +0,0 @@ -import numpy as np -import pytest -import sparse -from ezmsg.util.messages.axisarray import AxisArray - -from ezmsg.event.window import windowing - - -@pytest.mark.parametrize("win_dur", [0.3, 1.0]) -@pytest.mark.parametrize("win_shift", [None, 0.2, 1.0]) -@pytest.mark.parametrize("zero_pad", ["input", "shift", "none"]) -def test_sparse_window( - win_dur: float, - win_shift: float | None, - zero_pad: str, -): - fs = 100.0 - rng = np.random.default_rng() - s = sparse.random((1_000, 5), density=0.1, random_state=rng) > 0 - in_msgs = [ - AxisArray( - data=s[msg_ix * 100 : (msg_ix + 1) * 100], - dims=["time", "ch"], - axes={ - "time": AxisArray.Axis.TimeAxis(fs=fs, offset=msg_ix / fs), - }, - key="test_sparse_window", - ) - for msg_ix in range(10) - ] - - proc = windowing( - axis="time", - newaxis="win", - window_dur=win_dur, - window_shift=win_shift, - zero_pad_until=zero_pad, - ) - out_msgs = [proc.send(_) for _ in in_msgs] - for om in out_msgs: - assert om.dims == ["win", "time", "ch"] - print(out_msgs[0]) From cb40de3c6e336d3ad9f849b2c2b740e203717741 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 18 Apr 2025 15:21:36 -0400 Subject: [PATCH 03/13] ruff format --- src/ezmsg/event/peak.py | 88 ++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/src/ezmsg/event/peak.py b/src/ezmsg/event/peak.py index b18a6d1..0ecff79 100644 --- a/src/ezmsg/event/peak.py +++ b/src/ezmsg/event/peak.py @@ -7,7 +7,11 @@ import ezmsg.core as ez from ezmsg.util.messages.axisarray import AxisArray, replace # slice_along_axis, from ezmsg.util.generator import consumer -from ezmsg.sigproc.base import BaseStatefulTransformer, processor_state, BaseTransformerUnit +from ezmsg.sigproc.base import ( + BaseStatefulTransformer, + processor_state, + BaseTransformerUnit, +) from ezmsg.sigproc.scaler import AdaptiveStandardScalerTransformer import numpy as np import numpy.typing as npt @@ -64,16 +68,18 @@ class ThresholdCrossingState: template: AxisArray = None """Template for the output message to reduce memory allocation. TODO: Maybe unnecessary.""" - + class ThresholdCrossingTransformer( - BaseStatefulTransformer[ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingState] + BaseStatefulTransformer[ + ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingState + ] ): """Transformer that detects threshold crossing events.""" def _hash_message(self, message: AxisArray) -> int: ax_idx = message.get_axis_idx("time") - sample_shape = message.data.shape[:ax_idx] + message.data.shape[ax_idx + 1:] + sample_shape = message.data.shape[:ax_idx] + message.data.shape[ax_idx + 1 :] return hash((message.key, sample_shape, message.axes["time"].gain)) def _reset_state(self, message: AxisArray) -> None: @@ -95,27 +101,30 @@ def _reset_state(self, message: AxisArray) -> None: self._state.data_raw = None if self.settings.auto_scale_tau > 0: self._state.scaler = AdaptiveStandardScalerTransformer( - time_constant=self.settings.auto_scale_tau, - axis="time" + time_constant=self.settings.auto_scale_tau, axis="time" ) if self.settings.return_peak_val: self._state.data_raw = first_samp # We always need at least the previous iteration's last sample for tracking whether we are newly over threshold, # and potentially for aligning on peak or returning the peak value. - self._state.data = first_samp if self._state.scaler is None else np.zeros_like(first_samp) + self._state.data = ( + first_samp if self._state.scaler is None else np.zeros_like(first_samp) + ) # Initialize the count of samples since last event for each feature. We initialize at refrac_width+1 # to ensure that even the first sample is eligible for events. - self._state.elapsed = np.zeros((np.prod(data.shape[:-1]),), dtype=int) + (self._state.refrac_width + 1) + self._state.elapsed = np.zeros((np.prod(data.shape[:-1]),), dtype=int) + ( + self._state.refrac_width + 1 + ) def _process(self, message: AxisArray) -> AxisArray: """ Process incoming samples and detect threshold crossings. - + Args: msg: The input AxisArray containing signal data - + Returns: AxisArray with sparse data containing detected events """ @@ -126,13 +135,15 @@ def _process(self, message: AxisArray) -> AxisArray: message = replace( message, data=np.moveaxis(message.data, ax_idx, -1), - dims=message.dims[:ax_idx] + message.dims[ax_idx + 1:] + ["time"], + dims=message.dims[:ax_idx] + message.dims[ax_idx + 1 :] + ["time"], ) # Take a copy of the raw data if needed and prepend to our state data_raw # This will only exist if we are autoscaling AND we need to capture the true peak value. if self._state.data_raw is not None: - self._state.data_raw = np.concatenate((self._state.data_raw, message.data), axis=-1) + self._state.data_raw = np.concatenate( + (self._state.data_raw, message.data), axis=-1 + ) # Run the message through the standard scaler if needed. Note: raw value is lost unless we copied it above. if self._state.scaler is not None: @@ -144,7 +155,11 @@ def _process(self, message: AxisArray) -> AxisArray: n_prepended = self._state.data.shape[-1] # Identify which data points are over threshold - overs = data >= self.settings.threshold if self.settings.threshold >= 0 else data <= self.settings.threshold + overs = ( + data >= self.settings.threshold + if self.settings.threshold >= 0 + else data <= self.settings.threshold + ) # Find threshold _crossing_: where sample k is over and sample k-1 is not over. b_cross_over = np.logical_and(overs[..., 1:], ~overs[..., :-1]) @@ -167,7 +182,9 @@ def _process(self, message: AxisArray) -> AxisArray: # Calculate the inter-event intervals (IEIs) for each feature. First get all the IEIs. ieis = np.diff(np.hstack(([cross_idx[-1][0] + 1], cross_idx[-1]))) # Then reset the interval at feature boundaries. - ieis[feat_splits] = cross_idx[-1][feat_splits] + self._state.elapsed[uq_feats] + ieis[feat_splits] = ( + cross_idx[-1][feat_splits] + self._state.elapsed[uq_feats] + ) b_drop = ieis <= self._state.refrac_width drop_idx = np.where(b_drop)[0] final_drop = [] @@ -192,9 +209,14 @@ def _process(self, message: AxisArray) -> AxisArray: if len(cross_idx[-1]) == 0: # No events; not values to calculate. result_val = np.ones( - cross_idx[-1].shape, dtype=data.dtype if self.settings.return_peak_val else bool + cross_idx[-1].shape, + dtype=data.dtype if self.settings.return_peak_val else bool, ) - elif not (self._state.min_width > 1 or self.settings.align_on_peak or self.settings.return_peak_val): + elif not ( + self._state.min_width > 1 + or self.settings.align_on_peak + or self.settings.return_peak_val + ): # No postprocessing required. TODO: Why is min_width <= 1 a requirement here? result_val = np.ones(cross_idx[-1].shape, dtype=bool) else: @@ -213,7 +235,9 @@ def _process(self, message: AxisArray) -> AxisArray: # Combine feature indices and time indices to extract segments of overs. # Note: We had to expand each of our feature indices also be 2-dimensional # -> ndarray (eat dims ..., max_width) - ep_overs = overs_padded[tuple(_[:, None] for _ in cross_idx[:-1]) + (s_idx,)] + ep_overs = overs_padded[ + tuple(_[:, None] for _ in cross_idx[:-1]) + (s_idx,) + ] # Find the event lengths: i.e., the first non-over-threshold value for each event. # Warning: Values are invalid for events that don't cross back. @@ -257,7 +281,9 @@ def _process(self, message: AxisArray) -> AxisArray: for len_idx, ep_len in enumerate(uq_lens): b_grp = len_grps == len_idx ep_resamp = np.arange(ep_len)[None, :] + cross_idx[-1][b_grp, None] - ep_inds_tuple = tuple(_[b_grp, None] for _ in cross_idx[:-1]) + (ep_resamp,) + ep_inds_tuple = tuple(_[b_grp, None] for _ in cross_idx[:-1]) + ( + ep_resamp, + ) eps = data[ep_inds_tuple] if self.settings.threshold >= 0: pk_offset[b_grp] = np.argmax(eps, axis=1) @@ -270,8 +296,16 @@ def _process(self, message: AxisArray) -> AxisArray: if self.settings.return_peak_val: # We need the actual peak value. - peak_inds_tuple = cross_idx if self.settings.align_on_peak else tuple(cross_idx[:-1]) + (cross_idx[-1] + pk_offset,) - result_val = (self._state.data_raw if self._state.data_raw is not None else data)[peak_inds_tuple] + peak_inds_tuple = ( + cross_idx + if self.settings.align_on_peak + else tuple(cross_idx[:-1]) + (cross_idx[-1] + pk_offset,) + ) + result_val = ( + self._state.data_raw + if self._state.data_raw is not None + else data + )[peak_inds_tuple] # Save data for next iteration self._state.data = data[..., hold_idx:] @@ -300,14 +334,16 @@ def _process(self, message: AxisArray) -> AxisArray: data=result, axes={ **self._state.template.axes, - "time": replace(message.axes["time"], offset=t0) + "time": replace(message.axes["time"], offset=t0), }, ) return msg_out class ThresholdCrossing( - BaseTransformerUnit[ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingTransformer] + BaseTransformerUnit[ + ThresholdSettings, AxisArray, AxisArray, ThresholdCrossingTransformer + ] ): SETTINGS = ThresholdSettings @@ -321,9 +357,7 @@ def threshold_crossing( align_on_peak: bool = False, return_peak_val: bool = False, auto_scale_tau: float = 0.0, -) -> typing.Generator[ - list[EventMessage] | AxisArray, AxisArray, None -]: +) -> typing.Generator[list[EventMessage] | AxisArray, AxisArray, None]: """ Detect threshold crossing events. @@ -352,9 +386,9 @@ def threshold_crossing( return_peak_val=return_peak_val, auto_scale_tau=auto_scale_tau, ) - + msg_out = AxisArray(np.array([]), dims=[""]) - + while True: msg_in = yield msg_out msg_out = transformer(msg_in) From 70732094853526af7bbe5dc468be197fad8180cc Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 18 Apr 2025 15:29:47 -0400 Subject: [PATCH 04/13] Eliminate unused template in ThresholdCrossingState --- src/ezmsg/event/peak.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ezmsg/event/peak.py b/src/ezmsg/event/peak.py index 0ecff79..448fbba 100644 --- a/src/ezmsg/event/peak.py +++ b/src/ezmsg/event/peak.py @@ -66,9 +66,6 @@ class ThresholdCrossingState: elapsed: npt.NDArray | None = None """Track number of samples since last event for each feature. Used especially for refractory period.""" - template: AxisArray = None - """Template for the output message to reduce memory allocation. TODO: Maybe unnecessary.""" - class ThresholdCrossingTransformer( BaseStatefulTransformer[ @@ -333,7 +330,7 @@ def _process(self, message: AxisArray) -> AxisArray: message, data=result, axes={ - **self._state.template.axes, + **message.axes, "time": replace(message.axes["time"], offset=t0), }, ) From 5bb072d2513ed13ade617b425dfda0b10e8074c0 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 16 May 2025 01:35:14 -0400 Subject: [PATCH 05/13] Fix list-vs-tuple bug in ThresholdCrossingTransformer --- src/ezmsg/event/peak.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ezmsg/event/peak.py b/src/ezmsg/event/peak.py index 448fbba..e50036e 100644 --- a/src/ezmsg/event/peak.py +++ b/src/ezmsg/event/peak.py @@ -294,7 +294,7 @@ def _process(self, message: AxisArray) -> AxisArray: if self.settings.return_peak_val: # We need the actual peak value. peak_inds_tuple = ( - cross_idx + tuple(cross_idx) if self.settings.align_on_peak else tuple(cross_idx[:-1]) + (cross_idx[-1] + pk_offset,) ) From 5d1aa60f795a66e0ab98474db723257042683103 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 16 May 2025 01:35:51 -0400 Subject: [PATCH 06/13] ezmsg-sigproc base classes now in dev branch --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cd5e10c..25c3d36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,4 +36,4 @@ version-file = "src/ezmsg/event/__version__.py" packages = ["src/ezmsg"] [tool.uv.sources] -ezmsg-sigproc = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git", branch = "70-use-protocols-for-axisarray-transformers" } +ezmsg-sigproc = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git", branch = "dev" } From e2fb57f0775835173c74f6edd60aa1beae661233 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Tue, 20 May 2025 14:50:29 -0400 Subject: [PATCH 07/13] tracking ezmsg-sigproc in pypi --- pyproject.toml | 3 - uv.lock | 463 +++++++++++++++++++++++++++++-------------------- 2 files changed, 272 insertions(+), 194 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 25c3d36..e5677f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,3 @@ version-file = "src/ezmsg/event/__version__.py" [tool.hatch.build.targets.wheel] packages = ["src/ezmsg"] - -[tool.uv.sources] -ezmsg-sigproc = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git", branch = "dev" } diff --git a/uv.lock b/uv.lock index 7d7eb53..90b52fd 100644 --- a/uv.lock +++ b/uv.lock @@ -1,20 +1,25 @@ version = 1 requires-python = ">=3.10.15" -resolution-markers = [ - "python_full_version < '3.12'", - "python_full_version >= '3.12'", + +[[package]] +name = "array-api-compat" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/bd/9fa5c7c5621698d5632cc852a79fbbdc28024462c9396698e5fdcb395f37/array_api_compat-1.12.0.tar.gz", hash = "sha256:585bc615f650de53ac24b7c012baecfcdd810f50df3573be47e6dd9fa20df974", size = 99883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl", hash = "sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b", size = 58156 }, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] [[package]] @@ -28,28 +33,31 @@ wheels = [ [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674 }, ] [[package]] name = "ezmsg" -version = "3.6.0" +version = "3.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/fa/b4dffddc08f608f5d69de7692a5c56a6f82c4f8cd0555628fe3627344d6e/ezmsg-3.6.0.tar.gz", hash = "sha256:978d8c8934fbda9feb236e1409d47d99c0631cd3e886469ceab6180f0fe3630a", size = 141506 } +sdist = { url = "https://files.pythonhosted.org/packages/21/5d/3c1940cf4a8e8df7bd1b2582625eb0956973420f43f25ed44f4704786e78/ezmsg-3.6.1.tar.gz", hash = "sha256:c0488bea6f019c5bf1c0560957bff43c17c15ea33b759aaeb26a4c6628690ba6", size = 142634 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/22/02a78c0dd48a44ba4a57394d0917e1fe1223f5f1c81b93c5d3c9d9c9f6bf/ezmsg-3.6.0-py3-none-any.whl", hash = "sha256:adda57e28018474fdd601874d04a1a3e598422190f8ce31449b8c75525f1236d", size = 69895 }, + { url = "https://files.pythonhosted.org/packages/13/3b/da01f380ac231baea89f466c070bec8f2291c58d74d602b2f36c99fb4505/ezmsg-3.6.1-py3-none-any.whl", hash = "sha256:b4b991d4dfb91f99e676ac0610767421aab84062366caa4755fe1fb2dabd7da1", size = 71018 }, ] [[package]] name = "ezmsg-event" -version = "0.2.2.dev7+g66e94d2.d20250403" +version = "0.2.4.dev6+g5d1aa60.d20250520" source = { editable = "." } dependencies = [ { name = "ezmsg-sigproc" }, @@ -68,7 +76,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "ezmsg-sigproc", git = "https://github.com/ezmsg-org/ezmsg-sigproc.git?branch=70-use-protocols-for-axisarray-transformers" }, + { name = "ezmsg-sigproc" }, { name = "numpy", specifier = ">=1.26" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.3.3" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.8" }, @@ -78,9 +86,10 @@ requires-dist = [ [[package]] name = "ezmsg-sigproc" -version = "1.8.2.dev113+g8c59dab" -source = { git = "https://github.com/ezmsg-org/ezmsg-sigproc.git?branch=70-use-protocols-for-axisarray-transformers#8c59dabbaeb7b06e89bd6a314ef637f976a8fc77" } +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "array-api-compat" }, { name = "ezmsg" }, { name = "numba" }, { name = "numpy" }, @@ -88,14 +97,18 @@ dependencies = [ { name = "scipy" }, { name = "sparse" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/91/fc/10ae3c539262d3b9a1f234652107833350f6e6be8799294cbcc8e41d0b5a/ezmsg_sigproc-2.0.0.tar.gz", hash = "sha256:c97a2b864ea30cfd91fd11eef8114cf47c94954b29733cfc992c3cf993e8bbd9", size = 160726 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/74/a8b0aca22b158a226e8377ab5be9b54e00cf393906788dccb22455f9b0be/ezmsg_sigproc-2.0.0-py3-none-any.whl", hash = "sha256:375658ecbe2f0a42606b70a7d7e740e76fb0f82fdfa949309bdb195a6609299a", size = 83991 }, +] [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] @@ -149,104 +162,128 @@ wheels = [ [[package]] name = "numba" -version = "0.61.0" +version = "0.61.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/88/c13a935f200fda51384411e49840a8e7f70c9cb1ee8d809dd0f2477cf7ef/numba-0.61.0.tar.gz", hash = "sha256:888d2e89b8160899e19591467e8fdd4970e07606e1fbc248f239c89818d5f925", size = 2816484 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/97/8568a025b9ab8b4d53491e70d4206d5f3fc71fbe94f3097058e01ad8e7ff/numba-0.61.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9cab9783a700fa428b1a54d65295122bc03b3de1d01fb819a6b9dbbddfdb8c43", size = 2769008 }, - { url = "https://files.pythonhosted.org/packages/8c/ab/a88c20755f66543ee01c85c98b866595b92e1bd0ed80565a4889e22929a8/numba-0.61.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46c5ae094fb3706f5adf9021bfb7fc11e44818d61afee695cdee4eadfed45e98", size = 2771815 }, - { url = "https://files.pythonhosted.org/packages/ae/f4/b357913089ecec1a9ddc6adc04090396928f36a484a5ab9e71b24ddba4cd/numba-0.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6fb74e81aa78a2303e30593d8331327dfc0d2522b5db05ac967556a26db3ef87", size = 3820233 }, - { url = "https://files.pythonhosted.org/packages/ea/60/0e21bcf3baaf10e39d48cd224618e46a6b75d3394f465c37ce57bf98cbfa/numba-0.61.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0ebbd4827091384ab8c4615ba1b3ca8bc639a3a000157d9c37ba85d34cd0da1b", size = 3514707 }, - { url = "https://files.pythonhosted.org/packages/a0/08/45c136ab59e6b11e61ce15a0d17ef03fd89eaccb0db05ad67912aaf5218a/numba-0.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:43aa4d7d10c542d3c78106b8481e0cbaaec788c39ee8e3d7901682748ffdf0b4", size = 2827753 }, - { url = "https://files.pythonhosted.org/packages/63/8f/f983a7c859ccad73d3cc3f86fbba94f16e137cd1ee464631d61b624363b2/numba-0.61.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:bf64c2d0f3d161af603de3825172fb83c2600bcb1d53ae8ea568d4c53ba6ac08", size = 2768960 }, - { url = "https://files.pythonhosted.org/packages/be/1b/c33dc847d475d5b647b4ad5aefc38df7a72283763f4cda47745050375a81/numba-0.61.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de5aa7904741425f28e1028b85850b31f0a245e9eb4f7c38507fb893283a066c", size = 2771862 }, - { url = "https://files.pythonhosted.org/packages/14/91/18b9f64b34ff318a14d072251480547f89ebfb864b2b7168e5dc5f64f502/numba-0.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21c2fe25019267a608e2710a6a947f557486b4b0478b02e45a81cf606a05a7d4", size = 3825411 }, - { url = "https://files.pythonhosted.org/packages/f2/97/1a38030c2a331e273ace1de2b61988e33d80878fda8a5eedee0cd78399d3/numba-0.61.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:74250b26ed6a1428763e774dc5b2d4e70d93f73795635b5412b8346a4d054574", size = 3519604 }, - { url = "https://files.pythonhosted.org/packages/df/a7/56f547de8fc197963f238fd62beb5f1d2cace047602d0577956bf6840970/numba-0.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:b72bbc8708e98b3741ad0c63f9929c47b623cc4ee86e17030a4f3e301e8401ac", size = 2827642 }, - { url = "https://files.pythonhosted.org/packages/63/c9/c61881e7f2e253e745209f078bbd428ce23b6cf901f7d93afe166720ff95/numba-0.61.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:152146ecdbb8d8176f294e9f755411e6f270103a11c3ff50cecc413f794e52c8", size = 2769758 }, - { url = "https://files.pythonhosted.org/packages/e1/28/ddec0147a4933f86ceaca580aa9bb767d5632ecdb1ece6cfb3eab4ac78e5/numba-0.61.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5cafa6095716fcb081618c28a8d27bf7c001e09696f595b41836dec114be2905", size = 2772445 }, - { url = "https://files.pythonhosted.org/packages/18/74/6a9f0e6c76c088f8a6aa702eab31734068061dca5cc0f34e8bc1eb447de1/numba-0.61.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ffe9fe373ed30638d6e20a0269f817b2c75d447141f55a675bfcf2d1fe2e87fb", size = 3882115 }, - { url = "https://files.pythonhosted.org/packages/53/68/d7c31e53f08e6b4669c9b5a3cd7c5fb9097220c5ef388bc099ca8ab9749f/numba-0.61.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9f25f7fef0206d55c1cfb796ad833cbbc044e2884751e56e798351280038484c", size = 3573296 }, - { url = "https://files.pythonhosted.org/packages/94/4f/8357a99a14f331b865a42cb4756ae37da85599b9c95e01277ea10361e91a/numba-0.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:550d389573bc3b895e1ccb18289feea11d937011de4d278b09dc7ed585d1cdcb", size = 2828077 }, - { url = "https://files.pythonhosted.org/packages/3b/54/71fba18e4af5619f1ea8175ee92e82dd8e220bd6feb8c0153c6b814c8a60/numba-0.61.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:b96fafbdcf6f69b69855273e988696aae4974115a815f6818fef4af7afa1f6b8", size = 2768024 }, - { url = "https://files.pythonhosted.org/packages/39/76/2448b43d08e904aad1b1b9cd12835b19411e84a81aa9192f83642a5e0afd/numba-0.61.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f6c452dca1de8e60e593f7066df052dd8da09b243566ecd26d2b796e5d3087d", size = 2769541 }, - { url = "https://files.pythonhosted.org/packages/32/8f/4bb2374247ab988c9eac587b304b2947a36d605b9bb9ba4bf06e955c17d3/numba-0.61.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44240e694d4aa321430c97b21453e46014fe6c7b8b7d932afa7f6a88cc5d7e5e", size = 3890102 }, - { url = "https://files.pythonhosted.org/packages/ab/bc/dc2d03555289ae5263f65c01d45eb186ce347585c191daf0e60021d5ed39/numba-0.61.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:764f0e47004f126f58c3b28e0a02374c420a9d15157b90806d68590f5c20cc89", size = 3580239 }, - { url = "https://files.pythonhosted.org/packages/61/08/71247ce560d2c222d9ca705c7d3547fc4069b96fc85d71aabeb890befe9f/numba-0.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:074cd38c5b1f9c65a4319d1f3928165f48975ef0537ad43385b2bd908e6e2e35", size = 2828035 }, + { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663 }, + { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344 }, + { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054 }, + { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531 }, + { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612 }, + { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, + { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, + { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, + { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, + { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, + { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626 }, + { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287 }, + { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928 }, + { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115 }, + { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929 }, + { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785 }, + { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289 }, + { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918 }, + { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056 }, + { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846 }, ] [[package]] name = "numpy" -version = "2.0.2" +version = "2.2.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015 } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245 }, - { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540 }, - { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623 }, - { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774 }, - { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081 }, - { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451 }, - { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572 }, - { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722 }, - { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170 }, - { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558 }, - { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137 }, - { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552 }, - { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957 }, - { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573 }, - { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330 }, - { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895 }, - { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253 }, - { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074 }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640 }, - { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230 }, - { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803 }, - { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835 }, - { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499 }, - { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497 }, - { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158 }, - { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173 }, - { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174 }, - { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701 }, - { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313 }, - { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, ] [[package]] name = "packaging" -version = "24.2" +version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] [[package]] name = "pytest" -version = "8.3.3" +version = "8.3.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -256,137 +293,152 @@ dependencies = [ { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] [[package]] name = "pywavelets" -version = "1.7.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/0a/c235e7dd60d136b14cd8793c440e8d22e7880df5588162feb02d6d6118a3/pywavelets-1.7.0.tar.gz", hash = "sha256:b47250e5bb853e37db5db423bafc82847f4cde0ffdf7aebb06336a993bc174f6", size = 3934767 } +sdist = { url = "https://files.pythonhosted.org/packages/48/45/bfaaab38545a33a9f06c61211fc3bea2e23e8a8e00fedeb8e57feda722ff/pywavelets-1.8.0.tar.gz", hash = "sha256:f3800245754840adc143cbc29534a1b8fc4b8cff6e9d403326bd52b7bb5c35aa", size = 3935274 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/ef/ab21d4963ff9810e38194a934a45d92145a07b4e491e9e5d91cc5bf87401/pywavelets-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99156b461f914cafbe6ee3b511612a83e90061addbe1f2660f522e9841fbdc4", size = 4320477 }, - { url = "https://files.pythonhosted.org/packages/19/3f/931e03737d6a216b1b390ef9a47191f8dd977484efdde2bca5b87ca5c3b3/pywavelets-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:953b877c43f1fa53204b1b0eedd04efa6739378a873e79fa34ee5296d47a9ca1", size = 4289715 }, - { url = "https://files.pythonhosted.org/packages/1d/47/32324220b427b07bfcdfbd88a37ffdacdba8423b219ca4ebd85043c11b91/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fc5e0e592678e43c18dd169b0d8471e9a5ffb5eb7ff4bdc8f447c882f78aa8b", size = 4446534 }, - { url = "https://files.pythonhosted.org/packages/d6/60/056374044b41f6e2ccca8239d1c9e422e3906f54c7cd08d55a19d98e2a28/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469a7e73f5ab1d59b52a525a89a4a280426d1ba08eb081261f8bc6775f101d6", size = 4481597 }, - { url = "https://files.pythonhosted.org/packages/0b/16/137ff09a8295ca9beefdd89f7afc97647963f08a62016696d500781cdf98/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3740c84de06fab5081c8f08994f12f9ee94dc2eb4d818eaeace3bdb0b838e2fc", size = 4473799 }, - { url = "https://files.pythonhosted.org/packages/28/49/a16de31134a4161eb017b9b330a5f334bd62edabb70def6b8e17d4247a5e/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a550fdbe134040c04f1bb46cfe13a1a903c5dce13090b681106e4db99feba81", size = 4516569 }, - { url = "https://files.pythonhosted.org/packages/45/54/85649111f4ccadf45edbec3bee4ab0380b38cb2bf0067214b14800e3b873/pywavelets-1.7.0-cp310-cp310-win32.whl", hash = "sha256:d5fc7fbad53379c30b2c9d46c235130a4b96e0597653e32e7680a310da06bd07", size = 4178657 }, - { url = "https://files.pythonhosted.org/packages/ce/d1/91298a86da6680aad9064b0b18475fd224ca47ff6646823a920addcabfff/pywavelets-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b37212b7524438f694cb619cc4a0a3dc54ad77b63a18d0e8e6364f525fffd91", size = 4250753 }, - { url = "https://files.pythonhosted.org/packages/df/30/4ab2547017bd6af02d916ce87e7fc55d08dbfe466b0440bea79a71b16ae4/pywavelets-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:392553248aed33eac6f38647acacdba94dd6a8f283319c2d9852de7a871d6d0f", size = 4315611 }, - { url = "https://files.pythonhosted.org/packages/1e/77/b2c9976cbc7c378c72a8e7cff08a2ed49e26ef58e1a8fcaa523aadae5419/pywavelets-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae3ae86ba69d75327b1c5cd368138fb9329bc7eb7418d6b0ce9504c5070974ef", size = 4286338 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/e65c7d3a8e7e7b79ee77499fc1637c65c738c458a7f6469433b6050935c4/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81d2486e4f9b65f7c6cab252f3e706c8e8e72bbd0311f72c1a5ec56c947d257", size = 4446349 }, - { url = "https://files.pythonhosted.org/packages/45/e9/3a047a49a6fd0917ba3e436ff93825f8cecc3cb55720d798bc71433a5433/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05dc2930cf9b7f61a24b2fe52b18e9d6046012fc46fc360355222781a95a1378", size = 4482899 }, - { url = "https://files.pythonhosted.org/packages/05/e8/63037524d8cc82f0fee1b744f41eaee9a8bd93c80de9b437a179fb258f0a/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8565de589f42283bca17ddca298f1188a26ef8ee75cadc4a4744cadf5a79cfdf", size = 4486261 }, - { url = "https://files.pythonhosted.org/packages/9f/70/1e83a42a4084de2f3440a7af79adec69e52e679b13eb0ff8d787af330037/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8bdab6b1781f01c087c54782d656a4fc1df77796c241f122445adcbb24892839", size = 4516539 }, - { url = "https://files.pythonhosted.org/packages/e7/14/1c197e0f2f657fd18c6db0281377ac8928abf232ab954a44efce82048670/pywavelets-1.7.0-cp311-cp311-win32.whl", hash = "sha256:c7b47d94aefe6e03085f4d9ce74f6133741164d470ac2839af9906686c6c2ed1", size = 4176201 }, - { url = "https://files.pythonhosted.org/packages/81/49/ba85ea2acf08a113a17da37e6b8cdaa432ad3946fe6cc480fe98f20b5231/pywavelets-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e3c8c0fa44f4de7bf05c5d12883b227aaf6dcf46deb3f6f5a9fa5bb79c33283", size = 4251738 }, - { url = "https://files.pythonhosted.org/packages/72/48/b6dbb1124bfa15e2d16dc2c199562d0a9c3d7e7333348b29d05f68cdf146/pywavelets-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:badb7dc70ecd8042ddd98fdd41803d5e5b28bf7c90910bb1751906812326ab54", size = 4317328 }, - { url = "https://files.pythonhosted.org/packages/9c/cf/b5b1706d7054d792bdf678c894f4ad8f8cdaa789f82b7eaa48b80aa45ba0/pywavelets-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74e838e0225783f37ae346e60a9f783b4a31adc5731b9cb6d687ee5c93bd87b7", size = 4287220 }, - { url = "https://files.pythonhosted.org/packages/05/a3/90cad7bfbd765f39bcd96af3efdefcf6fd05a49b7e81fc281f1be7a8e637/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad14d8b5a412a621406276b8ae8ee1e369ba7a7f8e517fb87355bcb8106820f", size = 4420514 }, - { url = "https://files.pythonhosted.org/packages/53/b6/08d5ea524a5ed25e1f94fba428ac605f0f774bea4a8cf14dbdc7947a2bc5/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bd2611076f5d2c4ad940421bbb3c450b6a53d8ca24bde02662455dc67c70dac", size = 4453780 }, - { url = "https://files.pythonhosted.org/packages/f3/34/ad1502dc37295249000d3644c5bd183f5c063e9cebb3a37a9422121d77c1/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40ebb994b332d48db3b0564e3c335c4f8ba236283939f5167de099766cf16517", size = 4448531 }, - { url = "https://files.pythonhosted.org/packages/f5/52/8e756c9783e7e7c43058cc3e9e9633935206ac77ff13580d489669d84b98/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a8cc39901f09d82fc94007026f9aed63876e334ae043eb26caa601aee2551", size = 4477268 }, - { url = "https://files.pythonhosted.org/packages/ce/74/15942502ec146c0e06d3f62ebeeeb2cfa873b57413a44238171cc3658387/pywavelets-1.7.0-cp312-cp312-win32.whl", hash = "sha256:0cd599c78fc240cbadb63344d73912fc79e8dccbb0db8a8bd5143df400c3a519", size = 4171601 }, - { url = "https://files.pythonhosted.org/packages/d6/bf/dc8836f983876a43cb15791f0ff15dab6631f423ca6ba55c068d8764ddf8/pywavelets-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:29a912c074977db6adf3782dfbd414945805039b755d0c23979bc823f1b4e9c3", size = 4247115 }, - { url = "https://files.pythonhosted.org/packages/52/0f/daedf2516c22cdb3ef208de286e77ebbf69da1c08cca3e086ecec057c738/pywavelets-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6a322607b8c2985997ea45317d36cab58f0223ccf4c5b6540b612ed067d099ff", size = 4312598 }, - { url = "https://files.pythonhosted.org/packages/e9/68/eb5a02ec3ade3076af47a4236f744ec6859506036976b93072bbf47cc8a3/pywavelets-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f402424288178fd105a5cb76e1818649dc67e4a08d1b9974c8c7ef01dc5feb3", size = 4283781 }, - { url = "https://files.pythonhosted.org/packages/84/d0/3b839e6f05db4b6834fcc83f37e8bb6d7abdccfb8899000a2898c62d0c53/pywavelets-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ff81dd8288afdd5f2eae6c44f963152b41e14e2e5fc647b608c97bd6f8270fe", size = 4412092 }, - { url = "https://files.pythonhosted.org/packages/c0/3c/55137ea3b137b9e7a72822275f51214b91f3c368c9eb3ea671e1e3bb0786/pywavelets-1.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:259ccf233879cf0ed66052ffd174dcabe6314e92b53aa2de25f4ae50b08ea1e3", size = 4444608 }, - { url = "https://files.pythonhosted.org/packages/88/63/2fce3368cca2cc988723e6d48e68ce1056825675841fc1a9042629f8d1a9/pywavelets-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:105249d2bf824bddfb286e4e08934ff1e8829aa3077dab74ce3b2921a09caa43", size = 4445280 }, - { url = "https://files.pythonhosted.org/packages/5e/84/8d385d4a1e5ea79e166c3f65d6a58c76e5fa63106fa29c7c2c9deb03ddbb/pywavelets-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eac60fdb28bd421f72eb18824bd2e4f36c3dab0d7f4802ebfe4bbf68744a524a", size = 4478438 }, - { url = "https://files.pythonhosted.org/packages/2d/f0/35ae951344e3a5a7e6824aff9476032f4f2ebab3ef050c4d2d91321a7669/pywavelets-1.7.0-cp313-cp313-win32.whl", hash = "sha256:097bd03ee1b687942fa2f82ad0d35849879eef0ac82fc6f757d6ef881c53db6d", size = 4170479 }, - { url = "https://files.pythonhosted.org/packages/19/11/e0b349efd034a40cc086e166edbed5c9fa59f27f298b42be4fb6004a82dc/pywavelets-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:71918b973950c013c17ff28c3fc2958dfff68ec767ef60cd927a3ac4ff5a7345", size = 4246094 }, - { url = "https://files.pythonhosted.org/packages/f9/39/8e39c95a7d99e731ab5bcb43ba40778b091a740178000823b56e19d90dcb/pywavelets-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b7e1a212269d3e48318388744684b702c6a649a70758e35e9a88614316e9b91", size = 4326062 }, - { url = "https://files.pythonhosted.org/packages/8a/74/036d4a80a48d847161fb3f967239fcd49901809fc93cd25eab3a051f5300/pywavelets-1.7.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d8c641aa26e040d62166cbe2052dd3cd575e3e0c78c00c52770be6d7dd386b", size = 4441602 }, - { url = "https://files.pythonhosted.org/packages/d7/76/a5ff1f1afe1e84c961c7e4b541684c2515ba4c529359f0ee2d9305cb9cd9/pywavelets-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0611ffb6ceeee1b677bd224e657895193eec03ad39538f5263ce61db465f836", size = 4466593 }, + { url = "https://files.pythonhosted.org/packages/65/7e/c5e398f25c70558ca195dd4144ee004666401f6167084c1e76059d7e68d8/pywavelets-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5c86fcb203c8e61d1f3d4afbfc08d626c64e4e3708207315577264c724632bf", size = 4323291 }, + { url = "https://files.pythonhosted.org/packages/d0/d7/2fc8067c3520ce25f7632b0f47b89d1b75653cab804a42700e95126f2679/pywavelets-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafb5fa126277e1690c3d6329287122fc08e4d25a262ce126e3d81b1f5709308", size = 4291864 }, + { url = "https://files.pythonhosted.org/packages/2f/17/a868aa26e45c104613d9069f9d8ec0123687cb6945062d274f20a3992436/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec23dfe6d5a3f4312b12456b8c546aa90a11c1138e425a885987505f0658ae0", size = 4447532 }, + { url = "https://files.pythonhosted.org/packages/53/7a/7f5889a57177e2b1182080fc2c52236d1e03a0fad5e0b3d7c5312070c0be/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:880a0197e9fa108939af50a95e97c1bf9b7d3e148e0fad92ea60a9ed8c8947c0", size = 4487695 }, + { url = "https://files.pythonhosted.org/packages/f9/e6/04d76d93c158919ef0d8e1d40d1d453168305031eca6733fdc844f7cbb07/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bfa833d08b60d0bf53a7939fbbf3d98015dd34efe89cbe4e53ced880d085fc1", size = 4473752 }, + { url = "https://files.pythonhosted.org/packages/3b/a7/42ea5bbb6055abd312e45b27d931200fd6eed5414a87ec5d62020a4c651b/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e10c3fc7f4a796e94da4bca9871be2186a7bb7a3b3536a0ca9376d84263140f0", size = 4504191 }, + { url = "https://files.pythonhosted.org/packages/8c/7e/52df87a9e77adfb12c1b8be79a2053f2eb4c2507dec96ebfd2333b15ff03/pywavelets-1.8.0-cp310-cp310-win32.whl", hash = "sha256:31baf4be6940fde72cc85663154360857ac1b93c251822deaf72bb804da95031", size = 4143794 }, + { url = "https://files.pythonhosted.org/packages/01/e2/06e08230c26049740b2773952fbb12cc7186e5df655a73b1c30ba493e864/pywavelets-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:560c39f1ff8cb37f8b8ea4b7b6eb8a14f6926c11f5cf8c09f013a58f895ed5bc", size = 4214262 }, + { url = "https://files.pythonhosted.org/packages/6c/8a/9f8e794120b55caa1c4ae8d72696111bc408251615f351a8e54a5d8c4d4e/pywavelets-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e8dd5be4faed994581a8a4b3c0169be20567a9346e523f0b57f903c8f6722bce", size = 4324170 }, + { url = "https://files.pythonhosted.org/packages/3e/b8/f6246be5c78e9fa73fcbba9ab4cbfe0d4dcb79ea5491f28d673a53466134/pywavelets-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d8abaf7c120b151ef309c9ff57e0a44ba9febf49045056dbc1577526ecec6c8", size = 4294254 }, + { url = "https://files.pythonhosted.org/packages/2c/dc/ba1f212e9b43117ed28e0fd092e72e817790427400f88937ea742d260153/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b43a4c58707b1e8d941bec7f1d83e67c482278575ff0db3189d5c0dfae23a57", size = 4447178 }, + { url = "https://files.pythonhosted.org/packages/58/10/e59c162a11d2fedb4454abbf7b74a52390aba5edc9605bf829bfa8708dac/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1aad0b97714e3079a2bfe48e4fb8ccd60778d0427e9ee5e0a9ff922e6c61e4", size = 4486799 }, + { url = "https://files.pythonhosted.org/packages/03/ee/90c3d0a0a3bda74e6e097e4c06bff9446ff2a4c90b8617aaf4902c46966b/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0e1db96dcf3ce08156859df8b359e9ff66fa15061a1b90e70e020bf4cd077a0", size = 4486403 }, + { url = "https://files.pythonhosted.org/packages/05/54/58b87f8b636a9f044f3f9814d2ec696cf25f3b33af97c11811f13c364085/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e62c8fb52ab0e8ff212fff9acae681a8f12d68b76c36fe24cc48809d5b6825ba", size = 4515011 }, + { url = "https://files.pythonhosted.org/packages/a1/d0/f755cee11ff20668114942d0e777e2b502a8e4665e1fdb2553b587aac637/pywavelets-1.8.0-cp311-cp311-win32.whl", hash = "sha256:bf327528d10de471b04bb725c4e10677fac5a49e13d41bf0d0b3a1f6d7097abf", size = 4139934 }, + { url = "https://files.pythonhosted.org/packages/7b/0b/f4b92d4f00565280ea3e62a8e3dc81a667d67ed7bd59232f2f18d55f9aff/pywavelets-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3814d354dd109e244ffaac3d480d29a5202212fe24570c920268237c8d276f95", size = 4214321 }, + { url = "https://files.pythonhosted.org/packages/2d/8b/4870f11559307416470158a5aa6f61e5c2a910f1645a7a836ffae580b7ad/pywavelets-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3f431c9e2aff1a2240765eff5e804975d0fcc24c82d6f3d4271243f228e5963b", size = 4326187 }, + { url = "https://files.pythonhosted.org/packages/c4/35/66835d889fd7fbf3119c7a9bd9d9bd567fc0bb603dfba408e9226db7cb44/pywavelets-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e39b0e2314e928cb850ee89b9042733a10ea044176a495a54dc84d2c98407a51", size = 4295428 }, + { url = "https://files.pythonhosted.org/packages/63/1c/42e5130226538c70d4bbbaee00eb1bc06ec3287f7ea43d5fcf85bfc761ce/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cae701117f5c7244b7c8d48b9e92a0289637cdc02a9c205e8be83361f0c11fae", size = 4421259 }, + { url = "https://files.pythonhosted.org/packages/6f/c5/1ce93657432e22a5debc21e8b52ec6980f819ecb7fa727bb86744224d967/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649936baee933e80083788e0adc4d8bc2da7cdd8b10464d3b113475be2cc5308", size = 4447650 }, + { url = "https://files.pythonhosted.org/packages/b9/d6/b54ef30daca71824f811f9d2322a978b0a58d27674b8e3af6520f67e9ec6/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8c68e9d072c536bc646e8bdce443bb1826eeb9aa21b2cb2479a43954dea692a3", size = 4448538 }, + { url = "https://files.pythonhosted.org/packages/ce/8c/1688b790e55674667ad644262f174405c2c9873cb13e773432e78b1b33e4/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63f67fa2ee1610445de64f746fb9c1df31980ad13d896ea2331fc3755f49b3ae", size = 4485228 }, + { url = "https://files.pythonhosted.org/packages/c9/9b/69de31c3b663dadd76d1da6bf8af68d8cefff55df8e880fe96a94bb8c9ac/pywavelets-1.8.0-cp312-cp312-win32.whl", hash = "sha256:4b3c2ab669c91e3474fd63294355487b7dd23f0b51d32f811327ddf3546f4f3d", size = 4134850 }, + { url = "https://files.pythonhosted.org/packages/1c/88/9e2aa9d5fde08bfc0fb18ffb1b5307c1ed49c24930b4147e5f48571a7251/pywavelets-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1", size = 4210786 }, + { url = "https://files.pythonhosted.org/packages/94/73/7ff347d77c6bda11330565050c3346c54bc210086380abeb84e402c1c9cd/pywavelets-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:441ba45c8dff8c6916dbe706958d0d7f91da675695ca0c0d75e483f6f52d0a12", size = 4321474 }, + { url = "https://files.pythonhosted.org/packages/b0/70/c58937ebbca1aba3475ca5ee63c7bcebf09f3c93891ae5942eaec7e95707/pywavelets-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:24bb282bab09349d9d128ed0536fa50fff5c2147891971a69c2c36155dfeeeac", size = 4291502 }, + { url = "https://files.pythonhosted.org/packages/da/55/87b4ad6128b2e85985908e958e856e0b680cdcc03cc490e2cc995164b13a/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426ff3799446cb4da1db04c2084e6e58edfe24225596805665fd39c14f53dece", size = 4412669 }, + { url = "https://files.pythonhosted.org/packages/bf/1a/bfca9eab23bd7b27843b0ce95c47796033a7b2c93048315f5fc5d6ac6428/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0607a9c085b8285bc0d04e33d461a6c80f8c325389221ffb1a45141861138e", size = 4454604 }, + { url = "https://files.pythonhosted.org/packages/c3/23/9ce38829f57159e812c469c4f9d7b5a16c1ba922c1802985e8c504468206/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d31c36a39110e8fcc7b1a4a11cfed7d22b610c285d3e7f4fe73ec777aa49fa39", size = 4445507 }, + { url = "https://files.pythonhosted.org/packages/e5/d2/e78a976b0600a6ef7a70f4430122d6ad11b3e1cbda3c8b3565661d094678/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa7c68ed1e5bab23b1bafe60ccbcf709b878652d03de59e961baefa5210fcd0a", size = 4479078 }, + { url = "https://files.pythonhosted.org/packages/85/4d/1c4f870010368f3aeb0bdd72929376a1988e4a122e76545bd8c56e549c96/pywavelets-1.8.0-cp313-cp313-win32.whl", hash = "sha256:2c6b359b55d713ef683e9da1529181b865a80d759881ceb9adc1c5742e4da4d8", size = 4133763 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/0a709a5732e6cf9297fc87bf545cb879997cde204115f8c0cbc296c5bdd3/pywavelets-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5", size = 4209548 }, + { url = "https://files.pythonhosted.org/packages/de/2a/4cac0bba67d3bc0ad697d0680539864db0a6964c7ad953d8d9d887f360b3/pywavelets-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:2e1c79784bebeafd3715c1bea6621daa2e2e6ed37b687719322e2078fb35bb70", size = 4335183 }, + { url = "https://files.pythonhosted.org/packages/58/d1/3abe4cf34a35b09ad847f0e9a85f340c1988611222926d295fa8710659e7/pywavelets-1.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f489380c95013cc8fb3ef338f6d8c1a907125db453cc4dc739e2cca06fcd8b6", size = 4454723 }, + { url = "https://files.pythonhosted.org/packages/d5/62/f05dd191232ae94e0b48509bb0ee65c9d45abf5e8f3612b09fd309b41384/pywavelets-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:06786201a91b5e74540f4f3c115c49a29190de2eb424823abbd3a1fd75ea3e28", size = 4472192 }, + { url = "https://files.pythonhosted.org/packages/20/6a/257c95ad1e0fd395cbccd4ffec0d01cc9b51a3bb91e67d8fa10ffebc9c72/pywavelets-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:f2877fb7b58c94211257dcf364b204d6ed259146fc87d5a90bf9d93c97af6226", size = 4183968 }, + { url = "https://files.pythonhosted.org/packages/6c/58/7179fd6f87153f2e339171e8cfe9bf901398a89045eefd7a3911bb9b47ad/pywavelets-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ec5d723c3335ff8aa630fd4b14097077f12cc02893c91cafd60dd7b1730e780f", size = 4265431 }, ] [[package]] name = "rich" -version = "13.9.4" +version = "14.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, ] [[package]] name = "ruff" -version = "0.8.0" +version = "0.11.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/d6/a2373f3ba7180ddb44420d2a9d1f1510e1a4d162b3d27282bedcb09c8da9/ruff-0.8.0.tar.gz", hash = "sha256:a7ccfe6331bf8c8dad715753e157457faf7351c2b69f62f32c165c2dbcbacd44", size = 3276537 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/4a3c5a97faaae6b428b336dcca81d03ad04779f8072c267ad2bd860126bf/ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6", size = 4165632 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/77/e889ee3ce7fd8baa3ed1b77a03b9fb8ec1be68be1418261522fd6a5405e0/ruff-0.8.0-py3-none-linux_armv6l.whl", hash = "sha256:fcb1bf2cc6706adae9d79c8d86478677e3bbd4ced796ccad106fd4776d395fea", size = 10518283 }, - { url = "https://files.pythonhosted.org/packages/da/c8/0a47de01edf19fb22f5f9b7964f46a68d0bdff20144d134556ffd1ba9154/ruff-0.8.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:295bb4c02d58ff2ef4378a1870c20af30723013f441c9d1637a008baaf928c8b", size = 10317691 }, - { url = "https://files.pythonhosted.org/packages/41/17/9885e4a0eeae07abd2a4ebabc3246f556719f24efa477ba2739146c4635a/ruff-0.8.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7b1f1c76b47c18fa92ee78b60d2d20d7e866c55ee603e7d19c1e991fad933a9a", size = 9940999 }, - { url = "https://files.pythonhosted.org/packages/3e/cd/46b6f7043597eb318b5f5482c8ae8f5491cccce771e85f59d23106f2d179/ruff-0.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb0d4f250a7711b67ad513fde67e8870109e5ce590a801c3722580fe98c33a99", size = 10772437 }, - { url = "https://files.pythonhosted.org/packages/5d/87/afc95aeb8bc78b1d8a3461717a4419c05aa8aa943d4c9cbd441630f85584/ruff-0.8.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e55cce9aa93c5d0d4e3937e47b169035c7e91c8655b0974e61bb79cf398d49c", size = 10299156 }, - { url = "https://files.pythonhosted.org/packages/65/fa/04c647bb809c4d65e8eae1ed1c654d9481b21dd942e743cd33511687b9f9/ruff-0.8.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f4cd64916d8e732ce6b87f3f5296a8942d285bbbc161acee7fe561134af64f9", size = 11325819 }, - { url = "https://files.pythonhosted.org/packages/90/26/7dad6e7d833d391a8a1afe4ee70ca6f36c4a297d3cca83ef10e83e9aacf3/ruff-0.8.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c5c1466be2a2ebdf7c5450dd5d980cc87c8ba6976fb82582fea18823da6fa362", size = 12023927 }, - { url = "https://files.pythonhosted.org/packages/24/a0/be5296dda6428ba8a13bda8d09fbc0e14c810b485478733886e61597ae2b/ruff-0.8.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2dabfd05b96b7b8f2da00d53c514eea842bff83e41e1cceb08ae1966254a51df", size = 11589702 }, - { url = "https://files.pythonhosted.org/packages/26/3f/7602eb11d2886db545834182a9dbe500b8211fcbc9b4064bf9d358bbbbb4/ruff-0.8.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:facebdfe5a5af6b1588a1d26d170635ead6892d0e314477e80256ef4a8470cf3", size = 12782936 }, - { url = "https://files.pythonhosted.org/packages/4c/5d/083181bdec4ec92a431c1291d3fff65eef3ded630a4b55eb735000ef5f3b/ruff-0.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a8e86bae0dbd749c815211ca11e3a7bd559b9710746c559ed63106d382bd9c", size = 11138488 }, - { url = "https://files.pythonhosted.org/packages/b7/23/c12cdef58413cee2436d6a177aa06f7a366ebbca916cf10820706f632459/ruff-0.8.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:85e654f0ded7befe2d61eeaf3d3b1e4ef3894469cd664ffa85006c7720f1e4a2", size = 10744474 }, - { url = "https://files.pythonhosted.org/packages/29/61/a12f3b81520083cd7c5caa24ba61bb99fd1060256482eff0ef04cc5ccd1b/ruff-0.8.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:83a55679c4cb449fa527b8497cadf54f076603cc36779b2170b24f704171ce70", size = 10369029 }, - { url = "https://files.pythonhosted.org/packages/08/2a/c013f4f3e4a54596c369cee74c24870ed1d534f31a35504908b1fc97017a/ruff-0.8.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:812e2052121634cf13cd6fddf0c1871d0ead1aad40a1a258753c04c18bb71bbd", size = 10867481 }, - { url = "https://files.pythonhosted.org/packages/d5/f7/685b1e1d42a3e94ceb25eab23c70bdd8c0ab66a43121ef83fe6db5a58756/ruff-0.8.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:780d5d8523c04202184405e60c98d7595bdb498c3c6abba3b6d4cdf2ca2af426", size = 11237117 }, - { url = "https://files.pythonhosted.org/packages/03/20/401132c0908e8837625e3b7e32df9962e7cd681a4df1e16a10e2a5b4ecda/ruff-0.8.0-py3-none-win32.whl", hash = "sha256:5fdb6efecc3eb60bba5819679466471fd7d13c53487df7248d6e27146e985468", size = 8783511 }, - { url = "https://files.pythonhosted.org/packages/1d/5c/4d800fca7854f62ad77f2c0d99b4b585f03e2d87a6ec1ecea85543a14a3c/ruff-0.8.0-py3-none-win_amd64.whl", hash = "sha256:582891c57b96228d146725975fbb942e1f30a0c4ba19722e692ca3eb25cc9b4f", size = 9559876 }, - { url = "https://files.pythonhosted.org/packages/5b/bc/cc8a6a5ca4960b226dc15dd8fb511dd11f2014ff89d325c0b9b9faa9871f/ruff-0.8.0-py3-none-win_arm64.whl", hash = "sha256:ba93e6294e9a737cd726b74b09a6972e36bb511f9a102f1d9a7e1ce94dd206a6", size = 8939733 }, + { url = "https://files.pythonhosted.org/packages/2f/9f/596c628f8824a2ce4cd12b0f0b4c0629a62dfffc5d0f742c19a1d71be108/ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58", size = 10316243 }, + { url = "https://files.pythonhosted.org/packages/3c/38/c1e0b77ab58b426f8c332c1d1d3432d9fc9a9ea622806e208220cb133c9e/ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed", size = 11083636 }, + { url = "https://files.pythonhosted.org/packages/23/41/b75e15961d6047d7fe1b13886e56e8413be8467a4e1be0a07f3b303cd65a/ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca", size = 10441624 }, + { url = "https://files.pythonhosted.org/packages/b6/2c/e396b6703f131406db1811ea3d746f29d91b41bbd43ad572fea30da1435d/ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2", size = 10624358 }, + { url = "https://files.pythonhosted.org/packages/bd/8c/ee6cca8bdaf0f9a3704796022851a33cd37d1340bceaf4f6e991eb164e2e/ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5", size = 10176850 }, + { url = "https://files.pythonhosted.org/packages/e9/ce/4e27e131a434321b3b7c66512c3ee7505b446eb1c8a80777c023f7e876e6/ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641", size = 11759787 }, + { url = "https://files.pythonhosted.org/packages/58/de/1e2e77fc72adc7cf5b5123fd04a59ed329651d3eab9825674a9e640b100b/ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947", size = 12430479 }, + { url = "https://files.pythonhosted.org/packages/07/ed/af0f2340f33b70d50121628ef175523cc4c37619e98d98748c85764c8d88/ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4", size = 11919760 }, + { url = "https://files.pythonhosted.org/packages/24/09/d7b3d3226d535cb89234390f418d10e00a157b6c4a06dfbe723e9322cb7d/ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f", size = 14041747 }, + { url = "https://files.pythonhosted.org/packages/62/b3/a63b4e91850e3f47f78795e6630ee9266cb6963de8f0191600289c2bb8f4/ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b", size = 11550657 }, + { url = "https://files.pythonhosted.org/packages/46/63/a4f95c241d79402ccdbdb1d823d156c89fbb36ebfc4289dce092e6c0aa8f/ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2", size = 10489671 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/c2238bfebf1e473495659c523d50b1685258b6345d5ab0b418ca3f010cd7/ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523", size = 10160135 }, + { url = "https://files.pythonhosted.org/packages/ba/ef/ba7251dd15206688dbfba7d413c0312e94df3b31b08f5d695580b755a899/ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125", size = 11170179 }, + { url = "https://files.pythonhosted.org/packages/73/9f/5c336717293203ba275dbfa2ea16e49b29a9fd9a0ea8b6febfc17e133577/ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad", size = 11626021 }, + { url = "https://files.pythonhosted.org/packages/d9/2b/162fa86d2639076667c9aa59196c020dc6d7023ac8f342416c2f5ec4bda0/ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19", size = 10494958 }, + { url = "https://files.pythonhosted.org/packages/24/f3/66643d8f32f50a4b0d09a4832b7d919145ee2b944d43e604fbd7c144d175/ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224", size = 11650285 }, + { url = "https://files.pythonhosted.org/packages/95/3a/2e8704d19f376c799748ff9cb041225c1d59f3e7711bc5596c8cfdc24925/ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1", size = 10765278 }, ] [[package]] name = "scipy" -version = "1.14.1" +version = "1.15.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/68/3bc0cfaf64ff507d82b1e5d5b64521df4c8bf7e22bc0b897827cbee9872c/scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", size = 39069598 }, - { url = "https://files.pythonhosted.org/packages/43/a5/8d02f9c372790326ad405d94f04d4339482ec082455b9e6e288f7100513b/scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", size = 29879676 }, - { url = "https://files.pythonhosted.org/packages/07/42/0e0bea9666fcbf2cb6ea0205db42c81b1f34d7b729ba251010edf9c80ebd/scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", size = 23088696 }, - { url = "https://files.pythonhosted.org/packages/15/47/298ab6fef5ebf31b426560e978b8b8548421d4ed0bf99263e1eb44532306/scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", size = 25470699 }, - { url = "https://files.pythonhosted.org/packages/d8/df/cdb6be5274bc694c4c22862ac3438cb04f360ed9df0aecee02ce0b798380/scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", size = 35606631 }, - { url = "https://files.pythonhosted.org/packages/47/78/b0c2c23880dd1e99e938ad49ccfb011ae353758a2dc5ed7ee59baff684c3/scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", size = 41178528 }, - { url = "https://files.pythonhosted.org/packages/5d/aa/994b45c34b897637b853ec04334afa55a85650a0d11dacfa67232260fb0a/scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", size = 42784535 }, - { url = "https://files.pythonhosted.org/packages/e7/1c/8daa6df17a945cb1a2a1e3bae3c49643f7b3b94017ff01a4787064f03f84/scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", size = 44772117 }, - { url = "https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", size = 39076999 }, - { url = "https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", size = 29894570 }, - { url = "https://files.pythonhosted.org/packages/ed/05/7f03e680cc5249c4f96c9e4e845acde08eb1aee5bc216eff8a089baa4ddb/scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", size = 23103567 }, - { url = "https://files.pythonhosted.org/packages/5e/fc/9f1413bef53171f379d786aabc104d4abeea48ee84c553a3e3d8c9f96a9c/scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", size = 25499102 }, - { url = "https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", size = 35586346 }, - { url = "https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2", size = 41165244 }, - { url = "https://files.pythonhosted.org/packages/06/57/e6aa6f55729a8f245d8a6984f2855696c5992113a5dc789065020f8be753/scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", size = 42817917 }, - { url = "https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", size = 44781033 }, - { url = "https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", size = 39128781 }, - { url = "https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", size = 29939542 }, - { url = "https://files.pythonhosted.org/packages/66/67/6ef192e0e4d77b20cc33a01e743b00bc9e68fb83b88e06e636d2619a8767/scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", size = 23148375 }, - { url = "https://files.pythonhosted.org/packages/f6/32/3a6dedd51d68eb7b8e7dc7947d5d841bcb699f1bf4463639554986f4d782/scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", size = 25578573 }, - { url = "https://files.pythonhosted.org/packages/f0/5a/efa92a58dc3a2898705f1dc9dbaf390ca7d4fba26d6ab8cfffb0c72f656f/scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", size = 35319299 }, - { url = "https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", size = 40849331 }, - { url = "https://files.pythonhosted.org/packages/a5/cd/06f72bc9187840f1c99e1a8750aad4216fc7dfdd7df46e6280add14b4822/scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", size = 42544049 }, - { url = "https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", size = 44521212 }, - { url = "https://files.pythonhosted.org/packages/50/ef/ac98346db016ff18a6ad7626a35808f37074d25796fd0234c2bb0ed1e054/scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", size = 39091068 }, - { url = "https://files.pythonhosted.org/packages/b9/cc/70948fe9f393b911b4251e96b55bbdeaa8cca41f37c26fd1df0232933b9e/scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", size = 29875417 }, - { url = "https://files.pythonhosted.org/packages/3b/2e/35f549b7d231c1c9f9639f9ef49b815d816bf54dd050da5da1c11517a218/scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", size = 23084508 }, - { url = "https://files.pythonhosted.org/packages/3f/d6/b028e3f3e59fae61fb8c0f450db732c43dd1d836223a589a8be9f6377203/scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", size = 25503364 }, - { url = "https://files.pythonhosted.org/packages/a7/2f/6c142b352ac15967744d62b165537a965e95d557085db4beab2a11f7943b/scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", size = 35292639 }, - { url = "https://files.pythonhosted.org/packages/56/46/2449e6e51e0d7c3575f289f6acb7f828938eaab8874dbccfeb0cd2b71a27/scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", size = 40798288 }, - { url = "https://files.pythonhosted.org/packages/32/cd/9d86f7ed7f4497c9fd3e39f8918dd93d9f647ba80d7e34e4946c0c2d1a7c/scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", size = 42524647 }, - { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524 }, + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511 }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151 }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732 }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201 }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255 }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035 }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499 }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602 }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415 }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622 }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796 }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684 }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504 }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, ] [[package]] @@ -400,30 +452,59 @@ wheels = [ [[package]] name = "sparse" -version = "0.15.4" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numba" }, { name = "numpy" }, - { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/6a/a1d00d932597c00509d333d9cde6f10d6c85470a3701455b0c48fc45886b/sparse-0.15.4.tar.gz", hash = "sha256:d4b1c57d24ff0f64f2fd5b5a95b49b7fb84ed207a26d7d58ce2764dcc5c72b84", size = 359721 } +sdist = { url = "https://files.pythonhosted.org/packages/63/74/5c674277fc3d61bd1863d233a8e1f7ddf35cb1adeeaf9973888629e7a9b1/sparse-0.17.0.tar.gz", hash = "sha256:6b1ad51a810c5be40b6f95e28513ec810fe1c785923bd83b2e4839a751df4bf7", size = 642387 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/f2/8d5bc8cc6b822feac1cd671dac6fb0249a5202ad15ee9549d1a61d4141b5/sparse-0.15.4-py2.py3-none-any.whl", hash = "sha256:76ec76fee2aee82a84eb97155dd530a9644e3b1fdea2406bc4b454698b36d938", size = 237311 }, + { url = "https://files.pythonhosted.org/packages/8d/fd/42a1720542199ae6ff0f9c37bbd55dd3033ddd7bbe00d68cde09d6824887/sparse-0.17.0-py2.py3-none-any.whl", hash = "sha256:1922d1d97f692b1061c4f03a1dd6ee21850aedc88e171aa845715f5069952f18", size = 259370 }, ] [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/e4/1b6cbcc82d8832dd0ce34767d5c560df8a3547ad8cbc427f34601415930a/tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8", size = 16622 } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/f7/4da0ffe1892122c9ea096c57f64c2753ae5dd3ce85488802d11b0992cc6d/tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391", size = 13750 }, + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] [[package]] name = "typer" -version = "0.13.1" +version = "0.15.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -431,16 +512,16 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/41/49ead3ad3310545e767bcb917c759b026ca9eada5d5c150c2fb6fc555568/typer-0.13.1.tar.gz", hash = "sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c", size = 98631 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/89/c527e6c848739be8ceb5c44eb8208c52ea3515c6cf6406aa61932887bf58/typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3", size = 101559 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/69/e90a0b4d0c16e095901679216c8ecdc728110c7c54e7b5f43a623bc4c789/typer-0.13.1-py3-none-any.whl", hash = "sha256:5b59580fd925e89463a29d363e0a43245ec02765bde9fb77d39e5d0f29dd7157", size = 44723 }, + { url = "https://files.pythonhosted.org/packages/c9/62/d4ba7afe2096d5659ec3db8b15d8665bdcb92a3c6ff0b95e99895b335a9c/typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173", size = 45258 }, ] [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, ] From eac5714e509091818138ba33b00e57a9e1b67e25 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 8 Aug 2025 18:26:38 -0400 Subject: [PATCH 08/13] Delete annoying files --- .python-version | 0 uv.lock | 527 ------------------------------------------------ 2 files changed, 527 deletions(-) delete mode 100644 .python-version delete mode 100644 uv.lock diff --git a/.python-version b/.python-version deleted file mode 100644 index e69de29..0000000 diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 90b52fd..0000000 --- a/uv.lock +++ /dev/null @@ -1,527 +0,0 @@ -version = 1 -requires-python = ">=3.10.15" - -[[package]] -name = "array-api-compat" -version = "1.12.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/bd/9fa5c7c5621698d5632cc852a79fbbdc28024462c9396698e5fdcb395f37/array_api_compat-1.12.0.tar.gz", hash = "sha256:585bc615f650de53ac24b7c012baecfcdd810f50df3573be47e6dd9fa20df974", size = 99883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl", hash = "sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b", size = 58156 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674 }, -] - -[[package]] -name = "ezmsg" -version = "3.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/5d/3c1940cf4a8e8df7bd1b2582625eb0956973420f43f25ed44f4704786e78/ezmsg-3.6.1.tar.gz", hash = "sha256:c0488bea6f019c5bf1c0560957bff43c17c15ea33b759aaeb26a4c6628690ba6", size = 142634 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/3b/da01f380ac231baea89f466c070bec8f2291c58d74d602b2f36c99fb4505/ezmsg-3.6.1-py3-none-any.whl", hash = "sha256:b4b991d4dfb91f99e676ac0610767421aab84062366caa4755fe1fb2dabd7da1", size = 71018 }, -] - -[[package]] -name = "ezmsg-event" -version = "0.2.4.dev6+g5d1aa60.d20250520" -source = { editable = "." } -dependencies = [ - { name = "ezmsg-sigproc" }, - { name = "numpy" }, - { name = "sparse" }, -] - -[package.optional-dependencies] -dev = [ - { name = "ruff" }, - { name = "typer" }, -] -test = [ - { name = "pytest" }, -] - -[package.metadata] -requires-dist = [ - { name = "ezmsg-sigproc" }, - { name = "numpy", specifier = ">=1.26" }, - { name = "pytest", marker = "extra == 'test'", specifier = ">=8.3.3" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.8" }, - { name = "sparse", specifier = ">=0.15.4" }, - { name = "typer", marker = "extra == 'dev'", specifier = ">=0.12.5" }, -] - -[[package]] -name = "ezmsg-sigproc" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "array-api-compat" }, - { name = "ezmsg" }, - { name = "numba" }, - { name = "numpy" }, - { name = "pywavelets" }, - { name = "scipy" }, - { name = "sparse" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/91/fc/10ae3c539262d3b9a1f234652107833350f6e6be8799294cbcc8e41d0b5a/ezmsg_sigproc-2.0.0.tar.gz", hash = "sha256:c97a2b864ea30cfd91fd11eef8114cf47c94954b29733cfc992c3cf993e8bbd9", size = 160726 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/74/a8b0aca22b158a226e8377ab5be9b54e00cf393906788dccb22455f9b0be/ezmsg_sigproc-2.0.0-py3-none-any.whl", hash = "sha256:375658ecbe2f0a42606b70a7d7e740e76fb0f82fdfa949309bdb195a6609299a", size = 83991 }, -] - -[[package]] -name = "iniconfig" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, -] - -[[package]] -name = "llvmlite" -version = "0.44.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306 }, - { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096 }, - { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859 }, - { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199 }, - { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381 }, - { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305 }, - { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090 }, - { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200 }, - { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193 }, - { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297 }, - { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105 }, - { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901 }, - { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247 }, - { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380 }, - { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306 }, - { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090 }, - { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904 }, - { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245 }, - { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "numba" -version = "0.61.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite" }, - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663 }, - { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344 }, - { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054 }, - { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531 }, - { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612 }, - { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, - { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, - { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, - { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, - { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, - { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626 }, - { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287 }, - { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928 }, - { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115 }, - { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929 }, - { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785 }, - { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289 }, - { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918 }, - { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056 }, - { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846 }, -] - -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, -] - -[[package]] -name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pytest" -version = "8.3.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, -] - -[[package]] -name = "pywavelets" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/45/bfaaab38545a33a9f06c61211fc3bea2e23e8a8e00fedeb8e57feda722ff/pywavelets-1.8.0.tar.gz", hash = "sha256:f3800245754840adc143cbc29534a1b8fc4b8cff6e9d403326bd52b7bb5c35aa", size = 3935274 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/7e/c5e398f25c70558ca195dd4144ee004666401f6167084c1e76059d7e68d8/pywavelets-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5c86fcb203c8e61d1f3d4afbfc08d626c64e4e3708207315577264c724632bf", size = 4323291 }, - { url = "https://files.pythonhosted.org/packages/d0/d7/2fc8067c3520ce25f7632b0f47b89d1b75653cab804a42700e95126f2679/pywavelets-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafb5fa126277e1690c3d6329287122fc08e4d25a262ce126e3d81b1f5709308", size = 4291864 }, - { url = "https://files.pythonhosted.org/packages/2f/17/a868aa26e45c104613d9069f9d8ec0123687cb6945062d274f20a3992436/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec23dfe6d5a3f4312b12456b8c546aa90a11c1138e425a885987505f0658ae0", size = 4447532 }, - { url = "https://files.pythonhosted.org/packages/53/7a/7f5889a57177e2b1182080fc2c52236d1e03a0fad5e0b3d7c5312070c0be/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:880a0197e9fa108939af50a95e97c1bf9b7d3e148e0fad92ea60a9ed8c8947c0", size = 4487695 }, - { url = "https://files.pythonhosted.org/packages/f9/e6/04d76d93c158919ef0d8e1d40d1d453168305031eca6733fdc844f7cbb07/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bfa833d08b60d0bf53a7939fbbf3d98015dd34efe89cbe4e53ced880d085fc1", size = 4473752 }, - { url = "https://files.pythonhosted.org/packages/3b/a7/42ea5bbb6055abd312e45b27d931200fd6eed5414a87ec5d62020a4c651b/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e10c3fc7f4a796e94da4bca9871be2186a7bb7a3b3536a0ca9376d84263140f0", size = 4504191 }, - { url = "https://files.pythonhosted.org/packages/8c/7e/52df87a9e77adfb12c1b8be79a2053f2eb4c2507dec96ebfd2333b15ff03/pywavelets-1.8.0-cp310-cp310-win32.whl", hash = "sha256:31baf4be6940fde72cc85663154360857ac1b93c251822deaf72bb804da95031", size = 4143794 }, - { url = "https://files.pythonhosted.org/packages/01/e2/06e08230c26049740b2773952fbb12cc7186e5df655a73b1c30ba493e864/pywavelets-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:560c39f1ff8cb37f8b8ea4b7b6eb8a14f6926c11f5cf8c09f013a58f895ed5bc", size = 4214262 }, - { url = "https://files.pythonhosted.org/packages/6c/8a/9f8e794120b55caa1c4ae8d72696111bc408251615f351a8e54a5d8c4d4e/pywavelets-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e8dd5be4faed994581a8a4b3c0169be20567a9346e523f0b57f903c8f6722bce", size = 4324170 }, - { url = "https://files.pythonhosted.org/packages/3e/b8/f6246be5c78e9fa73fcbba9ab4cbfe0d4dcb79ea5491f28d673a53466134/pywavelets-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d8abaf7c120b151ef309c9ff57e0a44ba9febf49045056dbc1577526ecec6c8", size = 4294254 }, - { url = "https://files.pythonhosted.org/packages/2c/dc/ba1f212e9b43117ed28e0fd092e72e817790427400f88937ea742d260153/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b43a4c58707b1e8d941bec7f1d83e67c482278575ff0db3189d5c0dfae23a57", size = 4447178 }, - { url = "https://files.pythonhosted.org/packages/58/10/e59c162a11d2fedb4454abbf7b74a52390aba5edc9605bf829bfa8708dac/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1aad0b97714e3079a2bfe48e4fb8ccd60778d0427e9ee5e0a9ff922e6c61e4", size = 4486799 }, - { url = "https://files.pythonhosted.org/packages/03/ee/90c3d0a0a3bda74e6e097e4c06bff9446ff2a4c90b8617aaf4902c46966b/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0e1db96dcf3ce08156859df8b359e9ff66fa15061a1b90e70e020bf4cd077a0", size = 4486403 }, - { url = "https://files.pythonhosted.org/packages/05/54/58b87f8b636a9f044f3f9814d2ec696cf25f3b33af97c11811f13c364085/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e62c8fb52ab0e8ff212fff9acae681a8f12d68b76c36fe24cc48809d5b6825ba", size = 4515011 }, - { url = "https://files.pythonhosted.org/packages/a1/d0/f755cee11ff20668114942d0e777e2b502a8e4665e1fdb2553b587aac637/pywavelets-1.8.0-cp311-cp311-win32.whl", hash = "sha256:bf327528d10de471b04bb725c4e10677fac5a49e13d41bf0d0b3a1f6d7097abf", size = 4139934 }, - { url = "https://files.pythonhosted.org/packages/7b/0b/f4b92d4f00565280ea3e62a8e3dc81a667d67ed7bd59232f2f18d55f9aff/pywavelets-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3814d354dd109e244ffaac3d480d29a5202212fe24570c920268237c8d276f95", size = 4214321 }, - { url = "https://files.pythonhosted.org/packages/2d/8b/4870f11559307416470158a5aa6f61e5c2a910f1645a7a836ffae580b7ad/pywavelets-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3f431c9e2aff1a2240765eff5e804975d0fcc24c82d6f3d4271243f228e5963b", size = 4326187 }, - { url = "https://files.pythonhosted.org/packages/c4/35/66835d889fd7fbf3119c7a9bd9d9bd567fc0bb603dfba408e9226db7cb44/pywavelets-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e39b0e2314e928cb850ee89b9042733a10ea044176a495a54dc84d2c98407a51", size = 4295428 }, - { url = "https://files.pythonhosted.org/packages/63/1c/42e5130226538c70d4bbbaee00eb1bc06ec3287f7ea43d5fcf85bfc761ce/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cae701117f5c7244b7c8d48b9e92a0289637cdc02a9c205e8be83361f0c11fae", size = 4421259 }, - { url = "https://files.pythonhosted.org/packages/6f/c5/1ce93657432e22a5debc21e8b52ec6980f819ecb7fa727bb86744224d967/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649936baee933e80083788e0adc4d8bc2da7cdd8b10464d3b113475be2cc5308", size = 4447650 }, - { url = "https://files.pythonhosted.org/packages/b9/d6/b54ef30daca71824f811f9d2322a978b0a58d27674b8e3af6520f67e9ec6/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8c68e9d072c536bc646e8bdce443bb1826eeb9aa21b2cb2479a43954dea692a3", size = 4448538 }, - { url = "https://files.pythonhosted.org/packages/ce/8c/1688b790e55674667ad644262f174405c2c9873cb13e773432e78b1b33e4/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63f67fa2ee1610445de64f746fb9c1df31980ad13d896ea2331fc3755f49b3ae", size = 4485228 }, - { url = "https://files.pythonhosted.org/packages/c9/9b/69de31c3b663dadd76d1da6bf8af68d8cefff55df8e880fe96a94bb8c9ac/pywavelets-1.8.0-cp312-cp312-win32.whl", hash = "sha256:4b3c2ab669c91e3474fd63294355487b7dd23f0b51d32f811327ddf3546f4f3d", size = 4134850 }, - { url = "https://files.pythonhosted.org/packages/1c/88/9e2aa9d5fde08bfc0fb18ffb1b5307c1ed49c24930b4147e5f48571a7251/pywavelets-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1", size = 4210786 }, - { url = "https://files.pythonhosted.org/packages/94/73/7ff347d77c6bda11330565050c3346c54bc210086380abeb84e402c1c9cd/pywavelets-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:441ba45c8dff8c6916dbe706958d0d7f91da675695ca0c0d75e483f6f52d0a12", size = 4321474 }, - { url = "https://files.pythonhosted.org/packages/b0/70/c58937ebbca1aba3475ca5ee63c7bcebf09f3c93891ae5942eaec7e95707/pywavelets-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:24bb282bab09349d9d128ed0536fa50fff5c2147891971a69c2c36155dfeeeac", size = 4291502 }, - { url = "https://files.pythonhosted.org/packages/da/55/87b4ad6128b2e85985908e958e856e0b680cdcc03cc490e2cc995164b13a/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426ff3799446cb4da1db04c2084e6e58edfe24225596805665fd39c14f53dece", size = 4412669 }, - { url = "https://files.pythonhosted.org/packages/bf/1a/bfca9eab23bd7b27843b0ce95c47796033a7b2c93048315f5fc5d6ac6428/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0607a9c085b8285bc0d04e33d461a6c80f8c325389221ffb1a45141861138e", size = 4454604 }, - { url = "https://files.pythonhosted.org/packages/c3/23/9ce38829f57159e812c469c4f9d7b5a16c1ba922c1802985e8c504468206/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d31c36a39110e8fcc7b1a4a11cfed7d22b610c285d3e7f4fe73ec777aa49fa39", size = 4445507 }, - { url = "https://files.pythonhosted.org/packages/e5/d2/e78a976b0600a6ef7a70f4430122d6ad11b3e1cbda3c8b3565661d094678/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa7c68ed1e5bab23b1bafe60ccbcf709b878652d03de59e961baefa5210fcd0a", size = 4479078 }, - { url = "https://files.pythonhosted.org/packages/85/4d/1c4f870010368f3aeb0bdd72929376a1988e4a122e76545bd8c56e549c96/pywavelets-1.8.0-cp313-cp313-win32.whl", hash = "sha256:2c6b359b55d713ef683e9da1529181b865a80d759881ceb9adc1c5742e4da4d8", size = 4133763 }, - { url = "https://files.pythonhosted.org/packages/c9/4f/0a709a5732e6cf9297fc87bf545cb879997cde204115f8c0cbc296c5bdd3/pywavelets-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5", size = 4209548 }, - { url = "https://files.pythonhosted.org/packages/de/2a/4cac0bba67d3bc0ad697d0680539864db0a6964c7ad953d8d9d887f360b3/pywavelets-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:2e1c79784bebeafd3715c1bea6621daa2e2e6ed37b687719322e2078fb35bb70", size = 4335183 }, - { url = "https://files.pythonhosted.org/packages/58/d1/3abe4cf34a35b09ad847f0e9a85f340c1988611222926d295fa8710659e7/pywavelets-1.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f489380c95013cc8fb3ef338f6d8c1a907125db453cc4dc739e2cca06fcd8b6", size = 4454723 }, - { url = "https://files.pythonhosted.org/packages/d5/62/f05dd191232ae94e0b48509bb0ee65c9d45abf5e8f3612b09fd309b41384/pywavelets-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:06786201a91b5e74540f4f3c115c49a29190de2eb424823abbd3a1fd75ea3e28", size = 4472192 }, - { url = "https://files.pythonhosted.org/packages/20/6a/257c95ad1e0fd395cbccd4ffec0d01cc9b51a3bb91e67d8fa10ffebc9c72/pywavelets-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:f2877fb7b58c94211257dcf364b204d6ed259146fc87d5a90bf9d93c97af6226", size = 4183968 }, - { url = "https://files.pythonhosted.org/packages/6c/58/7179fd6f87153f2e339171e8cfe9bf901398a89045eefd7a3911bb9b47ad/pywavelets-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ec5d723c3335ff8aa630fd4b14097077f12cc02893c91cafd60dd7b1730e780f", size = 4265431 }, -] - -[[package]] -name = "rich" -version = "14.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, -] - -[[package]] -name = "ruff" -version = "0.11.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/4a3c5a97faaae6b428b336dcca81d03ad04779f8072c267ad2bd860126bf/ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6", size = 4165632 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/9f/596c628f8824a2ce4cd12b0f0b4c0629a62dfffc5d0f742c19a1d71be108/ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58", size = 10316243 }, - { url = "https://files.pythonhosted.org/packages/3c/38/c1e0b77ab58b426f8c332c1d1d3432d9fc9a9ea622806e208220cb133c9e/ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed", size = 11083636 }, - { url = "https://files.pythonhosted.org/packages/23/41/b75e15961d6047d7fe1b13886e56e8413be8467a4e1be0a07f3b303cd65a/ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca", size = 10441624 }, - { url = "https://files.pythonhosted.org/packages/b6/2c/e396b6703f131406db1811ea3d746f29d91b41bbd43ad572fea30da1435d/ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2", size = 10624358 }, - { url = "https://files.pythonhosted.org/packages/bd/8c/ee6cca8bdaf0f9a3704796022851a33cd37d1340bceaf4f6e991eb164e2e/ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5", size = 10176850 }, - { url = "https://files.pythonhosted.org/packages/e9/ce/4e27e131a434321b3b7c66512c3ee7505b446eb1c8a80777c023f7e876e6/ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641", size = 11759787 }, - { url = "https://files.pythonhosted.org/packages/58/de/1e2e77fc72adc7cf5b5123fd04a59ed329651d3eab9825674a9e640b100b/ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947", size = 12430479 }, - { url = "https://files.pythonhosted.org/packages/07/ed/af0f2340f33b70d50121628ef175523cc4c37619e98d98748c85764c8d88/ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4", size = 11919760 }, - { url = "https://files.pythonhosted.org/packages/24/09/d7b3d3226d535cb89234390f418d10e00a157b6c4a06dfbe723e9322cb7d/ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f", size = 14041747 }, - { url = "https://files.pythonhosted.org/packages/62/b3/a63b4e91850e3f47f78795e6630ee9266cb6963de8f0191600289c2bb8f4/ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b", size = 11550657 }, - { url = "https://files.pythonhosted.org/packages/46/63/a4f95c241d79402ccdbdb1d823d156c89fbb36ebfc4289dce092e6c0aa8f/ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2", size = 10489671 }, - { url = "https://files.pythonhosted.org/packages/6a/9b/c2238bfebf1e473495659c523d50b1685258b6345d5ab0b418ca3f010cd7/ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523", size = 10160135 }, - { url = "https://files.pythonhosted.org/packages/ba/ef/ba7251dd15206688dbfba7d413c0312e94df3b31b08f5d695580b755a899/ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125", size = 11170179 }, - { url = "https://files.pythonhosted.org/packages/73/9f/5c336717293203ba275dbfa2ea16e49b29a9fd9a0ea8b6febfc17e133577/ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad", size = 11626021 }, - { url = "https://files.pythonhosted.org/packages/d9/2b/162fa86d2639076667c9aa59196c020dc6d7023ac8f342416c2f5ec4bda0/ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19", size = 10494958 }, - { url = "https://files.pythonhosted.org/packages/24/f3/66643d8f32f50a4b0d09a4832b7d919145ee2b944d43e604fbd7c144d175/ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224", size = 11650285 }, - { url = "https://files.pythonhosted.org/packages/95/3a/2e8704d19f376c799748ff9cb041225c1d59f3e7711bc5596c8cfdc24925/ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1", size = 10765278 }, -] - -[[package]] -name = "scipy" -version = "1.15.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511 }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151 }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732 }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, - { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201 }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255 }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035 }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499 }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602 }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415 }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622 }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796 }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684 }, - { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504 }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, - { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, - { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, - { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, - { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, - { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, - { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, - { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, - { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, - { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, - { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, - { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, - { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, - { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, - { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, - { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, - { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, - { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, - { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, - { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - -[[package]] -name = "sparse" -version = "0.17.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba" }, - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/74/5c674277fc3d61bd1863d233a8e1f7ddf35cb1adeeaf9973888629e7a9b1/sparse-0.17.0.tar.gz", hash = "sha256:6b1ad51a810c5be40b6f95e28513ec810fe1c785923bd83b2e4839a751df4bf7", size = 642387 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/fd/42a1720542199ae6ff0f9c37bbd55dd3033ddd7bbe00d68cde09d6824887/sparse-0.17.0-py2.py3-none-any.whl", hash = "sha256:1922d1d97f692b1061c4f03a1dd6ee21850aedc88e171aa845715f5069952f18", size = 259370 }, -] - -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, -] - -[[package]] -name = "typer" -version = "0.15.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/89/c527e6c848739be8ceb5c44eb8208c52ea3515c6cf6406aa61932887bf58/typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3", size = 101559 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/62/d4ba7afe2096d5659ec3db8b15d8665bdcb92a3c6ff0b95e99895b335a9c/typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173", size = 45258 }, -] - -[[package]] -name = "typing-extensions" -version = "4.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, -] From d36c28baddc3b2560085b98b5962359b6944c5ad Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 8 Aug 2025 18:27:26 -0400 Subject: [PATCH 09/13] Ignore annoying files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 662c195..3b8b86f 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,4 @@ cython_debug/ #.idea/ src/ezmsg/event/__version__.py +uv.lock From 5558b5e86671bb29b1472793cf494e2253b5cdf0 Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 8 Aug 2025 18:27:58 -0400 Subject: [PATCH 10/13] Fixup basic uv dependency setup --- .github/workflows/python-tests.yml | 8 +------- pyproject.toml | 16 ++++++++++------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 96baed9..bab641c 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -21,15 +21,9 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v3 - with: - enable-cache: true - cache-dependency-glob: "uv.lock" - - - name: Set up Python ${{ matrix.python-version }} - run: uv python install ${{ matrix.python-version }} - name: Install the project - run: uv sync --all-extras + run: uv sync --python ${{ matrix.python-version }} - name: Lint run: diff --git a/pyproject.toml b/pyproject.toml index e5677f5..c0f8132 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,13 +13,17 @@ dependencies = [ "sparse>=0.15.4", ] -[project.optional-dependencies] -test = [ - "pytest>=8.3.3", -] +[dependency-groups] dev = [ - "ruff>=0.6.8", - "typer>=0.12.5", + "typer", + {include-group = "lint"}, + {include-group = "test"}, +] +lint = [ + "ruff" +] +test = [ + "pytest" ] [build-system] From 5b9795c2d61a92f924cb97b703095b73d1acc24e Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 8 Aug 2025 18:42:07 -0400 Subject: [PATCH 11/13] Bump dependencies --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c0f8132..3f0328b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,9 +8,10 @@ readme = "README.md" requires-python = ">=3.10.15" dynamic = ["version"] dependencies = [ - "ezmsg-sigproc", - "numpy>=1.26", - "sparse>=0.15.4", + "ezmsg-sigproc>=2.1.0", + "ezmsg>=3.6.1", + "sparse>=0.17.0", + "numpy>=2.2.6", ] [dependency-groups] From a6108aebec3b64d3b51accd3a686a900ac2ceb3f Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 31 Oct 2025 02:08:15 -0400 Subject: [PATCH 12/13] Update deps and add prelim docs --- .github/workflows/docs.yml | 67 ++++++++++ docs/Makefile | 20 +++ docs/make.bat | 35 +++++ docs/source/_templates/autosummary/module.rst | 64 +++++++++ docs/source/api/index.rst | 11 ++ docs/source/conf.py | 122 ++++++++++++++++++ docs/source/index.rst | 67 ++++++++++ profile_rate.py | 64 +++++++++ pyproject.toml | 9 +- rate_profile.prof | Bin 0 -> 705472 bytes src/ezmsg/event/refractory.py | 69 ++++++++++ 11 files changed, 527 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/_templates/autosummary/module.rst create mode 100644 docs/source/api/index.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 profile_rate.py create mode 100644 rate_profile.prof create mode 100644 src/ezmsg/event/refractory.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..96b25d1 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,67 @@ +name: Documentation + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y graphviz + + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + python-version: "3.12" + + - name: Install documentation dependencies + run: uv sync --only-group docs + + - name: Build documentation + run: | + cd docs + uv run make html + + - name: Add .nojekyll file + run: touch docs/build/html/.nojekyll + + - name: Add CNAME file for custom domain + run: echo "www.ezmsg.org" > docs/build/html/CNAME + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: 'docs/build/html' + + deploy: + # Deploy on push to main + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: deploy-pages@v4 diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_templates/autosummary/module.rst b/docs/source/_templates/autosummary/module.rst new file mode 100644 index 0000000..fd632b4 --- /dev/null +++ b/docs/source/_templates/autosummary/module.rst @@ -0,0 +1,64 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block attributes %} + {% if attributes %} + .. rubric:: Module Attributes + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block functions %} + {% if functions %} + .. rubric:: Functions + + {% for item in functions %} + .. autofunction:: {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block classes %} + {% if classes %} + .. rubric:: Classes + + {% for item in classes %} + .. autoclass:: {{ item }} + :members: + :undoc-members: + :show-inheritance: + :special-members: __init__ + {%- endfor %} + {% endif %} + {% endblock %} + + {% block exceptions %} + {% if exceptions %} + .. rubric:: Exceptions + + {% for item in exceptions %} + .. autoexception:: {{ item }} + :members: + :show-inheritance: + {%- endfor %} + {% endif %} + {% endblock %} + +{% block modules %} +{% if modules %} +.. rubric:: Modules + +.. autosummary:: + :toctree: + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst new file mode 100644 index 0000000..d954b4a --- /dev/null +++ b/docs/source/api/index.rst @@ -0,0 +1,11 @@ +API Reference +============= + +This page contains auto-generated API reference documentation. + +.. autosummary:: + :toctree: generated + :recursive: + :template: autosummary/module.rst + + ezmsg.event diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..f1085fc --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,122 @@ +# Configuration file for the Sphinx documentation builder. + +import os +import sys + +# Add the source directory to the path +sys.path.insert(0, os.path.abspath("../../src")) + +# -- Project information -------------------------- + +project = "ezmsg.event" +copyright = "2024, ezmsg Contributors" +author = "ezmsg Contributors" + +# The version is managed by hatch-vcs and stored in __version__.py +try: + from ezmsg.event.__version__ import version as release +except ImportError: + release = "unknown" + +# For display purposes, extract the base version without git commit info +version = release.split("+")[0] if release != "unknown" else release + +# -- General configuration -------------------------- + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.napoleon", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", + "sphinx.ext.duration", + "sphinx_copybutton", + "myst_parser", # For markdown files +] + +templates_path = ["_templates"] +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", +} +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + +# The toctree master document +master_doc = "index" + +# -- Autodoc configuration ------------------------------ + +# Auto-generate API docs +autosummary_generate = True +autosummary_imported_members = False +autodoc_typehints = "description" +autodoc_member_order = "bysource" +autodoc_typehints_format = "short" +python_use_unqualified_type_names = True +autodoc_default_options = { + "members": True, + "member-order": "bysource", + "special-members": "__init__", + "undoc-members": True, + "show-inheritance": True, +} + +# Don't show the full module path in the docs +add_module_names = False + +# -- Intersphinx configuration -------------------------- + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "ezmsg": ("https://www.ezmsg.org/ezmsg/", None), + "ezmsg.sigproc": ("https://www.ezmsg.org/ezmsg-sigproc/", None), +} +intersphinx_disabled_domains = ["std"] + +# -- Options for HTML output ----------------------------- + +html_theme = "pydata_sphinx_theme" +html_static_path = ["_static"] + +# Set the base URL for the documentation +html_baseurl = "https://www.ezmsg.org/ezmsg-event/" + +html_theme_options = { + "logo": { + "text": f"ezmsg.event {version}", + "link": "https://ezmsg.org", # Link back to main site + }, + "header_links_before_dropdown": 4, + "navbar_start": ["navbar-logo"], + "navbar_end": ["theme-switcher", "navbar-icon-links"], + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/ezmsg-org/ezmsg-event", + "icon": "fa-brands fa-github", + }, + { + "name": "ezmsg.org", + "url": "https://www.ezmsg.org", + "icon": "fa-solid fa-house", + }, + ], +} + +# Timestamp is inserted at every page bottom in this strftime format. +html_last_updated_fmt = "%Y-%m-%d" + +# -- Options for linkcode ----------------------------- + +branch = "main" +code_url = f"https://github.com/ezmsg-org/ezmsg-event/blob/{branch}/" + + +def linkcode_resolve(domain, info): + if domain != "py": + return None + if not info["module"]: + return None + filename = info["module"].replace(".", "/") + return f"{code_url}src/{filename}.py" diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..2a8cd00 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,67 @@ +ezmsg.event +=========== + +ezmsg namespace package for working with signal events like neural spikes and heartbeats. + +Overview +-------- + +``ezmsg-event`` ezmsg namespace package for working with signal events like neural spikes and heartbeats. + +Key features: + +* **Event detection** - Detect and track signal events in neural data +* **Spike handling** - Process neural spike events +* **Heartbeat tracking** - Monitor physiological heartbeat events +* **Event timestamps** - Precise timing for event occurrences + + +Installation +------------ + +Install from PyPI: + +.. code-block:: bash + + pip install ezmsg-event + +Or install the latest development version: + +.. code-block:: bash + + pip install git+https://github.com/ezmsg-org/ezmsg-event@main + +Dependencies +^^^^^^^^^^^^ + +Core dependencies: + +* ``ezmsg`` +* ``numpy`` +* ``ezmsg.sigproc`` + +Quick Start +----------- + +For general ezmsg tutorials and guides, visit `ezmsg.org `_. + +For package-specific documentation: + +* **API Reference** - See :doc:`api/index` for complete API documentation +* **README** - See the `GitHub repository `_ for usage examples + +Documentation +------------- + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + api/index + + +Indices and tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` diff --git a/profile_rate.py b/profile_rate.py new file mode 100644 index 0000000..9375762 --- /dev/null +++ b/profile_rate.py @@ -0,0 +1,64 @@ +import cProfile +import pstats +import numpy as np +import sparse +from ezmsg.util.messages.axisarray import AxisArray +from ezmsg.event.rate import Rate, EventRateSettings +import ezmsg.core as ez + +# Simulate input data +def generate_sparse_data(num_samples, num_channels, sparsity_factor, rng): + data = sparse.random((num_samples, num_channels), density=sparsity_factor, random_state=rng) > 0 + return data + +def run_rate_processor(num_samples, num_channels, sparsity_factor, bin_duration, chunk_dur, fs): + rng = np.random.default_rng() + s = generate_sparse_data(num_samples, num_channels, sparsity_factor, rng) + + chunk_len = int(fs * chunk_dur) + nchunk = int(num_samples / chunk_len) + + in_msgs = [ + AxisArray( + data=s[chunk_ix * chunk_len : (chunk_ix + 1) * chunk_len], + dims=["time", "ch"], + axes={ + "time": AxisArray.Axis.TimeAxis(fs=fs, offset=chunk_ix * chunk_dur), + }, + ) + for chunk_ix in range(nchunk) + ] + + settings = EventRateSettings(bin_duration=bin_duration) + rate_processor = Rate(settings) + + output_messages = [] + for in_msg in in_msgs: + output_messages.append(rate_processor(in_msg)) + + return output_messages + +if __name__ == "__main__": + NUM_SAMPLES = 300_000 # Number of time samples (e.g., 10 seconds at 30kHz) + NUM_CHANNELS = 128 # Number of channels + SPARSITY_FACTOR = 0.0001 # 0.01% sparse, as in test_rate.py + BIN_DURATION = 0.03 # 30ms bin duration, as in test_rate.py + CHUNK_DURATION = 0.1 # 100ms chunk duration, as in test_rate.py + FS = 30000.0 # Sampling frequency, as in test_rate.py + + print(f"Profiling with: samples={NUM_SAMPLES}, channels={NUM_CHANNELS}, sparsity={SPARSITY_FACTOR}, bin_duration={BIN_DURATION}, chunk_duration={CHUNK_DURATION}, fs={FS}") + + # Run with cProfile + profiler = cProfile.Profile() + profiler.enable() + + run_rate_processor(NUM_SAMPLES, NUM_CHANNELS, SPARSITY_FACTOR, BIN_DURATION, CHUNK_DURATION, FS) + + profiler.disable() + + # Save stats to a file in a format snakeviz can read + stats_file = "rate_profile.prof" + profiler.dump_stats(stats_file) + + print(f"Profiling results saved to {stats_file}") + print("To visualize, run: uv run snakeviz rate_profile.prof") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3f0328b..f4150d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" requires-python = ">=3.10.15" dynamic = ["version"] dependencies = [ - "ezmsg-sigproc>=2.1.0", + "ezmsg-sigproc>=2.2.0", "ezmsg>=3.6.1", "sparse>=0.17.0", "numpy>=2.2.6", @@ -26,6 +26,13 @@ lint = [ test = [ "pytest" ] +docs = [ + "sphinx>=7.0", + "sphinx-autodoc-typehints", + "sphinx-copybutton", + "pydata-sphinx-theme", + "myst-parser", +] [build-system] requires = ["hatchling", "hatch-vcs"] diff --git a/rate_profile.prof b/rate_profile.prof new file mode 100644 index 0000000000000000000000000000000000000000..d4c34508e53681918cc109488ab741027443c9f3 GIT binary patch literal 705472 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 z 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 z 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'h1bE% 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

5+MyZhD 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 literal 0 HcmV?d00001 diff --git a/src/ezmsg/event/refractory.py b/src/ezmsg/event/refractory.py new file mode 100644 index 0000000..ea5db84 --- /dev/null +++ b/src/ezmsg/event/refractory.py @@ -0,0 +1,69 @@ + +import numpy as np +import numpy.typing as npt +import ezmsg.core as ez +from ezmsg.util.messages.axisarray import AxisArray, slice_along_axis +from ezmsg.sigproc.base import BaseStatefulTransformer, processor_state + + +class RefractorySettings(ez.Settings): + dur: float = 0.001 + """The minimum duration between events in seconds. If 0 (default), no refractory period is enforced.""" + + +@processor_state +class Refractory: + width: int = 0 + + elapsed: npt.NDArray | None = None + """Track number of samples since last event for each feature.""" + + +class RefractoryTransformer( + BaseStatefulTransformer[RefractorySettings, AxisArray, AxisArray, Refractory] +): + def _hash_message(self, message: AxisArray) -> int: + return super()._hash_message(message) + + def _reset_state(self, message: AxisArray) -> None: + fs = 1 / message.axes["time"].gain + self._state.width = int(self.settings.dur * fs) + ax_idx = message.get_axis_idx("time") + first_samp = slice_along_axis(message.data, slice(None, 1, None), ax_idx) + self._state.elapsed = np.zeros(first_samp.shape, dtype=int) + ( + self._state.width + 1 + ) + + def _process(self, message: AxisArray) -> AxisArray: + if self._state.width <= 2: + return message + + # TODO: Get the sparse indices of the message.data + + if len(samp_idx) <= 0: + return message + + uq_feats, feat_splits = np.unique(cross_idx[0], return_index=True) + ieis = np.diff(np.hstack(([samp_idx[0] + 1], samp_idx))) + # Reset elapsed time at feature boundaries. + ieis[feat_splits] = samp_idx[feat_splits] + self._state.elapsed[uq_feats] + b_drop = ieis <= self._state.refrac_width + drop_idx = np.where(b_drop)[0] + final_drop = [] + while len(drop_idx) > 0: + d_idx = drop_idx[0] + # Update next iei so its interval refers to the event before the to-be-dropped event. + # but only if the next iei belongs to the same feature. + if ((d_idx + 1) < len(ieis)) and (d_idx + 1) not in feat_splits: + ieis[d_idx + 1] += ieis[d_idx] + # We will later remove this event from samp_idx and cross_idx + final_drop.append(d_idx) + # Remove the dropped event from drop_idx. + drop_idx = drop_idx[1:] + + # If the next event is now outside the refractory period then it will not be dropped. + if len(drop_idx) > 0 and ieis[drop_idx[0]] > self._state.refrac_width: + drop_idx = drop_idx[1:] + + samp_idx = np.delete(samp_idx, final_drop) + cross_idx = tuple(np.delete(_, final_drop) for _ in cross_idx) From 64da3ec8ef7bd2ff32b24bfa8d89f5e216d918bb Mon Sep 17 00:00:00 2001 From: Chadwick Boulay Date: Fri, 31 Oct 2025 02:27:42 -0400 Subject: [PATCH 13/13] Fix GHA docs workflow --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 96b25d1..aaed34e 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -64,4 +64,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: deploy-pages@v4 + uses: actions/deploy-pages@v4