edmkit 0.0.17__tar.gz → 0.0.18__tar.gz

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.
Files changed (48) hide show
  1. edmkit-0.0.18/PKG-INFO +87 -0
  2. edmkit-0.0.18/README.md +73 -0
  3. {edmkit-0.0.17 → edmkit-0.0.18}/pyproject.toml +1 -1
  4. {edmkit-0.0.17 → edmkit-0.0.18}/pyproject.toml.orig +1 -1
  5. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/knn.py +13 -17
  6. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/simplex_projection.py +9 -12
  7. edmkit-0.0.17/PKG-INFO +0 -77
  8. edmkit-0.0.17/README.md +0 -63
  9. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/ccm.py +0 -0
  10. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/embedding.py +0 -0
  11. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/__init__.py +0 -0
  12. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/chua.py +0 -0
  13. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/ctrnn.py +0 -0
  14. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/double_pendulum.py +0 -0
  15. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/duffing.py +0 -0
  16. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/euler_spiral.py +0 -0
  17. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/fitzhugh_nagumo.py +0 -0
  18. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/hindmarsh_rose.py +0 -0
  19. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/kuramoto.py +0 -0
  20. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/lorenz.py +0 -0
  21. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/lorenz96.py +0 -0
  22. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/lotka_volterra.py +0 -0
  23. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/mackey_glass.py +0 -0
  24. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/morris_lecar.py +0 -0
  25. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/pyloric.py +0 -0
  26. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/rk45.py +0 -0
  27. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/rossler.py +0 -0
  28. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/rulkov_map.py +0 -0
  29. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/generate/three_scroll.py +0 -0
  30. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/metrics/__init__.py +0 -0
  31. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/metrics/mae.py +0 -0
  32. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/metrics/pearson_correlation.py +0 -0
  33. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/metrics/rmse.py +0 -0
  34. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/__init__.py +0 -0
  35. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/linear_operator.py +0 -0
  36. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/soft.py +0 -0
  37. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/simplex_projection/soft_linear_operator.py +0 -0
  38. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/smap/__init__.py +0 -0
  39. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/smap/coefficients.py +0 -0
  40. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/smap/linear_operator.py +0 -0
  41. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/smap/smap.py +0 -0
  42. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/splits.py +0 -0
  43. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/theiler_window.py +0 -0
  44. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/types.py +0 -0
  45. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/util.py +0 -0
  46. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/wavelet/__init__.py +0 -0
  47. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/wavelet/continuous.py +0 -0
  48. {edmkit-0.0.17 → edmkit-0.0.18}/src/edmkit/wavelet/discrete.py +0 -0
