coarsen 0.1.0__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.
@@ -0,0 +1,44 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ pull_request:
5
+ workflow_dispatch:
6
+ permissions:
7
+ contents: read
8
+ jobs:
9
+ rust:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: dtolnay/rust-toolchain@stable
14
+ with:
15
+ components: rustfmt, clippy
16
+ - run: cargo fmt --check
17
+ - run: cargo clippy --locked --all-targets --all-features -- -D warnings
18
+ - run: cargo test --locked
19
+ python:
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os: [ubuntu-latest, macos-latest, windows-latest]
24
+ python: ['3.10', '3.11', '3.12', '3.13']
25
+ runs-on: ${{ matrix.os }}
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: ${{ matrix.python }}
31
+ - uses: dtolnay/rust-toolchain@stable
32
+ - run: python -m pip install ".[test]"
33
+ - run: python -m pytest --cov=coarsen tests/
34
+ quality:
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: '3.13'
41
+ - run: python -m pip install numpy shapely==2.1.2 ruff ty pytest pyarrow pyproj
42
+ - run: ruff check .
43
+ - run: ruff format --check .
44
+ - run: ty check
@@ -0,0 +1,88 @@
1
+ name: Release
2
+ on:
3
+ push:
4
+ tags: ['v*']
5
+ workflow_dispatch:
6
+ permissions:
7
+ contents: read
8
+ jobs:
9
+ wheels:
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ include:
14
+ - os: ubuntu-latest
15
+ target: x86_64-unknown-linux-gnu
16
+ manylinux: '2014'
17
+ - os: ubuntu-24.04-arm
18
+ target: aarch64-unknown-linux-gnu
19
+ manylinux: '2014'
20
+ - os: ubuntu-latest
21
+ target: x86_64-unknown-linux-musl
22
+ manylinux: musllinux_1_2
23
+ - os: macos-15-intel
24
+ target: x86_64-apple-darwin
25
+ manylinux: auto
26
+ - os: macos-15
27
+ target: aarch64-apple-darwin
28
+ manylinux: auto
29
+ - os: windows-latest
30
+ target: x86_64-pc-windows-msvc
31
+ manylinux: auto
32
+ runs-on: ${{ matrix.os }}
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ - uses: actions/setup-python@v5
36
+ with:
37
+ python-version: '3.10'
38
+ - uses: PyO3/maturin-action@v1
39
+ with:
40
+ command: build
41
+ target: ${{ matrix.target }}
42
+ manylinux: ${{ matrix.manylinux }}
43
+ args: --release --locked --out dist
44
+ - name: Test installed wheel
45
+ if: matrix.manylinux != 'musllinux_1_2'
46
+ shell: bash
47
+ run: |
48
+ python -m pip install dist/*.whl pytest shapely==2.1.2
49
+ python -m pytest -q
50
+ - uses: actions/upload-artifact@v4
51
+ with:
52
+ name: wheels-${{ matrix.target }}
53
+ path: dist/*.whl
54
+ sdist:
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+ - uses: PyO3/maturin-action@v1
59
+ with:
60
+ command: sdist
61
+ args: --out dist
62
+ - uses: actions/setup-python@v5
63
+ with:
64
+ python-version: '3.10'
65
+ - uses: dtolnay/rust-toolchain@stable
66
+ - name: Test source distribution
67
+ run: |
68
+ python -m pip install dist/*.tar.gz pytest shapely==2.1.2
69
+ python -m pytest -q
70
+ - uses: actions/upload-artifact@v4
71
+ with:
72
+ name: sdist
73
+ path: dist/*.tar.gz
74
+ publish:
75
+ if: startsWith(github.ref, 'refs/tags/v')
76
+ needs: [wheels, sdist]
77
+ runs-on: ubuntu-latest
78
+ environment:
79
+ name: pypi
80
+ url: https://pypi.org/p/coarsen
81
+ permissions:
82
+ id-token: write
83
+ steps:
84
+ - uses: actions/download-artifact@v4
85
+ with:
86
+ path: dist
87
+ merge-multiple: true
88
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,11 @@
1
+ .venv*/
2
+ target/
3
+ __pycache__/
4
+ *.so
5
+ *.pyd
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ .coverage
9
+ htmlcov/
10
+ dist/
11
+ benchmarks/*.out
@@ -0,0 +1,72 @@
1
+ # Development
2
+
3
+ The core (`src/`) is usable without Python: `cargo test --locked`. Python support
4
+ is an optional Cargo feature. `python/coarsen/` contains the wrapper and type
5
+ information; `tests/` contains the original GEOS fixtures, projected real parcels,
6
+ and Python parity tests. `benchmarks/` contains the reproducible CPU benchmark.
7
+ No CLI, Parquet reader, projection implementation, or native-library loader is
8
+ included in the runtime package.
9
+
10
+ Use Rust ≥1.85 and Python ≥3.10. From the repository root:
11
+
12
+ ```sh
13
+ uv venv --python 3.13
14
+ uv pip install maturin '.[dev,benchmark]'
15
+ uv run --no-sync maturin develop --release
16
+ cargo fmt --check
17
+ cargo clippy --locked --all-targets --all-features -- -D warnings
18
+ cargo test --locked
19
+ uv run --no-sync ruff check .
20
+ uv run --no-sync ruff format --check .
21
+ uv run --no-sync ty check
22
+ uv run --no-sync pytest --cov=coarsen tests/
23
+ ```
24
+
25
+ If a Conda environment is active, deactivate it before `maturin develop`.
26
+ Maturin rejects simultaneous `CONDA_PREFIX` and `VIRTUAL_ENV` settings.
27
+ An alternative that avoids editable-install environment selection:
28
+
29
+ ```sh
30
+ uv run --no-sync maturin build --release --locked --out dist
31
+ uv run --no-sync maturin sdist --out dist
32
+ uv venv --python 3.13 /tmp/coarsen-wheel-test
33
+ uv pip install --python /tmp/coarsen-wheel-test/bin/python dist/*.whl pytest shapely==2.1.2
34
+ /tmp/coarsen-wheel-test/bin/python -m pytest tests/
35
+ ```
36
+
37
+ The parity suite deliberately requires GEOS 3.13.1, rather than silently testing
38
+ against a newer algorithm. Install the Shapely 2.1.2 binary wheel for this gate.
39
+ Generated wheels contain the LGPL license, attribution, type hints, and `py.typed`.
40
+ Source distributions contain Rust sources, Cargo.lock, Python sources, and fixtures.
41
+
42
+ # Release
43
+
44
+ CI checks rustfmt, Clippy, Cargo tests, Ruff, ty, and wheel-installed Python tests
45
+ on Linux, macOS, and Windows with Python 3.10–3.13. The release workflow builds
46
+ CPython abi3 wheels (3.10+) for manylinux x86_64/aarch64, musllinux x86_64,
47
+ macOS x86_64/arm64, and Windows x86_64, plus an sdist. All wheel targets except
48
+ musllinux are tested in their build jobs; the sdist is built and tested separately.
49
+ `workflow_dispatch` builds artifacts without publishing. Only `v*` tags publish.
50
+
51
+ Before the first release, the owner must create the GitHub repository and a
52
+ PyPI project/pending trusted publisher for `coarsen`, specifying that repository,
53
+ workflow `release.yml`, and environment `pypi`. Create the matching GitHub
54
+ `pypi` environment and any desired approval rules. No API token or secret is needed.
55
+ Set matching versions in Cargo.toml, pyproject.toml, and the Python `__version__`;
56
+ inspect the built artifacts and passing CI before creating a release tag.
57
+ Nothing is uploaded by local builds.
58
+
59
+ # Algorithm notes
60
+
61
+ Shared edges are extracted once in GEOS encounter order. The simplifier uses a
62
+ triangle-area threshold of tolerance squared, GEOS corner tie-breaking, and GEOS
63
+ 3.13.1's double-double orientation predicate. Intersecting original edge envelopes
64
+ produce dependencies from earlier to later edges. Independent rounds run with
65
+ Rayon; immutable edges remain constraints. In inner-only mode only edges used by
66
+ exactly two rings are simplified and edges used by exactly one ring constrain them.
67
+
68
+ WKB is copied into owned Rust storage before detaching from Python. The core has
69
+ no Python objects, GEOS calls, or shared mutable global geometry state. Explicit
70
+ thread counts are local to a call; the default Rayon pool obeys `RAYON_NUM_THREADS`.
71
+ The wrapper restores precision-grid metadata lost in the WKB round trip using
72
+ Shapely's pointwise precision mode.
@@ -0,0 +1,341 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "anyhow"
7
+ version = "1.0.104"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
10
+
11
+ [[package]]
12
+ name = "autocfg"
13
+ version = "1.5.1"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
16
+
17
+ [[package]]
18
+ name = "byteorder"
19
+ version = "1.5.0"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
22
+
23
+ [[package]]
24
+ name = "coarsen"
25
+ version = "0.1.0"
26
+ dependencies = [
27
+ "anyhow",
28
+ "pyo3",
29
+ "rayon",
30
+ "rstar",
31
+ "rustc-hash",
32
+ "serde_json",
33
+ ]
34
+
35
+ [[package]]
36
+ name = "crossbeam-deque"
37
+ version = "0.8.8"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
40
+ dependencies = [
41
+ "crossbeam-epoch",
42
+ "crossbeam-utils",
43
+ ]
44
+
45
+ [[package]]
46
+ name = "crossbeam-epoch"
47
+ version = "0.9.21"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
50
+ dependencies = [
51
+ "crossbeam-utils",
52
+ ]
53
+
54
+ [[package]]
55
+ name = "crossbeam-utils"
56
+ version = "0.8.23"
57
+ source = "registry+https://github.com/rust-lang/crates.io-index"
58
+ checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
59
+
60
+ [[package]]
61
+ name = "either"
62
+ version = "1.18.0"
63
+ source = "registry+https://github.com/rust-lang/crates.io-index"
64
+ checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34"
65
+
66
+ [[package]]
67
+ name = "hash32"
68
+ version = "0.3.1"
69
+ source = "registry+https://github.com/rust-lang/crates.io-index"
70
+ checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
71
+ dependencies = [
72
+ "byteorder",
73
+ ]
74
+
75
+ [[package]]
76
+ name = "heapless"
77
+ version = "0.8.0"
78
+ source = "registry+https://github.com/rust-lang/crates.io-index"
79
+ checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
80
+ dependencies = [
81
+ "hash32",
82
+ "stable_deref_trait",
83
+ ]
84
+
85
+ [[package]]
86
+ name = "heck"
87
+ version = "0.5.0"
88
+ source = "registry+https://github.com/rust-lang/crates.io-index"
89
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
90
+
91
+ [[package]]
92
+ name = "itoa"
93
+ version = "1.0.18"
94
+ source = "registry+https://github.com/rust-lang/crates.io-index"
95
+ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
96
+
97
+ [[package]]
98
+ name = "libc"
99
+ version = "0.2.189"
100
+ source = "registry+https://github.com/rust-lang/crates.io-index"
101
+ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
102
+
103
+ [[package]]
104
+ name = "libm"
105
+ version = "0.2.16"
106
+ source = "registry+https://github.com/rust-lang/crates.io-index"
107
+ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
108
+
109
+ [[package]]
110
+ name = "memchr"
111
+ version = "2.8.3"
112
+ source = "registry+https://github.com/rust-lang/crates.io-index"
113
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
114
+
115
+ [[package]]
116
+ name = "num-traits"
117
+ version = "0.2.19"
118
+ source = "registry+https://github.com/rust-lang/crates.io-index"
119
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
120
+ dependencies = [
121
+ "autocfg",
122
+ "libm",
123
+ ]
124
+
125
+ [[package]]
126
+ name = "once_cell"
127
+ version = "1.21.4"
128
+ source = "registry+https://github.com/rust-lang/crates.io-index"
129
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
130
+
131
+ [[package]]
132
+ name = "portable-atomic"
133
+ version = "1.15.0"
134
+ source = "registry+https://github.com/rust-lang/crates.io-index"
135
+ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
136
+
137
+ [[package]]
138
+ name = "proc-macro2"
139
+ version = "1.0.107"
140
+ source = "registry+https://github.com/rust-lang/crates.io-index"
141
+ checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
142
+ dependencies = [
143
+ "unicode-ident",
144
+ ]
145
+
146
+ [[package]]
147
+ name = "pyo3"
148
+ version = "0.29.3"
149
+ source = "registry+https://github.com/rust-lang/crates.io-index"
150
+ checksum = "700d18fa267b73b9b521fd7e13580e2f446916f176cacee1ab63fcc8191f1655"
151
+ dependencies = [
152
+ "libc",
153
+ "once_cell",
154
+ "portable-atomic",
155
+ "pyo3-build-config",
156
+ "pyo3-ffi",
157
+ "pyo3-macros",
158
+ ]
159
+
160
+ [[package]]
161
+ name = "pyo3-build-config"
162
+ version = "0.29.3"
163
+ source = "registry+https://github.com/rust-lang/crates.io-index"
164
+ checksum = "7b3fc0c4d08f6bb10e71fe39dfb9e2f59c6eb6854e22ec8092f50c69a4499adb"
165
+ dependencies = [
166
+ "target-lexicon",
167
+ ]
168
+
169
+ [[package]]
170
+ name = "pyo3-ffi"
171
+ version = "0.29.3"
172
+ source = "registry+https://github.com/rust-lang/crates.io-index"
173
+ checksum = "dfc0b8e19df29aad7086cf977bb0c2a2f143e30567eb113e9cf72b62ca698330"
174
+ dependencies = [
175
+ "libc",
176
+ "pyo3-build-config",
177
+ ]
178
+
179
+ [[package]]
180
+ name = "pyo3-macros"
181
+ version = "0.29.3"
182
+ source = "registry+https://github.com/rust-lang/crates.io-index"
183
+ checksum = "6100e8a4b5eba53afaa5ed078364851a0b2499c553a44c31026b929049b49dc6"
184
+ dependencies = [
185
+ "proc-macro2",
186
+ "pyo3-macros-backend",
187
+ "quote",
188
+ "syn 2.0.119",
189
+ ]
190
+
191
+ [[package]]
192
+ name = "pyo3-macros-backend"
193
+ version = "0.29.3"
194
+ source = "registry+https://github.com/rust-lang/crates.io-index"
195
+ checksum = "6143877a16e82b5a727b7127ff4cd86858a24a28d745d72f43e6f227c7b1bdb3"
196
+ dependencies = [
197
+ "heck",
198
+ "proc-macro2",
199
+ "quote",
200
+ "syn 2.0.119",
201
+ ]
202
+
203
+ [[package]]
204
+ name = "quote"
205
+ version = "1.0.47"
206
+ source = "registry+https://github.com/rust-lang/crates.io-index"
207
+ checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
208
+ dependencies = [
209
+ "proc-macro2",
210
+ ]
211
+
212
+ [[package]]
213
+ name = "rayon"
214
+ version = "1.12.0"
215
+ source = "registry+https://github.com/rust-lang/crates.io-index"
216
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
217
+ dependencies = [
218
+ "either",
219
+ "rayon-core",
220
+ ]
221
+
222
+ [[package]]
223
+ name = "rayon-core"
224
+ version = "1.13.0"
225
+ source = "registry+https://github.com/rust-lang/crates.io-index"
226
+ checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
227
+ dependencies = [
228
+ "crossbeam-deque",
229
+ "crossbeam-utils",
230
+ ]
231
+
232
+ [[package]]
233
+ name = "rstar"
234
+ version = "0.13.0"
235
+ source = "registry+https://github.com/rust-lang/crates.io-index"
236
+ checksum = "5912b862fa5ffb462607bfd1e35036c458c537921f508c8235a83d5f3987edfe"
237
+ dependencies = [
238
+ "heapless",
239
+ "num-traits",
240
+ "smallvec",
241
+ ]
242
+
243
+ [[package]]
244
+ name = "rustc-hash"
245
+ version = "2.1.3"
246
+ source = "registry+https://github.com/rust-lang/crates.io-index"
247
+ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
248
+
249
+ [[package]]
250
+ name = "serde"
251
+ version = "1.0.229"
252
+ source = "registry+https://github.com/rust-lang/crates.io-index"
253
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
254
+ dependencies = [
255
+ "serde_core",
256
+ ]
257
+
258
+ [[package]]
259
+ name = "serde_core"
260
+ version = "1.0.229"
261
+ source = "registry+https://github.com/rust-lang/crates.io-index"
262
+ checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
263
+ dependencies = [
264
+ "serde_derive",
265
+ ]
266
+
267
+ [[package]]
268
+ name = "serde_derive"
269
+ version = "1.0.229"
270
+ source = "registry+https://github.com/rust-lang/crates.io-index"
271
+ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
272
+ dependencies = [
273
+ "proc-macro2",
274
+ "quote",
275
+ "syn 3.0.6",
276
+ ]
277
+
278
+ [[package]]
279
+ name = "serde_json"
280
+ version = "1.0.151"
281
+ source = "registry+https://github.com/rust-lang/crates.io-index"
282
+ checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
283
+ dependencies = [
284
+ "itoa",
285
+ "memchr",
286
+ "serde",
287
+ "serde_core",
288
+ "zmij",
289
+ ]
290
+
291
+ [[package]]
292
+ name = "smallvec"
293
+ version = "1.16.2"
294
+ source = "registry+https://github.com/rust-lang/crates.io-index"
295
+ checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e"
296
+
297
+ [[package]]
298
+ name = "stable_deref_trait"
299
+ version = "1.2.1"
300
+ source = "registry+https://github.com/rust-lang/crates.io-index"
301
+ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
302
+
303
+ [[package]]
304
+ name = "syn"
305
+ version = "2.0.119"
306
+ source = "registry+https://github.com/rust-lang/crates.io-index"
307
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
308
+ dependencies = [
309
+ "proc-macro2",
310
+ "quote",
311
+ "unicode-ident",
312
+ ]
313
+
314
+ [[package]]
315
+ name = "syn"
316
+ version = "3.0.6"
317
+ source = "registry+https://github.com/rust-lang/crates.io-index"
318
+ checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
319
+ dependencies = [
320
+ "proc-macro2",
321
+ "quote",
322
+ "unicode-ident",
323
+ ]
324
+
325
+ [[package]]
326
+ name = "target-lexicon"
327
+ version = "0.13.5"
328
+ source = "registry+https://github.com/rust-lang/crates.io-index"
329
+ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
330
+
331
+ [[package]]
332
+ name = "unicode-ident"
333
+ version = "1.0.26"
334
+ source = "registry+https://github.com/rust-lang/crates.io-index"
335
+ checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
336
+
337
+ [[package]]
338
+ name = "zmij"
339
+ version = "1.0.23"
340
+ source = "registry+https://github.com/rust-lang/crates.io-index"
341
+ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
@@ -0,0 +1,25 @@
1
+ [package]
2
+ name = "coarsen"
3
+ version = "0.1.0"
4
+ edition = "2024"
5
+ rust-version = "1.85"
6
+ license = "LGPL-2.1-or-later"
7
+ description = "Ordered parallel port of GEOS 3.13.1 coverage simplification"
8
+ exclude = ["dist/", "benchmarks/*.out", "**/__pycache__/", "python/coarsen/*.so", "python/coarsen/*.pyd"]
9
+ readme = "README.md"
10
+
11
+ [lib]
12
+ crate-type = ["cdylib", "rlib"]
13
+
14
+ [features]
15
+ python = ["dep:pyo3"]
16
+
17
+ [dependencies]
18
+ anyhow = "1"
19
+ pyo3 = { version = "0.29.3", optional = true, features = ["abi3-py310", "extension-module"] }
20
+ rayon = "1.12"
21
+ rstar = "0.13"
22
+ rustc-hash = "2"
23
+
24
+ [dev-dependencies]
25
+ serde_json = "1"