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.
- pywavelet/__init__.py +17 -5
- pywavelet/_version.py +2 -2
- pywavelet/backend.py +98 -20
- pywavelet/logger.py +6 -6
- pywavelet/transforms/__init__.py +1 -3
- pywavelet/transforms/cupy/forward/from_freq.py +64 -67
- pywavelet/transforms/cupy/forward/main.py +11 -7
- pywavelet/transforms/cupy/inverse/to_freq.py +54 -50
- pywavelet/transforms/jax/forward/from_freq.py +69 -76
- pywavelet/transforms/jax/forward/main.py +9 -6
- pywavelet/transforms/jax/inverse/to_freq.py +17 -28
- pywavelet/transforms/numpy/forward/from_freq.py +14 -6
- pywavelet/transforms/numpy/forward/main.py +13 -4
- pywavelet/transforms/phi_computer.py +35 -20
- pywavelet/types/common.py +1 -1
- pywavelet/types/plotting.py +1 -1
- pywavelet/types/timeseries.py +1 -0
- pywavelet/types/wavelet.py +4 -2
- pywavelet/types/wavelet_bins.py +3 -9
- pywavelet/utils/__init__.py +6 -0
- pywavelet/{utils.py → utils/analysis.py} +1 -1
- pywavelet/utils/timing_cli/__init__.py +0 -0
- pywavelet/utils/timing_cli/cli.py +95 -0
- pywavelet/utils/timing_cli/collect_runtimes.py +192 -0
- pywavelet/utils/timing_cli/plot.py +76 -0
- {pywavelet-0.2.7.dist-info → pywavelet-0.2.8.dist-info}/METADATA +3 -1
- pywavelet-0.2.8.dist-info/RECORD +49 -0
- {pywavelet-0.2.7.dist-info → pywavelet-0.2.8.dist-info}/WHEEL +1 -1
- pywavelet-0.2.8.dist-info/entry_points.txt +2 -0
- pywavelet-0.2.7.dist-info/RECORD +0 -43
- {pywavelet-0.2.7.dist-info → pywavelet-0.2.8.dist-info}/top_level.txt +0 -0
@@ -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.
|
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,,
|
pywavelet-0.2.7.dist-info/RECORD
DELETED
@@ -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,,
|
File without changes
|