edmkit-0.0.18/PKG-INFO ADDED
@@ -0,0 +1,87 @@
1
+ Metadata-Version: 2.3
2
+ Name: edmkit
3
+ Version: 0.0.18
4
+ Summary: Simple EDM (Empirical Dynamic Modeling) library
5
+ Author: FUJISHIGE TEMMA
6
+ Author-email: FUJISHIGE TEMMA <tenma.x0@gmail.com>
7
+ Requires-Dist: kdtree-rs>=0.3.1
8
+ Requires-Dist: numpy>=2.5.4
9
+ Requires-Dist: scipy>=1.18.1
10
+ Requires-Dist: tinygrad>=0.14.0
11
+ Requires-Dist: tinysolve>=0.3.0
12
+ Requires-Python: >=3.13
13
+ Description-Content-Type: text/markdown
14
+
15
+ # edmkit
16
+
17
+ This library is a collection of tools and utilities that are useful for Empirical Data Modeling (EDM) and related tasks. The library is designed to be fast and lightweight, and easy to use.
18
+
19
+ [benchmarks](./benchmarks)
20
+
21
+ ![](./benchmarks/benchmarks.png)
22
+
23
+ [compare.py](./benchmarks/compare.py)
24
+
25
+ ![](./benchmarks/compare.png)
26
+
27
+ Measured on an Apple M4 Pro on November 4, 2026. Times are medians from `pytest-benchmark`. Parallel CCM uses 14 workers. Peak memory is process-tree RSS in MiB, sampled separately from timing for each case. It includes the interpreter, input, and worker processes. Summed RSS can count shared pages in more than one process.
28
+
29
+ | simplex N | edmkit [ms] | pyEDM [ms] | speedup | edmkit peak [MiB] | pyEDM peak [MiB] |
30
+ | ---: | ---: | ---: | ---: | ---: | ---: |
31
+ | 500 | 0.17 | 1.5 | 9.0× | 168 | 169 |
32
+ | 1,000 | 0.39 | 2.4 | 6.1× | 169 | 170 |
33
+ | 2,000 | 0.81 | 4.4 | 5.5× | 168 | 170 |
34
+ | 5,000 | 2.2 | 11.5 | 5.3× | 170 | 175 |
35
+ | 10,000 | 4.7 | 23.8 | 5.0× | 172 | 180 |
36
+ | 20,000 | 10.2 | 50.3 | 4.9× | 176 | 193 |
37
+
38
+ | smap N | edmkit [ms] | pyEDM [ms] | speedup | edmkit peak [MiB] | pyEDM peak [MiB] |
39
+ | ---: | ---: | ---: | ---: | ---: | ---: |
40
+ | 500 | 2.1 | 36.6 | 17.9× | 176 | 180 |
41
+ | 1,000 | 8.7 | 128.3 | 14.7× | 192 | 216 |
42
+ | 2,000 | 22.0 | 513.6 | 23.4× | 261 | 357 |
43
+ | 5,000 | 193.9 | 3,376.7 | 17.4× | 744 | 1,344 |
44
+
45
+ | ccm N | edmkit [ms] | pyEDM [ms] | speedup | edmkit parallel [ms] | pyEDM parallel [ms] | speedup |
46
+ | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
47
+ | 500 | 106.4 | 151.7 | 1.4× | 19.5 | 68.0 | 3.5× |
48
+ | 1,000 | 168.4 | 327.0 | 1.9× | 26.3 | 91.9 | 3.5× |
49
+ | 2,000 | 329.7 | 745.1 | 2.3× | 48.8 | 148.3 | 3.0× |
50
+ | 5,000 | 668.9 | 1,945.7 | 2.9× | 97.4 | 397.5 | 4.1× |
51
+ | 10,000 | 1,253.6 | 4,176.7 | 3.3× | 164.6 | 585.4 | 3.6× |
52
+
53
+ | ccm N | edmkit peak [MiB] | pyEDM peak [MiB] | edmkit parallel peak [MiB] | pyEDM parallel peak [MiB] |
54
+ | ---: | ---: | ---: | ---: | ---: |
55
+ | 500 | 171 | 170 | 191 | 1,417 |
56
+ | 1,000 | 173 | 176 | 196 | 1,429 |
57
+ | 2,000 | 179 | 186 | 207 | 1,460 |
58
+ | 5,000 | 204 | 224 | 239 | 1,624 |
59
+ | 10,000 | 230 | 362 | 297 | 1,804 |
60
+
61
+
62
+ ## Installation
63
+
64
+ To install the library, you can use pip:
65
+
66
+ ```bash
67
+ pip install edmkit
68
+ ```
69
+
70
+ Or you can also use [uv](https://docs.astral.sh/uv/):
71
+
72
+ ```bash
73
+ uv add edmkit
74
+ ```
75
+
76
+ ## Testing
77
+
78
+ ```bash
79
+ # Run all tests
80
+ uv run pytest
81
+
82
+ # Skip slow tests
83
+ uv run pytest -m "not slow"
84
+
85
+ # Run with CI profile (more hypothesis examples)
86
+ HYPOTHESIS_PROFILE=ci uv run pytest
87
+ ```
@@ -0,0 +1,73 @@
1
+ # edmkit
2
+
3
+ This library is a collection of tools and utilities that are useful for Empirical Data Modeling (EDM) and related tasks. The library is designed to be fast and lightweight, and easy to use.
4
+
5
+ [benchmarks](./benchmarks)
6
+
7
+ ![](./benchmarks/benchmarks.png)
8
+
9
+ [compare.py](./benchmarks/compare.py)
10
+
11
+ ![](./benchmarks/compare.png)
12
+
13
+ Measured on an Apple M4 Pro on November 4, 2026. Times are medians from `pytest-benchmark`. Parallel CCM uses 14 workers. Peak memory is process-tree RSS in MiB, sampled separately from timing for each case. It includes the interpreter, input, and worker processes. Summed RSS can count shared pages in more than one process.
14
+
15
+ | simplex N | edmkit [ms] | pyEDM [ms] | speedup | edmkit peak [MiB] | pyEDM peak [MiB] |
16
+ | ---: | ---: | ---: | ---: | ---: | ---: |
17
+ | 500 | 0.17 | 1.5 | 9.0× | 168 | 169 |
18
+ | 1,000 | 0.39 | 2.4 | 6.1× | 169 | 170 |
19
+ | 2,000 | 0.81 | 4.4 | 5.5× | 168 | 170 |
20
+ | 5,000 | 2.2 | 11.5 | 5.3× | 170 | 175 |
21
+ | 10,000 | 4.7 | 23.8 | 5.0× | 172 | 180 |
22
+ | 20,000 | 10.2 | 50.3 | 4.9× | 176 | 193 |
23
+
24
+ | smap N | edmkit [ms] | pyEDM [ms] | speedup | edmkit peak [MiB] | pyEDM peak [MiB] |
25
+ | ---: | ---: | ---: | ---: | ---: | ---: |
26
+ | 500 | 2.1 | 36.6 | 17.9× | 176 | 180 |
27
+ | 1,000 | 8.7 | 128.3 | 14.7× | 192 | 216 |
28
+ | 2,000 | 22.0 | 513.6 | 23.4× | 261 | 357 |
29
+ | 5,000 | 193.9 | 3,376.7 | 17.4× | 744 | 1,344 |
30
+
31
+ | ccm N | edmkit [ms] | pyEDM [ms] | speedup | edmkit parallel [ms] | pyEDM parallel [ms] | speedup |
32
+ | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
33
+ | 500 | 106.4 | 151.7 | 1.4× | 19.5 | 68.0 | 3.5× |
34
+ | 1,000 | 168.4 | 327.0 | 1.9× | 26.3 | 91.9 | 3.5× |
35
+ | 2,000 | 329.7 | 745.1 | 2.3× | 48.8 | 148.3 | 3.0× |
36
+ | 5,000 | 668.9 | 1,945.7 | 2.9× | 97.4 | 397.5 | 4.1× |
37
+ | 10,000 | 1,253.6 | 4,176.7 | 3.3× | 164.6 | 585.4 | 3.6× |
38
+
39
+ | ccm N | edmkit peak [MiB] | pyEDM peak [MiB] | edmkit parallel peak [MiB] | pyEDM parallel peak [MiB] |
40
+ | ---: | ---: | ---: | ---: | ---: |
41
+ | 500 | 171 | 170 | 191 | 1,417 |
42
+ | 1,000 | 173 | 176 | 196 | 1,429 |
43
+ | 2,000 | 179 | 186 | 207 | 1,460 |
44
+ | 5,000 | 204 | 224 | 239 | 1,624 |
45
+ | 10,000 | 230 | 362 | 297 | 1,804 |
46
+
47
+
48
+ ## Installation
49
+
50
+ To install the library, you can use pip:
51
+
52
+ ```bash
53
+ pip install edmkit
54
+ ```
55
+
56
+ Or you can also use [uv](https://docs.astral.sh/uv/):
57
+
58
+ ```bash
59
+ uv add edmkit
60
+ ```
61
+
62
+ ## Testing
63
+
64
+ ```bash
65
+ # Run all tests
66
+ uv run pytest
67
+
68
+ # Skip slow tests
69
+ uv run pytest -m "not slow"
70
+
71
+ # Run with CI profile (more hypothesis examples)
72
+ HYPOTHESIS_PROFILE=ci uv run pytest
73
+ ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "edmkit"
3
- version = "0.0.17"
3
+ version = "0.0.18"
4
4
  description = "Simple EDM (Empirical Dynamic Modeling) library"
5
5
  readme = "README.md"
6
6
  requires-python = ">= 3.13"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "edmkit"
3
- version = "0.0.17"
3
+ version = "0.0.18"
4
4
  description = "Simple EDM (Empirical Dynamic Modeling) library"
5
5
  authors = [{ name = "FUJISHIGE TEMMA", email = "tenma.x0@gmail.com" }]
6
6
  readme = "README.md"
@@ -32,38 +32,34 @@ def knn(X: np.ndarray, Q: np.ndarray, k: int, mask: Mask | None = None) -> tuple
32
32
  if N < k:
33
33
  raise ValueError(f"Not enough points in X to find {k} neighbors, got N={N}")
34
34
 
35
- tree = KDTree(X)
36
- if mask is None:
35
+ # smaller leaves improve pruning in low dimensions.
36
+ tree = KDTree(X, leafsize=16 if X.shape[-1] <= 8 else 32)
37
+ if mask is None or len(Q) == 0:
37
38
  return tree.query(Q, k=k)
38
39
 
39
40
  distances = np.empty((Q.shape[0], k))
40
41
  indices = np.empty((Q.shape[0], k), dtype=np.intp)
41
42
 
42
- def fetch(pending: np.ndarray, k_query: int) -> np.ndarray:
43
- """Fill `distances` and `indices` with the k nearest neighbors for the `pending` queries, returning the queries that still need more neighbors."""
43
+ pending = np.arange(Q.shape[0])
44
+ k_query = min(k + 1, N)
44
45
 
45
- # over fetch (k_query > k)
46
- _distances, _indices = tree.query(Q[pending], k=k_query)
46
+ while pending.size > 0:
47
+ _distances, _indices = tree.query(Q if pending.size == len(Q) else Q[pending], k=k_query)
47
48
 
48
- # evaluate the mask and filter the resultss
49
+ # evaluate the mask and keep the first k valid candidates.
49
50
  valid = np.broadcast_to(np.asarray(mask(pending[:, None], _indices), dtype=bool), _indices.shape)
50
51
  count = valid.sum(axis=-1)
51
52
 
52
53
  if k_query == N and count.min() < k:
53
54
  raise ValueError(f"Not enough unmasked points in X to find {k} neighbors, got {count.min()} for some query")
54
55
 
55
- # take the first k valid neighbors for the queries that have them
56
56
  done = count >= k
57
- first_k = valid[done] & (np.cumsum(valid[done], axis=-1) <= k)
58
- distances[pending[done]] = _distances[done][first_k].reshape(-1, k)
59
- indices[pending[done]] = _indices[done][first_k].reshape(-1, k)
60
-
61
- return pending[~done]
57
+ if done.any():
58
+ first_k = valid & (valid.cumsum(axis=-1, dtype=np.uint32) <= k) & done[:, None]
59
+ distances[pending[done]] = _distances[first_k].reshape(-1, k)
60
+ indices[pending[done]] = _indices[first_k].reshape(-1, k)
62
61
 
63
- k_query = min(k + 1, N)
64
- pending = fetch(np.arange(Q.shape[0]), k_query)
65
- while pending.size > 0:
62
+ pending = pending[~done]
66
63
  k_query = min(2 * k_query, N)
67
- pending = fetch(pending, k_query)
68
64
 
69
65
  return distances, indices
@@ -145,8 +145,6 @@ def _numpy(
145
145
  # treat the unbatched case as a single batch
146
146
  if X.ndim == 2:
147
147
  X, Y, Q = X[None], Y[None], Q[None]
148
- if mask is not None:
149
- mask = lambda _, *index, mask=mask: mask(*index)
150
148
 
151
149
  B, _, E = X.shape
152
150
  M = Q.shape[1]
@@ -154,19 +152,18 @@ def _numpy(
154
152
  if k <= 0:
155
153
  raise ValueError(f"k must be positive, got k={k}")
156
154
 
157
- distances = np.empty((B, M, k))
158
- indices = np.empty((B, M, k), dtype=np.intp)
155
+ predictions = np.empty((B, M, Y.shape[-1]), dtype=np.result_type(np.float64, Y.dtype))
159
156
  for b in range(B):
160
- distances[b], indices[b] = knn(X[b], Q[b], k, None if mask is None else partial(mask, b))
157
+ distances, indices = knn(X[b], Q[b], k, partial(mask, b) if return_ndim == 3 and mask is not None else mask)
161
158
 
162
- batch_index = np.arange(B)[:, None, None] # (B, 1, 1)
163
- Y_neighbors = Y[batch_index, indices] # (B, M, k, E')
159
+ # Neighbors are sorted. Clamp the scale and reuse the distance buffer.
160
+ d_min = np.fmax(distances[:, :1], 1e-6)
161
+ np.divide(distances, -d_min, out=distances)
162
+ weights = np.exp(distances, out=distances)
164
163
 
165
- # clamp to avoid division by zero
166
- d_min = np.fmax(distances.min(axis=-1, keepdims=True), 1e-6) # (B, M, 1)
167
- weights = np.exp(-distances / d_min) # (B, M, k)
168
-
169
- predictions = np.matmul(weights[..., None, :], Y_neighbors).squeeze(-2) / weights.sum(axis=-1, keepdims=True) # (B, M, E')
164
+ prediction = predictions[b]
165
+ np.matmul(weights[:, None, :], Y[b, indices], out=prediction[:, None, :])
166
+ prediction /= weights.sum(axis=-1, keepdims=True)
170
167
 
171
168
  if return_ndim == 1:
172
169
  return predictions[0, :, 0] # (M,)
edmkit-0.0.17/PKG-INFO DELETED
@@ -1,77 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: edmkit
3
- Version: 0.0.17
4
- Summary: Simple EDM (Empirical Dynamic Modeling) library
5
- Author: FUJISHIGE TEMMA
6
- Author-email: FUJISHIGE TEMMA <tenma.x0@gmail.com>
7
- Requires-Dist: kdtree-rs>=0.3.1
8
- Requires-Dist: numpy>=2.5.4
9
- Requires-Dist: scipy>=1.18.1
10
- Requires-Dist: tinygrad>=0.14.0
11
- Requires-Dist: tinysolve>=0.3.0
12
- Requires-Python: >=3.13
13
- Description-Content-Type: text/markdown
14
-
15
- # edmkit
16
-
17
- This library is a collection of tools and utilities that are useful for Empirical Data Modeling (EDM) and related tasks. The library is designed to be fast and lightweight, and easy to use.
18
-
19
- [benchmarks](./benchmarks)
20
-
21
- ![](./benchmarks/benchmarks.png)
22
-
23
- [compare.py](./benchmarks/compare.py)
24
-
25
- ![](./benchmarks/compare.png)
26
-
27
- | simplex N | edmkit [ms] | pyEDM [ms] | speedup |
28
- |---:|---:|---:|---:|
29
- | 500 | 0.2 | 1.4 | 8x |
30
- | 1,000 | 0.4 | 2.3 | 5x |
31
- | 2,000 | 0.9 | 4.2 | 5x |
32
- | 5,000 | 2.3 | 10.7 | 5x |
33
- | 10,000 | 4.9 | 22.8 | 5x |
34
- | 20,000 | 10.3 | 46.8 | 5x |
35
-
36
- | smap N | edmkit [ms] | pyEDM [ms] | speedup |
37
- |---:|---:|---:|---:|
38
- | 500 | 1.9 | 38.0 | 20x |
39
- | 1,000 | 7.5 | 132.1 | 18x |
40
- | 2,000 | 21.6 | 522.6 | 24x |
41
- | 5,000 | 183.7 | 3,364 | 18x |
42
-
43
- | ccm N | edmkit [ms] | pyEDM [ms] | speedup | edmkit parallel [ms] | pyEDM parallel [ms] | speedup |
44
- |---:|---:|---:|---:|---:|---:|---:|
45
- | 500 | 116.7 | 148.4 | 1.3x | 22.0 | 64.5 | 2.9x |
46
- | 1,000 | 197.1 | 316.8 | 1.6x | 31.8 | 89.7 | 2.8x |
47
- | 2,000 | 382.8 | 696.8 | 1.8x | 58.6 | 133.8 | 2.3x |
48
- | 5,000 | 788.0 | 1,863 | 2.4x | 108.9 | 283.5 | 2.6x |
49
- | 10,000 | 1,470 | 4,166 | 2.8x | 197.0 | 558.9 | 2.8x |
50
-
51
-
52
- ## Installation
53
-
54
- To install the library, you can use pip:
55
-
56
- ```bash
57
- pip install edmkit
58
- ```
59
-
60
- Or you can also use [uv](https://docs.astral.sh/uv/):
61
-
62
- ```bash
63
- uv add edmkit
64
- ```
65
-
66
- ## Testing
67
-
68
- ```bash
69
- # Run all tests
70
- uv run pytest
71
-
72
- # Skip slow tests
73
- uv run pytest -m "not slow"
74
-
75
- # Run with CI profile (more hypothesis examples)
76
- HYPOTHESIS_PROFILE=ci uv run pytest
77
- ```
edmkit-0.0.17/README.md DELETED
@@ -1,63 +0,0 @@
1
- # edmkit
2
-
3
- This library is a collection of tools and utilities that are useful for Empirical Data Modeling (EDM) and related tasks. The library is designed to be fast and lightweight, and easy to use.
4
-
5
- [benchmarks](./benchmarks)
6
-
7
- ![](./benchmarks/benchmarks.png)
8
-
9
- [compare.py](./benchmarks/compare.py)
10
-
11
- ![](./benchmarks/compare.png)
12
-
13
- | simplex N | edmkit [ms] | pyEDM [ms] | speedup |
14
- |---:|---:|---:|---:|
15
- | 500 | 0.2 | 1.4 | 8x |
16
- | 1,000 | 0.4 | 2.3 | 5x |
17
- | 2,000 | 0.9 | 4.2 | 5x |
18
- | 5,000 | 2.3 | 10.7 | 5x |
19
- | 10,000 | 4.9 | 22.8 | 5x |
20
- | 20,000 | 10.3 | 46.8 | 5x |
21
-
22
- | smap N | edmkit [ms] | pyEDM [ms] | speedup |
23
- |---:|---:|---:|---:|
24
- | 500 | 1.9 | 38.0 | 20x |
25
- | 1,000 | 7.5 | 132.1 | 18x |
26
- | 2,000 | 21.6 | 522.6 | 24x |
27
- | 5,000 | 183.7 | 3,364 | 18x |
28
-
29
- | ccm N | edmkit [ms] | pyEDM [ms] | speedup | edmkit parallel [ms] | pyEDM parallel [ms] | speedup |
30
- |---:|---:|---:|---:|---:|---:|---:|
31
- | 500 | 116.7 | 148.4 | 1.3x | 22.0 | 64.5 | 2.9x |
32
- | 1,000 | 197.1 | 316.8 | 1.6x | 31.8 | 89.7 | 2.8x |
33
- | 2,000 | 382.8 | 696.8 | 1.8x | 58.6 | 133.8 | 2.3x |
34
- | 5,000 | 788.0 | 1,863 | 2.4x | 108.9 | 283.5 | 2.6x |
35
- | 10,000 | 1,470 | 4,166 | 2.8x | 197.0 | 558.9 | 2.8x |
36
-
37
-
38
- ## Installation
39
-
40
- To install the library, you can use pip:
41
-
42
- ```bash
43
- pip install edmkit
44
- ```
45
-
46
- Or you can also use [uv](https://docs.astral.sh/uv/):
47
-
48
- ```bash
49
- uv add edmkit
50
- ```
51
-
52
- ## Testing
53
-
54
- ```bash
55
- # Run all tests
56
- uv run pytest
57
-
58
- # Skip slow tests
59
- uv run pytest -m "not slow"
60
-
61
- # Run with CI profile (more hypothesis examples)
62
- HYPOTHESIS_PROFILE=ci uv run pytest
63
- ```
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes