interpn 0.6.2__tar.gz → 0.6.3__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 (76) hide show
  1. {interpn-0.6.2 → interpn-0.6.3}/.github/workflows/release-python.yml +4 -8
  2. {interpn-0.6.2 → interpn-0.6.3}/.github/workflows/release-rust.yml +0 -1
  3. {interpn-0.6.2 → interpn-0.6.3}/.github/workflows/test-python.yml +8 -2
  4. {interpn-0.6.2 → interpn-0.6.3}/CHANGELOG.md +20 -0
  5. interpn-0.6.3/PKG-INFO +227 -0
  6. {interpn-0.6.2 → interpn-0.6.3}/pyproject.toml +10 -8
  7. {interpn-0.6.2 → interpn-0.6.3}/uv.lock +308 -110
  8. interpn-0.6.2/PKG-INFO +0 -30
  9. {interpn-0.6.2 → interpn-0.6.3}/.cargo/config.toml +0 -0
  10. {interpn-0.6.2 → interpn-0.6.3}/.github/workflows/test-rust.yml +0 -0
  11. {interpn-0.6.2 → interpn-0.6.3}/.gitignore +0 -0
  12. {interpn-0.6.2 → interpn-0.6.3}/.readthedocs.yml +0 -0
  13. {interpn-0.6.2 → interpn-0.6.3}/Cargo.lock +0 -0
  14. {interpn-0.6.2 → interpn-0.6.3}/Cargo.toml +0 -0
  15. {interpn-0.6.2 → interpn-0.6.3}/LICENSE-APACHE +0 -0
  16. {interpn-0.6.2 → interpn-0.6.3}/LICENSE-MIT +0 -0
  17. {interpn-0.6.2 → interpn-0.6.3}/README.md +0 -0
  18. {interpn-0.6.2 → interpn-0.6.3}/benches/bench.rs +0 -0
  19. {interpn-0.6.2 → interpn-0.6.3}/benches/bench_cpu.py +0 -0
  20. {interpn-0.6.2 → interpn-0.6.3}/benches/bench_mem.py +0 -0
  21. {interpn-0.6.2 → interpn-0.6.3}/docs/1d_quality_of_fit_Rectilinear.svg +0 -0
  22. {interpn-0.6.2 → interpn-0.6.3}/docs/1d_quality_of_fit_Regular.svg +0 -0
  23. {interpn-0.6.2 → interpn-0.6.3}/docs/2d_quality_of_fit_Rectilinear.svg +0 -0
  24. {interpn-0.6.2 → interpn-0.6.3}/docs/2d_quality_of_fit_Regular.svg +0 -0
  25. {interpn-0.6.2 → interpn-0.6.3}/docs/3d_throughput_vs_nobs.svg +0 -0
  26. {interpn-0.6.2 → interpn-0.6.3}/docs/3d_throughput_vs_nobs_prealloc.svg +0 -0
  27. {interpn-0.6.2 → interpn-0.6.3}/docs/4d_throughput_vs_nobs.svg +0 -0
  28. {interpn-0.6.2 → interpn-0.6.3}/docs/4d_throughput_vs_nobs_prealloc.svg +0 -0
  29. {interpn-0.6.2 → interpn-0.6.3}/docs/API_Docs.md +0 -0
  30. {interpn-0.6.2 → interpn-0.6.3}/docs/index.md +0 -0
  31. {interpn-0.6.2 → interpn-0.6.3}/docs/perf.md +0 -0
  32. {interpn-0.6.2 → interpn-0.6.3}/docs/ram_vs_dims.svg +0 -0
  33. {interpn-0.6.2 → interpn-0.6.3}/docs/requirements.txt +0 -0
  34. {interpn-0.6.2 → interpn-0.6.3}/docs/throughput_vs_dims_1000_obs.svg +0 -0
  35. {interpn-0.6.2 → interpn-0.6.3}/docs/throughput_vs_dims_1_obs.svg +0 -0
  36. {interpn-0.6.2 → interpn-0.6.3}/examples/cubic_comparison.py +0 -0
  37. {interpn-0.6.2 → interpn-0.6.3}/mkdocs.yml +0 -0
  38. {interpn-0.6.2 → interpn-0.6.3}/scripts/distr_pgo.sh +0 -0
  39. {interpn-0.6.2 → interpn-0.6.3}/scripts/distr_pgo_install.sh +0 -0
  40. {interpn-0.6.2 → interpn-0.6.3}/scripts/distr_pgo_profile.sh +0 -0
  41. {interpn-0.6.2 → interpn-0.6.3}/scripts/native_pgo.sh +0 -0
  42. {interpn-0.6.2 → interpn-0.6.3}/scripts/native_pgo_install.sh +0 -0
  43. {interpn-0.6.2 → interpn-0.6.3}/scripts/native_pgo_profile.sh +0 -0
  44. {interpn-0.6.2 → interpn-0.6.3}/scripts/pgo-profiles/pgo.profdata +0 -0
  45. {interpn-0.6.2 → interpn-0.6.3}/scripts/profile_workload.py +0 -0
  46. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/__init__.py +0 -0
  47. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/multicubic_rectilinear.py +0 -0
  48. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/multicubic_regular.py +0 -0
  49. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/multilinear_rectilinear.py +0 -0
  50. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/multilinear_regular.py +0 -0
  51. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/py.typed +0 -0
  52. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/raw.py +0 -0
  53. {interpn-0.6.2 → interpn-0.6.3}/src/interpn/serialization.py +0 -0
  54. {interpn-0.6.2 → interpn-0.6.3}/src/lib.rs +0 -0
  55. {interpn-0.6.2 → interpn-0.6.3}/src/multicubic/mod.rs +0 -0
  56. {interpn-0.6.2 → interpn-0.6.3}/src/multicubic/rectilinear.rs +0 -0
  57. {interpn-0.6.2 → interpn-0.6.3}/src/multicubic/rectilinear_recursive.rs +0 -0
  58. {interpn-0.6.2 → interpn-0.6.3}/src/multicubic/regular.rs +0 -0
  59. {interpn-0.6.2 → interpn-0.6.3}/src/multicubic/regular_recursive.rs +0 -0
  60. {interpn-0.6.2 → interpn-0.6.3}/src/multilinear/mod.rs +0 -0
  61. {interpn-0.6.2 → interpn-0.6.3}/src/multilinear/rectilinear.rs +0 -0
  62. {interpn-0.6.2 → interpn-0.6.3}/src/multilinear/rectilinear_recursive.rs +0 -0
  63. {interpn-0.6.2 → interpn-0.6.3}/src/multilinear/regular.rs +0 -0
  64. {interpn-0.6.2 → interpn-0.6.3}/src/multilinear/regular_recursive.rs +0 -0
  65. {interpn-0.6.2 → interpn-0.6.3}/src/one_dim/hold.rs +0 -0
  66. {interpn-0.6.2 → interpn-0.6.3}/src/one_dim/linear.rs +0 -0
  67. {interpn-0.6.2 → interpn-0.6.3}/src/one_dim/mod.rs +0 -0
  68. {interpn-0.6.2 → interpn-0.6.3}/src/python.rs +0 -0
  69. {interpn-0.6.2 → interpn-0.6.3}/src/testing.rs +0 -0
  70. {interpn-0.6.2 → interpn-0.6.3}/src/utils.rs +0 -0
  71. {interpn-0.6.2 → interpn-0.6.3}/test/test_docs.py +0 -0
  72. {interpn-0.6.2 → interpn-0.6.3}/test/test_examples.py +0 -0
  73. {interpn-0.6.2 → interpn-0.6.3}/test/test_multicubic_rectilinear.py +0 -0
  74. {interpn-0.6.2 → interpn-0.6.3}/test/test_multicubic_regular.py +0 -0
  75. {interpn-0.6.2 → interpn-0.6.3}/test/test_multilinear_rectilinear.py +0 -0
  76. {interpn-0.6.2 → interpn-0.6.3}/test/test_multilinear_regular.py +0 -0
@@ -6,18 +6,14 @@
6
6
  name: release-python
7
7
 
8
8
  on:
9
- push:
10
- branches:
11
- - main
12
9
  workflow_dispatch:
13
10
 
14
11
  permissions:
15
12
  contents: read
16
13
 
17
14
  jobs:
18
- release_rust:
19
- uses: ./.github/workflows/release-rust.yml
20
- secrets: inherit
15
+ test_python:
16
+ uses: ./.github/workflows/test-python.yml
21
17
 
22
18
  linux:
23
19
  runs-on: ${{ matrix.platform.runner }}
@@ -124,7 +120,7 @@ jobs:
124
120
  strategy:
125
121
  matrix:
126
122
  platform:
127
- - runner: macos-13
123
+ - runner: macos-15-intel
128
124
  target: x86_64
129
125
  - runner: macos-14
130
126
  target: aarch64
@@ -163,7 +159,7 @@ jobs:
163
159
  name: Release
164
160
  runs-on: ubuntu-latest
165
161
  # if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
166
- needs: [release_rust, linux, musllinux, windows, macos, sdist]
162
+ needs: [test_python, linux, musllinux, windows, macos, sdist]
167
163
  permissions:
168
164
  # Use to sign the release artifacts
169
165
  id-token: write
@@ -4,7 +4,6 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  on:
7
- workflow_call:
8
7
  workflow_dispatch:
9
8
 
10
9
  jobs:
@@ -11,7 +11,13 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  target: [x86_64]
14
- python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
14
+ python-version:
15
+ - "3.9"
16
+ - "3.10"
17
+ - "3.11"
18
+ - "3.12"
19
+ - "3.13"
20
+ - "3.14"
15
21
  steps:
16
22
  - uses: actions/checkout@v3
17
23
  - name: Install uv
@@ -42,7 +48,7 @@ jobs:
42
48
  - runner: windows-latest
43
49
  - runner: ubuntu-latest
44
50
  - runner: ubuntu-24.04-arm # aarch64
45
- - runner: macos-13 # x86_64
51
+ - runner: macos-15-intel # x86_64
46
52
  - runner: macos-14 # aarch64
47
53
  python-version: ["3.9"]
48
54
  steps:
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.3 2025-10-22
4
+
5
+ Unpin max supported python version due to use of stable ABI3,
6
+ along with a host of other improvements to packaging and actions workflows.
7
+
8
+ ### New Contributors
9
+
10
+ * [Clément Robert](https://github.com/neutrinoceros) contributed PRs 30,32,33,36 making up all the substantial changes in this release. Thanks, Clément!
11
+
12
+ ### Changed
13
+
14
+ * Python
15
+ * Unpin max python version
16
+ * Roll forward pydantic version for python 3.14 compatibility
17
+ * Update package metadata
18
+ * Add python 3.14 to test matrix
19
+ * Workflows
20
+ * Reconfigure from single-contributor to commons-project by segmenting release workflows to be dispatched manually only
21
+ * Update python release workflow to depend on test-python instead of release-rust to support separate releases
22
+
3
23
  ## 0.6.2 2025-10-20
4
24
 
5
25
  Add optional use of fused multiply-add, enabled for python distributions.
interpn-0.6.3/PKG-INFO ADDED
@@ -0,0 +1,227 @@
1
+ Metadata-Version: 2.4
2
+ Name: interpn
3
+ Version: 0.6.3
4
+ Classifier: Programming Language :: Rust
5
+ Classifier: Programming Language :: Python :: Implementation :: CPython
6
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
7
+ Requires-Dist: numpy>=2
8
+ Requires-Dist: pydantic>=2.12
9
+ Requires-Dist: pytest>=8.4.2 ; extra == 'test'
10
+ Requires-Dist: pytest-cov>=7.0.0 ; extra == 'test'
11
+ Requires-Dist: ruff>=0.13.3 ; extra == 'test'
12
+ Requires-Dist: pyright==1.1.337 ; extra == 'test'
13
+ Requires-Dist: mktestdocs>=0.2.1 ; extra == 'test'
14
+ Requires-Dist: scipy>=1.11.4 ; extra == 'test'
15
+ Requires-Dist: matplotlib>=3.8 ; extra == 'test'
16
+ Requires-Dist: scipy>=1.11.4 ; extra == 'bench'
17
+ Requires-Dist: matplotlib>=3.8 ; extra == 'bench'
18
+ Requires-Dist: memory-profiler>=0.61.0 ; extra == 'bench'
19
+ Requires-Dist: mkdocs>=1.5.3 ; extra == 'doc'
20
+ Requires-Dist: mkdocstrings-python>=1.7.5 ; extra == 'doc'
21
+ Requires-Dist: mkdocs-material>=9.4.10 ; extra == 'doc'
22
+ Provides-Extra: test
23
+ Provides-Extra: bench
24
+ Provides-Extra: doc
25
+ License-File: LICENSE-MIT
26
+ License-File: LICENSE-APACHE
27
+ Summary: N-dimensional interpolation/extrapolation methods
28
+ Home-Page: https://github.com/jlogan03/interpn/
29
+ Author-email: James Logan <jlogan03@gmail.com>
30
+ License-Expression: MIT OR Apache-2.0
31
+ Requires-Python: >=3.9
32
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
33
+ Project-URL: repository, https://github.com/jlogan03/interpn
34
+ Project-URL: documentation, https://interpn.readthedocs.io/
35
+
36
+ # InterpN
37
+
38
+ [Repo](https://github.com/jlogan03/interpn) |
39
+ [Python Docs](https://interpnpy.readthedocs.io/en/latest/) |
40
+ [Rust Docs](https://docs.rs/interpn/latest/interpn/)
41
+
42
+ N-dimensional interpolation/extrapolation methods, no-std and no-alloc compatible,
43
+ prioritizing correctness, performance, and compatiblity with memory-constrained environments.
44
+
45
+ Available as a rust crate and python library.
46
+
47
+ These methods perform zero allocation when evaluated (except, optionally, for the output).
48
+ Because of this, they have minimal per-call overhead, and are particularly
49
+ effective when examining small numbers of observation points. See the
50
+ [performance](https://interpnpy.readthedocs.io/en/latest/perf/) page for detailed benchmarks.
51
+
52
+ ## Features
53
+
54
+ | Feature →<br>↓ Interpolant Method | Regular<br>Grid | Rectilinear<br>Grid | Json<br>Serialization |
55
+ |-----------------------------------|-----------------|---------------------|-----------------------|
56
+ | Linear | ✅ | ✅ | ✅ |
57
+ | Cubic | ✅ | ✅ | ✅ |
58
+
59
+ The methods provided here, while more limited in scope than scipy's,
60
+
61
+ * are significantly faster under most conditions
62
+ * use almost no RAM (and perform no heap allocations at all)
63
+ * produce significantly improved floating-point error (by several orders of magnitude)
64
+ * are json-serializable using Pydantic
65
+ * can also be used easily in web and embedded applications via the Rust library
66
+ * are permissively licensed
67
+
68
+ ![ND throughput 1000 obs](./docs/throughput_vs_dims_1000_obs.svg)
69
+
70
+ See [here](https://interpnpy.readthedocs.io/en/latest/perf/) for more info about quality-of-fit, throughput, and memory usage.
71
+
72
+ ## Installation
73
+
74
+ ```bash
75
+ pip install interpn
76
+ ```
77
+
78
+ ## Profile-Guided Optimization
79
+
80
+ To build the extension with profile-guided optimization using pre-built profiles, do `sh ./scripts/pgo_install.sh`.
81
+ You can also generate your own PGO profiles like `sh ./scripts/pgo_profile.sh`.
82
+ after installing these extra compiler dependencies:
83
+
84
+ ```bash
85
+ rustup component add llvm-tools-preview
86
+ ```
87
+
88
+ ## Rust Examples
89
+
90
+ ### Regular Grid
91
+ ```rust
92
+ use interpn::{multilinear, multicubic};
93
+
94
+ // Define a grid
95
+ let x = [1.0_f64, 2.0, 3.0, 4.0];
96
+ let y = [0.0_f64, 1.0, 2.0, 3.0];
97
+
98
+ // Grid input for rectilinear method
99
+ let grids = &[&x[..], &y[..]];
100
+
101
+ // Grid input for regular grid method
102
+ let dims = [x.len(), y.len()];
103
+ let starts = [x[0], y[0]];
104
+ let steps = [x[1] - x[0], y[1] - y[0]];
105
+
106
+ // Values at grid points
107
+ let z = [2.0; 16];
108
+
109
+ // Observation points to interpolate/extrapolate
110
+ let xobs = [0.0_f64, 5.0];
111
+ let yobs = [-1.0, 3.0];
112
+ let obs = [&xobs[..], &yobs[..]];
113
+
114
+ // Storage for output
115
+ let mut out = [0.0; 2];
116
+
117
+ // Do interpolation
118
+ multilinear::regular::interpn(&dims, &starts, &steps, &z, &obs, &mut out);
119
+ multicubic::regular::interpn(&dims, &starts, &steps, &z, false, &obs, &mut out);
120
+ ```
121
+
122
+ ### Rectilinear Grid
123
+ ```rust
124
+ use interpn::{multilinear, multicubic};
125
+
126
+ // Define a grid
127
+ let x = [1.0_f64, 2.0, 3.0, 4.0];
128
+ let y = [0.0_f64, 1.0, 2.0, 3.0];
129
+
130
+ // Grid input for rectilinear method
131
+ let grids = &[&x[..], &y[..]];
132
+
133
+ // Values at grid points
134
+ let z = [2.0; 16];
135
+
136
+ // Points to interpolate/extrapolate
137
+ let xobs = [0.0_f64, 5.0];
138
+ let yobs = [-1.0, 3.0];
139
+ let obs = [&xobs[..], &yobs[..]];
140
+
141
+ // Storage for output
142
+ let mut out = [0.0; 2];
143
+
144
+ // Do interpolation
145
+ multilinear::rectilinear::interpn(grids, &z, &obs, &mut out).unwrap();
146
+ multicubic::rectilinear::interpn(grids, &z, false, &obs, &mut out).unwrap();
147
+ ```
148
+
149
+ ## Python Examples
150
+
151
+ ### Available Methods
152
+
153
+ ```python
154
+ import interpn
155
+ import numpy as np
156
+
157
+ # Build grid
158
+ x = np.linspace(0.0, 10.0, 5)
159
+ y = np.linspace(20.0, 30.0, 4)
160
+ grids = [x, y]
161
+
162
+ xgrid, ygrid = np.meshgrid(x, y, indexing="ij")
163
+ zgrid = (xgrid + 2.0 * ygrid) # Values at grid points
164
+
165
+ # Grid inputs for true regular grid
166
+ dims = [x.size, y.size]
167
+ starts = np.array([x[0], y[0]])
168
+ steps = np.array([x[1] - x[0], y[1] - y[0]])
169
+
170
+ # Initialize different interpolators
171
+ # Call like `linear_regular.eval([xs, ys])`
172
+ linear_regular = interpn.MultilinearRegular.new(dims, starts, steps, zgrid)
173
+ cubic_regular = interpn.MulticubicRegular.new(dims, starts, steps, zgrid)
174
+ linear_rectilinear = interpn.MultilinearRectilinear.new(grids, zgrid)
175
+ cubic_rectilinear = interpn.MulticubicRectilinear.new(grids, zgrid)
176
+ ```
177
+
178
+ ### Multilinear Interpolation
179
+
180
+ ```python
181
+ import interpn
182
+ import numpy as np
183
+
184
+ # Build grid
185
+ x = np.linspace(0.0, 10.0, 5)
186
+ y = np.linspace(20.0, 30.0, 4)
187
+
188
+ xgrid, ygrid = np.meshgrid(x, y, indexing="ij")
189
+ zgrid = (xgrid + 2.0 * ygrid) # Values at grid points
190
+
191
+ # Grid inputs for true regular grid
192
+ dims = [x.size, y.size]
193
+ starts = np.array([x[0], y[0]])
194
+ steps = np.array([x[1] - x[0], y[1] - y[0]])
195
+
196
+ # Observation points pointed back at the grid
197
+ obs = [xgrid.flatten(), ygrid.flatten()]
198
+
199
+ # Initialize
200
+ interpolator = interpn.MultilinearRegular.new(dims, starts, steps, zgrid.flatten())
201
+
202
+ # Interpolate
203
+ out = interpolator.eval(obs)
204
+
205
+ # Check result
206
+ assert np.allclose(out, zgrid.flatten(), rtol=1e-13)
207
+
208
+ # Serialize and deserialize
209
+ roundtrip_interpolator = interpn.MultilinearRegular.model_validate_json(
210
+ interpolator.model_dump_json()
211
+ )
212
+ out2 = roundtrip_interpolator.eval(obs)
213
+
214
+ # Check result from roundtrip serialized/deserialized interpolator
215
+ assert np.all(out == out2)
216
+ ```
217
+
218
+
219
+ # License
220
+
221
+ Licensed under either of
222
+
223
+ - Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
224
+ - MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
225
+
226
+ at your option.
227
+
@@ -4,12 +4,13 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "interpn"
7
- version = "0.6.2"
8
- repository = "https://github.com/jlogan03/interpn"
9
- documentation = "https://interpn.readthedocs.io/"
7
+ version = "0.6.3"
10
8
  description = "N-dimensional interpolation/extrapolation methods"
11
9
  authors = [{ name = "James Logan", email = "jlogan03@gmail.com" }]
12
- requires-python = ">=3.9, <3.14"
10
+ readme = "README.md"
11
+ license = "MIT OR Apache-2.0"
12
+ license-files = ["LICENSE-MIT", "LICENSE-APACHE"]
13
+ requires-python = ">=3.9"
13
14
  classifiers = [
14
15
  "Programming Language :: Rust",
15
16
  "Programming Language :: Python :: Implementation :: CPython",
@@ -17,9 +18,13 @@ classifiers = [
17
18
  ]
18
19
  dependencies = [
19
20
  "numpy >= 2",
20
- "pydantic >= 2.5.2",
21
+ "pydantic >= 2.12",
21
22
  ]
22
23
 
24
+ [project.urls]
25
+ repository = "https://github.com/jlogan03/interpn"
26
+ documentation = "https://interpn.readthedocs.io/"
27
+
23
28
  [project.optional-dependencies]
24
29
  test = [
25
30
  "pytest >= 8.4.2",
@@ -71,9 +76,6 @@ include = [
71
76
  [tool.pytest.ini_options]
72
77
  addopts = "--cov=interpn --cov-report html --cov-fail-under=94"
73
78
 
74
- [tool.ruff]
75
- target-version = "py39"
76
-
77
79
  [tool.ruff.lint]
78
80
  select = [
79
81
  # pycodestyle