pywavelet 0.2.7__py3-none-any.whl → 0.2.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,95 @@
1
+ import logging
2
+ import os
3
+
4
+ import click
5
+
6
+ VALID_BACKENDS = [
7
+ "numpy32",
8
+ "cupy32",
9
+ "jax32",
10
+ "jax64",
11
+ "numpy64",
12
+ "cupy64",
13
+ ]
14
+
15
+
16
+ @click.command("pywavelet_timer")
17
+ @click.option(
18
+ "-n",
19
+ "--log2n",
20
+ type=int,
21
+ default=12,
22
+ help="The maximum log2 of the number of frequencies.",
23
+ )
24
+ @click.option(
25
+ "-r",
26
+ "--nrep",
27
+ type=int,
28
+ default=5,
29
+ help="The number of repetitions for each run.",
30
+ )
31
+ @click.option(
32
+ "-o",
33
+ "--outdir",
34
+ type=str,
35
+ default=".",
36
+ help="The output directory for the CSV files.",
37
+ )
38
+ @click.option(
39
+ "-b",
40
+ "--backend",
41
+ type=click.Choice(VALID_BACKENDS),
42
+ default="numpy",
43
+ help="The backend to use for the computation.",
44
+ )
45
+ def cli_collect_runtime(
46
+ log2n: int,
47
+ nrep: int = 5,
48
+ outdir: str = ".",
49
+ backend: str = "numpy",
50
+ ):
51
+ """Collect runtimes for the specified mode and save to CSV files.
52
+
53
+ Parameters
54
+ ----------
55
+ max_log2f : int
56
+ The maximum log2 of the number of frequencies.
57
+ nrep : int, optional
58
+ The number of repetitions for each run, by default 5.
59
+ outdir : str, optional
60
+ The output directory for the CSV files, by default ".".
61
+ backend : str, optional
62
+ The backend to use for the computation, by default "numpy".
63
+ Valid options are "numpy", "cupy", and "jax", 'jax64'.
64
+
65
+ """
66
+ if backend not in VALID_BACKENDS:
67
+ raise ValueError(
68
+ f"Invalid backend '{backend}'. Valid options are {VALID_BACKENDS}."
69
+ )
70
+
71
+ precision = "float64" if "64" in backend else "float32"
72
+
73
+ if "64" in backend:
74
+ import jax
75
+
76
+ jax.config.update("jax_enable_x64", True)
77
+ backend = backend[:-2]
78
+
79
+ os.environ["PYWAVELET_BACKEND"] = backend
80
+ os.environ["PYWAVELET_PRECISION"] = precision
81
+
82
+ # Set up logging
83
+ from pywavelet.logger import logger
84
+
85
+ logger.setLevel(logging.ERROR)
86
+
87
+ from pywavelet.utils.timing_cli.collect_runtimes import (
88
+ collect_runtimes_for_backend,
89
+ )
90
+ from pywavelet.utils.timing_cli.plot import plot_runtimes
91
+
92
+ # Create the output directory if it doesn't exist
93
+ os.makedirs(outdir, exist_ok=True)
94
+ collect_runtimes_for_backend(backend, log2n, nrep, outdir)
95
+ plot_runtimes(outdir)
@@ -0,0 +1,192 @@
1
+ import time
2
+ from typing import Callable, Tuple
3
+
4
+ import numpy as np
5
+ import pandas as pd
6
+ from rich import box
7
+ from rich.console import Console
8
+ from rich.table import Table
9
+ from tqdm.auto import tqdm
10
+
11
+ from ...backend import (
12
+ cuda_available,
13
+ get_dtype_from_env,
14
+ get_precision_from_env,
15
+ )
16
+ from ...transforms.phi_computer import phitilde_vec_norm
17
+ from ...types import FrequencySeries
18
+
19
+ __all__ = ["collect_runtimes_for_backend"]
20
+
21
+
22
+ PRECISION = get_precision_from_env()
23
+ print(f"Using precision: {PRECISION}")
24
+ DTYPES = get_dtype_from_env()
25
+ print(f"Using dtypes: {DTYPES}")
26
+
27
+
28
+ def print_runtimes(runtimes: pd.DataFrame, label: str):
29
+ # rich console to print the runtimes median +/- std
30
+
31
+ console = Console()
32
+ table = Table(title=f"Runtimes for {label}", box=box.SIMPLE)
33
+ table.add_column("ND", justify="center")
34
+ table.add_column("Runtime (s)", justify="center")
35
+
36
+ for index, row in runtimes.iterrows():
37
+ nd_log2 = int(np.log2(row["ND"]))
38
+ table.add_row(
39
+ f"2**{nd_log2}", f"{row['median']:.4f} +/- {row['std']:.4f}"
40
+ )
41
+ console.print(table)
42
+
43
+
44
+ def _generate_white_noise_freq_domain_dt(
45
+ ND: int, dt: float = 0.0125, power_spectrum_level=1.0, seed=None
46
+ ) -> FrequencySeries:
47
+ """
48
+ Generates a frequency domain representation of white noise given the
49
+ time step (dt) and the length of the corresponding time-domain signal (ND).
50
+ This function directly computes the positive frequency part of the
51
+ frequency domain representation of white noise. The output length
52
+ will be ND // 2 + 1.
53
+
54
+ Args:
55
+ dt (float): The time step between samples in the corresponding
56
+ time-domain signal (in seconds).
57
+ ND (int): The length of the corresponding time-domain signal
58
+ (number of samples).
59
+ power_spectrum_level (float, optional): The desired power spectral
60
+ density level (per Hz).
61
+ Defaults to 1.0.
62
+ seed (int, optional): Random seed for reproducibility. Defaults to None.
63
+
64
+ Returns:
65
+ numpy.ndarray: A complex-valued NumPy array representing the
66
+ positive frequency components of white noise.
67
+ The length will be ND // 2 + 1.
68
+ """
69
+ if seed is not None:
70
+ np.random.seed(seed)
71
+
72
+ n_positive_freqs = ND // 2 + 1
73
+ df = 1.0 / (ND * dt)
74
+
75
+ magnitudes = np.sqrt(power_spectrum_level * df) * np.ones(n_positive_freqs)
76
+ phases = 2 * np.pi * np.random.rand(n_positive_freqs)
77
+ positive_frequency_signal = magnitudes * np.exp(1j * phases)
78
+ freqs = np.fft.rfftfreq(ND, dt)
79
+ return FrequencySeries(positive_frequency_signal, freqs)
80
+
81
+
82
+ def _generate_func_args(ND: int, label="numpy") -> Tuple:
83
+ Nf = Nt = int(np.sqrt(ND))
84
+ yf = _generate_white_noise_freq_domain_dt(ND, seed=0).data
85
+ phif = phitilde_vec_norm(Nf, Nt, d=4.0)
86
+
87
+ if "jax" in label:
88
+ from jax import numpy as jnp
89
+
90
+ yf = jnp.array(yf, dtype=DTYPES[1])
91
+ phif = jnp.array(phif, dtype=DTYPES[0])
92
+ if "cupy" in label and cuda_available:
93
+ import cupy as cp
94
+
95
+ yf = cp.array(yf, dtype=DTYPES[1])
96
+ phif = cp.array(phif, dtype=DTYPES[0])
97
+
98
+ if "numpy" in label:
99
+ yf = np.array(yf, dtype=DTYPES[1])
100
+ phif = np.array(phif, dtype=DTYPES[0])
101
+
102
+ return yf, Nf, Nt, phif, DTYPES[0], DTYPES[1]
103
+
104
+
105
+ def _collect_runtime(
106
+ func: Callable, func_args: Tuple, nrep: int = 5
107
+ ) -> Tuple[float, float]:
108
+ # Single warm-up run to reduce startup overhead
109
+ func(*func_args)
110
+
111
+ times = []
112
+ for _ in range(nrep):
113
+ start = time.process_time()
114
+ func(*func_args)
115
+ end = time.process_time()
116
+ times.append(end - start)
117
+
118
+ return np.median(times), np.std(times)
119
+
120
+
121
+ def _collect_runtimes(
122
+ func: Callable,
123
+ label: str,
124
+ max_log2f: int,
125
+ nrep: int = 5,
126
+ outdir: str = ".",
127
+ ) -> pd.DataFrame:
128
+ # Generate a list of NF values from 2^max_log2f to 2^2
129
+ nf_values = np.array([2**i for i in range(2, max_log2f + 1)]).astype(
130
+ int
131
+ )[::-1]
132
+
133
+ results = np.zeros((len(nf_values), 3))
134
+ bar = tqdm(nf_values, desc=f"Running {label}")
135
+ for i, Nf in enumerate(bar):
136
+ ND = Nf * Nf
137
+ bar.set_postfix(ND=f"2**{int(np.log2(ND))}")
138
+ func_args = _generate_func_args(ND, label)
139
+ try:
140
+ _times = _collect_runtime(func, func_args, nrep)
141
+ except Exception as e:
142
+ print(f"Error processing ND={ND}: {e}")
143
+ _times = (np.nan, np.nan)
144
+ results[i] = np.array([ND, *_times])
145
+
146
+ runtimes = pd.DataFrame(results, columns=["ND", "median", "std"])
147
+ runtimes.to_csv(f"{outdir}/runtime_{label}.csv", index=False)
148
+
149
+ print_runtimes(runtimes, label)
150
+ return runtimes
151
+
152
+
153
+ def _collect_jax_runtimes(*args, **kwargs):
154
+ import jax
155
+
156
+ from pywavelet.transforms.jax.forward.from_freq import (
157
+ transform_wavelet_freq_helper as jax_transform,
158
+ )
159
+
160
+ JAX_DEVICE = jax.default_backend()
161
+
162
+ jax_label = f"jax_{JAX_DEVICE}_{PRECISION}"
163
+ _collect_runtimes(jax_transform, jax_label, *args, **kwargs)
164
+
165
+
166
+ def _collect_cupy_runtimes(*args, **kwargs):
167
+ from pywavelet.transforms.cupy.forward.from_freq import (
168
+ transform_wavelet_freq_helper as cp_transform,
169
+ )
170
+
171
+ _collect_runtimes(cp_transform, f"cupy_{PRECISION}", *args, **kwargs)
172
+
173
+
174
+ def _collect_numpy_runtimes(*args, **kwargs):
175
+ from pywavelet.transforms.numpy.forward.from_freq import (
176
+ transform_wavelet_freq_helper as np_transform,
177
+ )
178
+
179
+ _collect_runtimes(np_transform, f"numpy_{PRECISION}", *args, **kwargs)
180
+
181
+
182
+ def collect_runtimes_for_backend(
183
+ backend: str, max_log2f: int, nrep: int = 5, outdir: str = "."
184
+ ):
185
+ if "numpy" in backend:
186
+ _collect_numpy_runtimes(max_log2f, nrep, outdir)
187
+ elif "cupy" in backend:
188
+ _collect_cupy_runtimes(max_log2f, nrep, outdir)
189
+ elif "jax" in backend:
190
+ _collect_jax_runtimes(max_log2f, nrep, outdir)
191
+ else:
192
+ raise ValueError(f"Unknown backend: {backend}")
@@ -0,0 +1,76 @@
1
+ import glob
2
+ import json
3
+ import os
4
+ from typing import Tuple
5
+
6
+ import matplotlib.pyplot as plt
7
+ import numpy as np
8
+ import pandas as pd
9
+
10
+ __all__ = ["plot_runtimes"]
11
+
12
+
13
+ def _cache_all_runtimes(outdir: str):
14
+ data = {}
15
+ for f in glob.glob(os.path.join(outdir, "runtime_*.csv")):
16
+ df = pd.read_csv(f)
17
+ label = f.split("runtime_")[1].split(".")[0]
18
+ data[label] = df.to_dict(orient="records")
19
+
20
+ cache_fn = os.path.join(outdir, "runtimes.json")
21
+ # load any existing data
22
+ if os.path.exists(cache_fn):
23
+ with open(cache_fn, "r") as f:
24
+ existing_data = json.load(f)
25
+ data.update(existing_data)
26
+
27
+ # save to json
28
+ with open(cache_fn, "w") as f:
29
+ json.dump(data, f, indent=4)
30
+
31
+ return cache_fn
32
+
33
+
34
+ def plot_runtimes(outdir: str):
35
+ cache_fn = _cache_all_runtimes(outdir)
36
+
37
+ fig, ax = plt.subplots(figsize=(4, 3.5))
38
+
39
+ with open(cache_fn, "r") as f:
40
+ data = json.load(f)
41
+ for label, runtimes in data.items():
42
+ runtimes = pd.DataFrame(runtimes)
43
+ _plot(runtimes, ax=ax, label=label)
44
+ ax.legend(frameon=False)
45
+
46
+ fig.tight_layout()
47
+ fig.savefig(os.path.join(outdir, "runtimes.png"), bbox_inches="tight")
48
+
49
+
50
+ def _plot(
51
+ runtimes: pd.DataFrame, ax=None, **kwgs
52
+ ) -> Tuple[plt.Figure, plt.Axes]:
53
+ if ax is None:
54
+ fig, ax = plt.subplots(figsize=(4, 3.5))
55
+ fig = ax.figure
56
+
57
+ runtimes = runtimes.dropna()
58
+ runtimes = runtimes.sort_values(by="ND")
59
+
60
+ nds = runtimes["ND"].values
61
+ times, stds = runtimes["median"], runtimes["std"]
62
+ ax.plot(nds, times, **kwgs)
63
+ kwgs["label"] = None
64
+ ax.fill_between(
65
+ nds,
66
+ np.array(times) - np.array(stds),
67
+ np.array(times) + np.array(stds),
68
+ alpha=0.3,
69
+ **kwgs,
70
+ )
71
+
72
+ ax.set_yscale("log")
73
+ ax.set_xscale("log")
74
+ ax.set_xlabel("Number of Data Points")
75
+ ax.set_ylabel("Runtime (s)")
76
+ return fig, ax
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pywavelet
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: WDM wavelet transform your time/freq series!
5
5
  Author-email: Pywavelet Team <avi.vajpeyi@gmail.com>
6
6
  Project-URL: Homepage, https://pywavelet.github.io/pywavelet/
@@ -23,6 +23,7 @@ Requires-Dist: rocket-fft
23
23
  Requires-Dist: astropy>=5.2.1
24
24
  Requires-Dist: jaxtyping
25
25
  Requires-Dist: beartype
26
+ Requires-Dist: click
26
27
  Provides-Extra: jax
27
28
  Requires-Dist: jax; extra == "jax"
28
29
  Provides-Extra: cupy
@@ -39,6 +40,7 @@ Requires-Dist: mypy; extra == "dev"
39
40
  Requires-Dist: jupyter-book; extra == "dev"
40
41
  Requires-Dist: GitPython; extra == "dev"
41
42
  Requires-Dist: nbconvert; extra == "dev"
43
+ Requires-Dist: pytest-click; extra == "dev"
42
44
 
43
45
  pywavelet
44
46
  #########
@@ -0,0 +1,49 @@
1
+ pywavelet/__init__.py,sha256=8X2TyXnUB7KKvEOiwFmgBS2S5b9ewSzhHYiqenSaZGA,1078
2
+ pywavelet/_version.py,sha256=zkhRarrvPoGA1yWjS9_zVM80dWqpDesNn9DiHcF4JWM,511
3
+ pywavelet/backend.py,sha256=E6773GsImeEmfmU7D3dR93jpPR977BNJyudD5DTY2qs,5288
4
+ pywavelet/logger.py,sha256=FGlR6ebuGYZbPjfzqQRM-6hs86v19-mUmIU9ipcZIy4,501
5
+ pywavelet/transforms/__init__.py,sha256=oG8LgQN0FMMeTWRxeUKgHXAAP6hdaVW9fL49vPwQiy4,863
6
+ pywavelet/transforms/phi_computer.py,sha256=XCfM_I4R1j_p68GOPPH7lCL1-surmT1pudYHlbfKjrU,4175
7
+ pywavelet/transforms/cupy/__init__.py,sha256=8BBE6msB071WdstA860a7g64C0aHT2PZsqfEgP6nmkA,336
8
+ pywavelet/transforms/cupy/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
9
+ pywavelet/transforms/cupy/forward/from_freq.py,sha256=FM8MNTOFk4FWpNi9ag0VQ7JzMd2iQIsNlOHsHjHYfeU,2701
10
+ pywavelet/transforms/cupy/forward/from_time.py,sha256=Og9l0KurMUdbBPyvZcP1znGimMcKBgzywF0nPLTNBes,1524
11
+ pywavelet/transforms/cupy/forward/main.py,sha256=c7QgrG10sdZvoGza3WspC_NiAzogH3ekiHbSBtJHULQ,3247
12
+ pywavelet/transforms/cupy/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
13
+ pywavelet/transforms/cupy/inverse/main.py,sha256=5pTtGNNdwlSGDQV4sqGyzUPnmqFUgFOFUFfpqjZx07Q,1608
14
+ pywavelet/transforms/cupy/inverse/to_freq.py,sha256=MVz9BfINw-RdBxPTQH8e_-p1628-15j0aSvEJhoS7iQ,1957
15
+ pywavelet/transforms/jax/__init__.py,sha256=_JG9EaHKD95U-Nzm5zQ1RHQ7XuBjZarMa7VpZ-y7rgY,941
16
+ pywavelet/transforms/jax/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
17
+ pywavelet/transforms/jax/forward/from_freq.py,sha256=EzCw1bPDio0G5qqimjilFVzF7TuLRqsAzqlY_mgqX30,3078
18
+ pywavelet/transforms/jax/forward/from_time.py,sha256=4RZ8-ah0qOMP20i3-xThVWddxa1QTCvZKnGpNAJbb0g,1765
19
+ pywavelet/transforms/jax/forward/main.py,sha256=V7JM77aQuGvzE0i6VogKeVrTdhrdyy3kCWJKQzi5wG8,3165
20
+ pywavelet/transforms/jax/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
21
+ pywavelet/transforms/jax/inverse/main.py,sha256=_NAoEAjjEzbIcUOEEfriycZW6_a6yhGiKdtpU52H8i8,1568
22
+ pywavelet/transforms/jax/inverse/to_freq.py,sha256=IzLt5SFkEyO2vPDi4ihXXd9nlt6TfQBG8R8iyqAoqTA,2413
23
+ pywavelet/transforms/numpy/__init__.py,sha256=1Ibsup9UwMajeZ9NCQ4BN15qZTeJ_EHkgGu8XNFdA18,255
24
+ pywavelet/transforms/numpy/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
25
+ pywavelet/transforms/numpy/forward/from_freq.py,sha256=7y4oPRBWz73q8NEqwyw7ux-rFHFONGHLn43mM8xR1OM,4718
26
+ pywavelet/transforms/numpy/forward/from_time.py,sha256=-Y6VEKwDCYBAHAjLdO46vT-6alpM5fXTgTZ_xkYxqA8,2381
27
+ pywavelet/transforms/numpy/forward/main.py,sha256=bHI6XQ7iNo9u9lyJ9QazEr_3VjtSh2KLw3kM3uDwsog,4231
28
+ pywavelet/transforms/numpy/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
29
+ pywavelet/transforms/numpy/inverse/main.py,sha256=3Lxxhh9VnElToaTJHgpWE-BFzKQrGEQFupnoSgJzKfk,2972
30
+ pywavelet/transforms/numpy/inverse/to_freq.py,sha256=lgb0p0M9wuhsB1mjvzqKZXuorhMickvkqO4T0A5bE_E,4914
31
+ pywavelet/transforms/numpy/inverse/to_time.py,sha256=w5vmImdsb_4YeInZtXh0llsThLTxS0tmYDlNGJ-IUew,5080
32
+ pywavelet/types/__init__.py,sha256=5YptzQvYBnRfC8N5lpOBf9I1lzpJ0pw0QMnvIcwP3YI,122
33
+ pywavelet/types/common.py,sha256=eDM8vVC1sC4NuElJhV7olBfQJ8ScQNKoVIPNwJs-_M4,1305
34
+ pywavelet/types/frequencyseries.py,sha256=tAbZr0vEBCe0MwH7ZjaK00UVupjRNxvjoW9LCMsiiMo,7531
35
+ pywavelet/types/plotting.py,sha256=iUgpLsczs38im4t9Uu77K4qjegXItEqfPACpsKBixo8,11000
36
+ pywavelet/types/timeseries.py,sha256=1oYC3lkbFk7czLP5BqAPsuhzbm33yd8xL2U0lF_btBs,9477
37
+ pywavelet/types/wavelet.py,sha256=IGmVKckac5LIbj3Jo_rUz3gNL81VsCgbVKnifdK51hE,13645
38
+ pywavelet/types/wavelet_bins.py,sha256=j6WcCdjvWFtsp6MdmDq1w8RRNGCBJq6UXxDbyxhF5z4,1407
39
+ pywavelet/utils/__init__.py,sha256=OqzNdR3Qu7gkIor45JgrVpa3scY_7whVCR2JLLLNRkE,143
40
+ pywavelet/utils/analysis.py,sha256=7f7Z7d4ssLxUJDzgvmhphJVSp-aeeynlq09ixNygmWs,1995
41
+ pywavelet/utils/timing_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ pywavelet/utils/timing_cli/cli.py,sha256=BGvmdTrnnEpUd_aEcyvNABGGdZD8eAXyDdzlmwFLAsM,2236
43
+ pywavelet/utils/timing_cli/collect_runtimes.py,sha256=ZcDYPEtFCHYbVTrbjpEsC04CRZW3DS2KtDJIoUtXjY8,6033
44
+ pywavelet/utils/timing_cli/plot.py,sha256=1Buq9quGsWrLciw-m-y-FF-otoTEGp3wupOmUFbG_gw,1918
45
+ pywavelet-0.2.8.dist-info/METADATA,sha256=JFpDY1nobMl_b_-vC3t6_Lf5PX9SEMkN24YYv25Q6Zk,2636
46
+ pywavelet-0.2.8.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
47
+ pywavelet-0.2.8.dist-info/entry_points.txt,sha256=4NNrJOcJ8ayoXyNn5g0OxhKsxdvJkvEerTm0PixmtdY,87
48
+ pywavelet-0.2.8.dist-info/top_level.txt,sha256=g0Ezt0Rg0X-nrd-a0pAXKVRkuWNsF2M9Ynsjb9b2UYQ,10
49
+ pywavelet-0.2.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.0.2)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ pywavelet_timer = pywavelet.utils.timing_cli.cli:cli_collect_runtime
@@ -1,43 +0,0 @@
1
- pywavelet/__init__.py,sha256=K7pQ8W2w9d5qwI4KzPdTpRn5-YaUfMpjnJmg7oQnYSM,508
2
- pywavelet/_version.py,sha256=Xk20v7uvkFqkpy9aLJzVngs1eKQn0FYUP2oyA1MEQUU,511
3
- pywavelet/backend.py,sha256=Ixl9nVP7Lobbyff5WF-pqXo0zuM7RVbyC1j35dSO3jI,2791
4
- pywavelet/logger.py,sha256=DyKC-pJ_N9GlVeXL00E1D8hUd8GceBg-pnn7g1YPKcM,391
5
- pywavelet/utils.py,sha256=FqQ6V41WGHMbLC4wv_1xnwHjOPDVSWnG78sAeqbYtYU,1994
6
- pywavelet/transforms/__init__.py,sha256=c5dnTdzm-Se3idp2LP-dHvk6fmv_ynDCixIDfLCjEPw,865
7
- pywavelet/transforms/phi_computer.py,sha256=jVxeWtfx5P1H-_HdMsK7xHuINZAjH9bj7cA8CJ98isw,3667
8
- pywavelet/transforms/cupy/__init__.py,sha256=8BBE6msB071WdstA860a7g64C0aHT2PZsqfEgP6nmkA,336
9
- pywavelet/transforms/cupy/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
10
- pywavelet/transforms/cupy/forward/from_freq.py,sha256=GoKpg019o0Ld5QqkHOt8bpzV_w74Nii__y4tIhNcuV4,3513
11
- pywavelet/transforms/cupy/forward/from_time.py,sha256=Og9l0KurMUdbBPyvZcP1znGimMcKBgzywF0nPLTNBes,1524
12
- pywavelet/transforms/cupy/forward/main.py,sha256=g2Pl-j4LBg7GLlzzCSoCGuEd6NNCckJ4UvC-Pppky2w,3071
13
- pywavelet/transforms/cupy/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
14
- pywavelet/transforms/cupy/inverse/main.py,sha256=5pTtGNNdwlSGDQV4sqGyzUPnmqFUgFOFUFfpqjZx07Q,1608
15
- pywavelet/transforms/cupy/inverse/to_freq.py,sha256=gpqu5Y65ZvuET5jANp6UAuAamg2PRkpAlaAjWPh7uBk,1835
16
- pywavelet/transforms/jax/__init__.py,sha256=_JG9EaHKD95U-Nzm5zQ1RHQ7XuBjZarMa7VpZ-y7rgY,941
17
- pywavelet/transforms/jax/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
18
- pywavelet/transforms/jax/forward/from_freq.py,sha256=XYtRziPD7MCbeKf4HAucQrMzko4T0zmNV7jg5bziVwA,3910
19
- pywavelet/transforms/jax/forward/from_time.py,sha256=4RZ8-ah0qOMP20i3-xThVWddxa1QTCvZKnGpNAJbb0g,1765
20
- pywavelet/transforms/jax/forward/main.py,sha256=7gpHUycEclDwlb6KpLqUZoIkhJjPH0sBITBGVqepYAI,3061
21
- pywavelet/transforms/jax/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
22
- pywavelet/transforms/jax/inverse/main.py,sha256=_NAoEAjjEzbIcUOEEfriycZW6_a6yhGiKdtpU52H8i8,1568
23
- pywavelet/transforms/jax/inverse/to_freq.py,sha256=x_Apiob0ZSg7UAhDSyKPxFAZXijWABJxzla526kuD8Y,3184
24
- pywavelet/transforms/numpy/__init__.py,sha256=1Ibsup9UwMajeZ9NCQ4BN15qZTeJ_EHkgGu8XNFdA18,255
25
- pywavelet/transforms/numpy/forward/__init__.py,sha256=E_A8plyfTSKDRXlAAvdiRMTe9f3Y6MbK3pXMHFg8mr0,121
26
- pywavelet/transforms/numpy/forward/from_freq.py,sha256=UNf0mLdaN9XrrHPYIiLEzdAwElReZJHzZtuykSZE9iU,4556
27
- pywavelet/transforms/numpy/forward/from_time.py,sha256=-Y6VEKwDCYBAHAjLdO46vT-6alpM5fXTgTZ_xkYxqA8,2381
28
- pywavelet/transforms/numpy/forward/main.py,sha256=M4ELrzDone4XVO54Yf3_khTEFjVaeykES31kwhLubyU,3949
29
- pywavelet/transforms/numpy/inverse/__init__.py,sha256=J4KIzPzbHNg_8fV_c1MpPq3slSqHQV0j3VFrjfd1Nog,121
30
- pywavelet/transforms/numpy/inverse/main.py,sha256=3Lxxhh9VnElToaTJHgpWE-BFzKQrGEQFupnoSgJzKfk,2972
31
- pywavelet/transforms/numpy/inverse/to_freq.py,sha256=lgb0p0M9wuhsB1mjvzqKZXuorhMickvkqO4T0A5bE_E,4914
32
- pywavelet/transforms/numpy/inverse/to_time.py,sha256=w5vmImdsb_4YeInZtXh0llsThLTxS0tmYDlNGJ-IUew,5080
33
- pywavelet/types/__init__.py,sha256=5YptzQvYBnRfC8N5lpOBf9I1lzpJ0pw0QMnvIcwP3YI,122
34
- pywavelet/types/common.py,sha256=_SMmXLrRO0Nw_A7Oa6C10kZAbj8jq9agXx7tMDjnYJg,1277
35
- pywavelet/types/frequencyseries.py,sha256=tAbZr0vEBCe0MwH7ZjaK00UVupjRNxvjoW9LCMsiiMo,7531
36
- pywavelet/types/plotting.py,sha256=qjv5IeuSEc9WWkfJYvz1eQRgTKTspWxj4lwB5N69SbU,11002
37
- pywavelet/types/timeseries.py,sha256=sataMW4BPFqi23h_NBZ_U9-Svuo9pLXVRmUJI6KTXG0,9430
38
- pywavelet/types/wavelet.py,sha256=lDhpy9bEb_I-YDQbI3elaWuU8l9E2P6wDcuAQONv8lA,13591
39
- pywavelet/types/wavelet_bins.py,sha256=gBjhWwfjcbbSnbGZVMNUeFFVUo2DVxJS4abDUVCL7ts,1458
40
- pywavelet-0.2.7.dist-info/METADATA,sha256=5oaGFUO6ASLeTlweptCKP5D9LUGkLQbmJNfWMVYgwxc,2571
41
- pywavelet-0.2.7.dist-info/WHEEL,sha256=DK49LOLCYiurdXXOXwGJm6U4DkHkg4lcxjhqwRa0CP4,91
42
- pywavelet-0.2.7.dist-info/top_level.txt,sha256=g0Ezt0Rg0X-nrd-a0pAXKVRkuWNsF2M9Ynsjb9b2UYQ,10
43
- pywavelet-0.2.7.dist-info/RECORD,,