fuzzgpu 0.1.6__tar.gz → 0.1.7__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 (66) hide show
  1. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/Cargo.lock +2 -2
  2. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/PKG-INFO +39 -23
  3. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/README.md +38 -22
  4. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/Cargo.toml +1 -1
  5. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/jaro.wgsl +12 -3
  6. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/jaro_matrix.wgsl +13 -3
  7. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-python/Cargo.toml +2 -2
  8. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-wasm/Cargo.toml +1 -1
  9. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-wasm/src/lib.rs +4 -4
  10. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/pyproject.toml +1 -1
  11. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/Cargo.toml +0 -0
  12. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/LICENSE +0 -0
  13. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/assets/logo.png +0 -0
  14. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/benches/bench.rs +0 -0
  15. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/damerau.rs +0 -0
  16. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/fuzz.rs +0 -0
  17. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/gpu.rs +0 -0
  18. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/jaro.rs +0 -0
  19. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/levenshtein.rs +0 -0
  20. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/lib.rs +0 -0
  21. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/needleman.rs +0 -0
  22. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/damerau.wgsl +0 -0
  23. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/damerau_matrix.wgsl +0 -0
  24. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/levenshtein.wgsl +0 -0
  25. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/levenshtein_cdist_myers.wgsl +0 -0
  26. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/levenshtein_matrix.wgsl +0 -0
  27. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/levenshtein_myers.wgsl +0 -0
  28. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/levenshtein_short.wgsl +0 -0
  29. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/needleman_affine.wgsl +0 -0
  30. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/shaders/needleman_wavefront.wgsl +0 -0
  31. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/src/simd.rs +0 -0
  32. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/tests/differential.proptest-regressions +0 -0
  33. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/tests/differential.rs +0 -0
  34. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/tests/fixtures/broken.wgsl +0 -0
  35. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-core/tests/kernel_registration.rs +0 -0
  36. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-python/src/lib.rs +0 -0
  37. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-wasm/tests/differential_harness.js +0 -0
  38. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/crates/fuzzgpu-wasm/tests/js_api.test.cjs +0 -0
  39. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/__init__.py +0 -0
  40. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/__init__.pyi +0 -0
  41. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/DamerauLevenshtein.py +0 -0
  42. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Hamming.py +0 -0
  43. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Indel.py +0 -0
  44. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Jaro.py +0 -0
  45. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/JaroWinkler.py +0 -0
  46. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/LCSseq.py +0 -0
  47. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Levenshtein.py +0 -0
  48. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/OSA.py +0 -0
  49. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Postfix.py +0 -0
  50. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/Prefix.py +0 -0
  51. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/__init__.py +0 -0
  52. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/__init__.pyi +0 -0
  53. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/distance/_common.py +0 -0
  54. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/fuzz.py +0 -0
  55. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/fuzz.pyi +0 -0
  56. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/process.py +0 -0
  57. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/python/fuzzgpu/process.pyi +0 -0
  58. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_api_signatures.py +0 -0
  59. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_basic.py +0 -0
  60. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_concurrency.py +0 -0
  61. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_edge_cases.py +0 -0
  62. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_invariants.py +0 -0
  63. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_out_buffers.py +0 -0
  64. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_rapidfuzz_compat.py +0 -0
  65. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/test_stress.py +0 -0
  66. {fuzzgpu-0.1.6 → fuzzgpu-0.1.7}/tests/wasm_python_differential.py +0 -0
@@ -372,7 +372,7 @@ dependencies = [
372
372
 
373
373
  [[package]]
374
374
  name = "fuzzgpu-core"
375
- version = "0.1.6"
375
+ version = "0.1.7"
376
376
  dependencies = [
377
377
  "bytemuck",
378
378
  "criterion",
@@ -386,7 +386,7 @@ dependencies = [
386
386
 
387
387
  [[package]]
388
388
  name = "fuzzgpu-python"
389
- version = "0.1.6"
389
+ version = "0.1.7"
390
390
  dependencies = [
391
391
  "fuzzgpu-core",
392
392
  "log",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fuzzgpu
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -37,7 +37,7 @@ Project-URL: Repository, https://github.com/kuntal-devrat/fuzzgpu
37
37
 
38
38
  *Cross-platform GPU compute via WebGPU (`wgpu`) & Multi-Core CPU parallelism with Rayon. Zero CUDA dependencies.*
39
39
 
40
- [![PyPI Version](https://img.shields.io/badge/pypi-v0.1.6-blue.svg?style=flat-square)](https://pypi.org/project/fuzzgpu/)
40
+ [![PyPI Version](https://img.shields.io/badge/pypi-v0.1.7-blue.svg?style=flat-square)](https://pypi.org/project/fuzzgpu/)
41
41
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](https://opensource.org/licenses/MIT)
42
42
  [![Rust](https://img.shields.io/badge/rust-1.87+-orange.svg?style=flat-square)](https://www.rust-lang.org)
43
43
  [![Cross Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux%20%7C%20WASM-lightgrey.svg?style=flat-square)](https://github.com/kuntal-devrat/fuzzgpu)
@@ -60,34 +60,50 @@ No NVIDIA CUDA drivers or complex toolkits required.
60
60
 
61
61
  ---
62
62
 
63
- ## What's New in v0.1.6
63
+ ## What's New in v0.1.7
64
+
65
+ ### Bug fixes (Windows DX12 / Jaro shader)
66
+ - **Jaro GPU shader FXC crash fixed** — `jaro.wgsl` and `jaro_matrix.wgsl` used dynamic vector
67
+ component writes (`v[j >> 5u] = ...`) in `bit_set()`. FXC (the DX12 HLSL compiler) cannot
68
+ emit a dynamic register-indexed store for a non-constant index, causing a hard compile failure
69
+ with `X3550`/`X3511` on every Windows DX12 runner — all 11 Jaro GPU tests were panicking.
70
+ Fixed by rewriting `bit_set` with `select()`-based static construction, which compiles
71
+ identically on all backends (Vulkan, Metal, DX12).
72
+
73
+ ### Bug fixes (arity mismatch — wasm & fuzz crates)
74
+ - **`fuzzgpu-wasm`** — `partial_ratio`, `token_sort_ratio`, `token_set_ratio`, `wratio` gained
75
+ a `score_cutoff: f64` parameter in the v0.1.6 Rust core rewrite for rapidfuzz parity, but
76
+ the WASM bindings were not updated, causing 4 `E0061` compile errors. Fixed by passing
77
+ `0.0` as the cutoff (no cutoff — identical to the previous behaviour).
78
+ - **`fuzzgpu-fuzz`** — same four callsites in `fuzz/src/lib.rs` had the same arity mismatch.
79
+ Fixed identically.
80
+
81
+ ### Includes all v0.1.6 features
82
+ All features from v0.1.6 are included — see the v0.1.6 changelog below.
83
+
84
+ ---
85
+
86
+ <details>
87
+ <summary><b>Previous (v0.1.6)</b></summary>
64
88
 
65
89
  ### Drop-in rapidfuzz parity (Python)
66
90
  The full Python layer is now byte-identical to rapidfuzz 3.14.5 over a 169,744-pair differential harness across `ratio`, `partial_ratio`, `token_sort_ratio`, `token_set_ratio`, `token_ratio`, `WRatio`, `QRatio`, `partial_token_*`, `jaro`, `jaro_winkler`, `levenshtein`, `indel`, `hamming`, `osa` — **0 mismatches**.
67
91
 
68
92
  ### Bug fixes (Rust core, float parity)
69
- - **`ratio` / `partial_ratio` cutoff imprecision** — port of rapidfuzz's load-bearing `NormSim_to_NormDist = min(1, 1 - cutoff/100 + 1e-5)` term. Without it, the branch-and-bound would silently reject ties at exact cutoffs (e.g. `partial_ratio("park", "ba", score_cutoff=50.0)` returned `0` instead of `50`).
70
- - **`ratio` score formula** — switched from `((len-dist)/len)*100` to `(1 - dist/len)*100` to match rapidfuzz C++'s exact ulp order (`indel_normalized_similarity * 100`).
93
+ - **`ratio` / `partial_ratio` cutoff imprecision** — port of rapidfuzz's load-bearing `NormSim_to_NormDist = min(1, 1 - cutoff/100 + 1e-5)` term.
94
+ - **`ratio` score formula** — switched from `((len-dist)/len)*100` to `(1 - dist/len)*100` to match rapidfuzz C++'s exact ulp order.
71
95
 
72
96
  ### New features (Python distance layer)
73
- - **`Editops` / `Opcodes` / `Editop` / `Opcode` / `MatchingBlock` / `ScoreAlignment`** classes (rapidfuzz-compatible list-/tuple-likes with `as_list`, `as_opcodes`, `as_editops`, `as_matching_blocks`, `apply`, `inverse`, `remove_subsequence`, `from_*`).
74
- - **`Levenshtein.editops` / `.opcodes`** exact Myers bit-parallel port with `common_affix` (suffix measured on post-prefix slice, matching rapidfuzz).
75
- - **`LCSseq`** module Myers LCS bit-parallel matrix + editops/opcodes (delete-checked-first traceback).
76
- - **`Prefix`** and **`Postfix`** modules with the C++ `1 - dist/maximum` ulp order.
77
- - **`Hamming.editops` / `.opcodes`** — replace-per-mismatch + padding delete/insert model.
78
- - **`Indel.editops` / `.opcodes`** — delegates to `LCSseq` (matching rapidfuzz C++).
79
- - **`fuzz.partial_ratio_alignment`** now returns `ScoreAlignment(score, src_start, src_end, dest_start, dest_end)` — drop-in compatible with rapidfuzz.
80
- - **`process.extract` / `extractOne` / `cdist`** default to `WRatio` (matches rapidfuzz 3.14.5).
81
- - **`token_ratio` / `partial_token_ratio`** exposed at top level (`fuzzgpu.token_ratio`, `fuzzgpu.partial_token_ratio`).
82
- - All alignment types re-exported at the package root (`fuzzgpu.Editop`, `fuzzgpu.Editops`, etc.).
83
-
84
- ### Type stubs
85
- - `__init__.pyi`, `fuzz.pyi`, `process.pyi`, `distance/__init__.pyi` updated for the new APIs.
97
+ - **`Editops` / `Opcodes` / `Editop` / `Opcode` / `MatchingBlock` / `ScoreAlignment`** classes (rapidfuzz-compatible).
98
+ - **`Levenshtein.editops` / `.opcodes`**, **`LCSseq`**, **`Prefix`**, **`Postfix`**, **`Hamming.editops`**, **`Indel.editops`** modules.
99
+ - **`fuzz.partial_ratio_alignment`** returns `ScoreAlignment` (rapidfuzz-compatible).
100
+ - **`process.extract` / `extractOne` / `cdist`** default to `WRatio`.
101
+ - All alignment types re-exported at the package root.
86
102
 
87
- ---
103
+ </details>
88
104
 
89
105
  <details>
90
- <summary><b>Previous (v0.1.5</b</summary>
106
+ <summary><b>Previous (v0.1.5)</b></summary>
91
107
 
92
108
  ### Bug fixes
93
109
  - **Damerau-Levenshtein safety gate** now fires in release builds (`assert!` not `debug_assert!`) — non-ASCII inputs no longer silently produce wrong distances in production wheels
@@ -147,7 +163,7 @@ pip install fuzzgpu
147
163
  ```toml
148
164
  # Rust
149
165
  [dependencies]
150
- fuzzgpu-core = "0.1.6"
166
+ fuzzgpu-core = "0.1.7"
151
167
  ```
152
168
 
153
169
  ---
@@ -243,8 +259,8 @@ fuzzgpu.set_cpu_only(True) # force CPU-only mode
243
259
 
244
260
  ```toml
245
261
  [dependencies]
246
- fuzzgpu-core = "0.1.6" # GPU + CPU fallback
247
- # fuzzgpu-core = { version = "0.1.6", default-features = false } # CPU-only
262
+ fuzzgpu-core = "0.1.7" # GPU + CPU fallback
263
+ # fuzzgpu-core = { version = "0.1.7", default-features = false } # CPU-only
248
264
  ```
249
265
 
250
266
  ```rust
@@ -8,7 +8,7 @@
8
8
 
9
9
  *Cross-platform GPU compute via WebGPU (`wgpu`) & Multi-Core CPU parallelism with Rayon. Zero CUDA dependencies.*
10
10
 
11
- [![PyPI Version](https://img.shields.io/badge/pypi-v0.1.6-blue.svg?style=flat-square)](https://pypi.org/project/fuzzgpu/)
11
+ [![PyPI Version](https://img.shields.io/badge/pypi-v0.1.7-blue.svg?style=flat-square)](https://pypi.org/project/fuzzgpu/)
12
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](https://opensource.org/licenses/MIT)
13
13
  [![Rust](https://img.shields.io/badge/rust-1.87+-orange.svg?style=flat-square)](https://www.rust-lang.org)
14
14
  [![Cross Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux%20%7C%20WASM-lightgrey.svg?style=flat-square)](https://github.com/kuntal-devrat/fuzzgpu)
@@ -31,34 +31,50 @@ No NVIDIA CUDA drivers or complex toolkits required.
31
31
 
32
32
  ---
33
33
 
34
- ## What's New in v0.1.6
34
+ ## What's New in v0.1.7
35
+
36
+ ### Bug fixes (Windows DX12 / Jaro shader)
37
+ - **Jaro GPU shader FXC crash fixed** — `jaro.wgsl` and `jaro_matrix.wgsl` used dynamic vector
38
+ component writes (`v[j >> 5u] = ...`) in `bit_set()`. FXC (the DX12 HLSL compiler) cannot
39
+ emit a dynamic register-indexed store for a non-constant index, causing a hard compile failure
40
+ with `X3550`/`X3511` on every Windows DX12 runner — all 11 Jaro GPU tests were panicking.
41
+ Fixed by rewriting `bit_set` with `select()`-based static construction, which compiles
42
+ identically on all backends (Vulkan, Metal, DX12).
43
+
44
+ ### Bug fixes (arity mismatch — wasm & fuzz crates)
45
+ - **`fuzzgpu-wasm`** — `partial_ratio`, `token_sort_ratio`, `token_set_ratio`, `wratio` gained
46
+ a `score_cutoff: f64` parameter in the v0.1.6 Rust core rewrite for rapidfuzz parity, but
47
+ the WASM bindings were not updated, causing 4 `E0061` compile errors. Fixed by passing
48
+ `0.0` as the cutoff (no cutoff — identical to the previous behaviour).
49
+ - **`fuzzgpu-fuzz`** — same four callsites in `fuzz/src/lib.rs` had the same arity mismatch.
50
+ Fixed identically.
51
+
52
+ ### Includes all v0.1.6 features
53
+ All features from v0.1.6 are included — see the v0.1.6 changelog below.
54
+
55
+ ---
56
+
57
+ <details>
58
+ <summary><b>Previous (v0.1.6)</b></summary>
35
59
 
36
60
  ### Drop-in rapidfuzz parity (Python)
37
61
  The full Python layer is now byte-identical to rapidfuzz 3.14.5 over a 169,744-pair differential harness across `ratio`, `partial_ratio`, `token_sort_ratio`, `token_set_ratio`, `token_ratio`, `WRatio`, `QRatio`, `partial_token_*`, `jaro`, `jaro_winkler`, `levenshtein`, `indel`, `hamming`, `osa` — **0 mismatches**.
38
62
 
39
63
  ### Bug fixes (Rust core, float parity)
40
- - **`ratio` / `partial_ratio` cutoff imprecision** — port of rapidfuzz's load-bearing `NormSim_to_NormDist = min(1, 1 - cutoff/100 + 1e-5)` term. Without it, the branch-and-bound would silently reject ties at exact cutoffs (e.g. `partial_ratio("park", "ba", score_cutoff=50.0)` returned `0` instead of `50`).
41
- - **`ratio` score formula** — switched from `((len-dist)/len)*100` to `(1 - dist/len)*100` to match rapidfuzz C++'s exact ulp order (`indel_normalized_similarity * 100`).
64
+ - **`ratio` / `partial_ratio` cutoff imprecision** — port of rapidfuzz's load-bearing `NormSim_to_NormDist = min(1, 1 - cutoff/100 + 1e-5)` term.
65
+ - **`ratio` score formula** — switched from `((len-dist)/len)*100` to `(1 - dist/len)*100` to match rapidfuzz C++'s exact ulp order.
42
66
 
43
67
  ### New features (Python distance layer)
44
- - **`Editops` / `Opcodes` / `Editop` / `Opcode` / `MatchingBlock` / `ScoreAlignment`** classes (rapidfuzz-compatible list-/tuple-likes with `as_list`, `as_opcodes`, `as_editops`, `as_matching_blocks`, `apply`, `inverse`, `remove_subsequence`, `from_*`).
45
- - **`Levenshtein.editops` / `.opcodes`** exact Myers bit-parallel port with `common_affix` (suffix measured on post-prefix slice, matching rapidfuzz).
46
- - **`LCSseq`** module Myers LCS bit-parallel matrix + editops/opcodes (delete-checked-first traceback).
47
- - **`Prefix`** and **`Postfix`** modules with the C++ `1 - dist/maximum` ulp order.
48
- - **`Hamming.editops` / `.opcodes`** — replace-per-mismatch + padding delete/insert model.
49
- - **`Indel.editops` / `.opcodes`** — delegates to `LCSseq` (matching rapidfuzz C++).
50
- - **`fuzz.partial_ratio_alignment`** now returns `ScoreAlignment(score, src_start, src_end, dest_start, dest_end)` — drop-in compatible with rapidfuzz.
51
- - **`process.extract` / `extractOne` / `cdist`** default to `WRatio` (matches rapidfuzz 3.14.5).
52
- - **`token_ratio` / `partial_token_ratio`** exposed at top level (`fuzzgpu.token_ratio`, `fuzzgpu.partial_token_ratio`).
53
- - All alignment types re-exported at the package root (`fuzzgpu.Editop`, `fuzzgpu.Editops`, etc.).
54
-
55
- ### Type stubs
56
- - `__init__.pyi`, `fuzz.pyi`, `process.pyi`, `distance/__init__.pyi` updated for the new APIs.
68
+ - **`Editops` / `Opcodes` / `Editop` / `Opcode` / `MatchingBlock` / `ScoreAlignment`** classes (rapidfuzz-compatible).
69
+ - **`Levenshtein.editops` / `.opcodes`**, **`LCSseq`**, **`Prefix`**, **`Postfix`**, **`Hamming.editops`**, **`Indel.editops`** modules.
70
+ - **`fuzz.partial_ratio_alignment`** returns `ScoreAlignment` (rapidfuzz-compatible).
71
+ - **`process.extract` / `extractOne` / `cdist`** default to `WRatio`.
72
+ - All alignment types re-exported at the package root.
57
73
 
58
- ---
74
+ </details>
59
75
 
60
76
  <details>
61
- <summary><b>Previous (v0.1.5</b</summary>
77
+ <summary><b>Previous (v0.1.5)</b></summary>
62
78
 
63
79
  ### Bug fixes
64
80
  - **Damerau-Levenshtein safety gate** now fires in release builds (`assert!` not `debug_assert!`) — non-ASCII inputs no longer silently produce wrong distances in production wheels
@@ -118,7 +134,7 @@ pip install fuzzgpu
118
134
  ```toml
119
135
  # Rust
120
136
  [dependencies]
121
- fuzzgpu-core = "0.1.6"
137
+ fuzzgpu-core = "0.1.7"
122
138
  ```
123
139
 
124
140
  ---
@@ -214,8 +230,8 @@ fuzzgpu.set_cpu_only(True) # force CPU-only mode
214
230
 
215
231
  ```toml
216
232
  [dependencies]
217
- fuzzgpu-core = "0.1.6" # GPU + CPU fallback
218
- # fuzzgpu-core = { version = "0.1.6", default-features = false } # CPU-only
233
+ fuzzgpu-core = "0.1.7" # GPU + CPU fallback
234
+ # fuzzgpu-core = { version = "0.1.7", default-features = false } # CPU-only
219
235
  ```
220
236
 
221
237
  ```rust
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fuzzgpu-core"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  edition = "2021"
5
5
  description = "GPU-accelerated fuzzy string matching engine"
6
6
  license = "MIT"
@@ -51,10 +51,19 @@ fn bit_test(mb: vec4<u32>, j: u32) -> bool {
51
51
  }
52
52
 
53
53
  // Return the bitmap with bit j set.
54
+ // Uses select() instead of dynamic vector l-value indexing (v[expr] = ...)
55
+ // because FXC (DX12 HLSL compiler) does not support dynamic vector component
56
+ // writes — it cannot emit a register-indexed store for a non-constant index
57
+ // and fails with X3550/X3511 when it tries to unroll around it.
54
58
  fn bit_set(mb: vec4<u32>, j: u32) -> vec4<u32> {
55
- var v = mb;
56
- v[j >> 5u] = v[j >> 5u] | (1u << (j & 31u));
57
- return v;
59
+ let word = j >> 5u;
60
+ let bit = 1u << (j & 31u);
61
+ return vec4<u32>(
62
+ mb.x | select(0u, bit, word == 0u),
63
+ mb.y | select(0u, bit, word == 1u),
64
+ mb.z | select(0u, bit, word == 2u),
65
+ mb.w | select(0u, bit, word == 3u),
66
+ );
58
67
  }
59
68
 
60
69
  @compute @workgroup_size(64)
@@ -25,10 +25,20 @@ fn bit_test(mb: vec4<u32>, j: u32) -> bool {
25
25
  return ((mb[j >> 5u] >> (j & 31u)) & 1u) != 0u;
26
26
  }
27
27
 
28
+ // Return the bitmap with bit j set.
29
+ // Uses select() instead of dynamic vector l-value indexing (v[expr] = ...)
30
+ // because FXC (DX12 HLSL compiler) does not support dynamic vector component
31
+ // writes — it cannot emit a register-indexed store for a non-constant index
32
+ // and fails with X3550/X3511 when it tries to unroll around it.
28
33
  fn bit_set(mb: vec4<u32>, j: u32) -> vec4<u32> {
29
- var v = mb;
30
- v[j >> 5u] = v[j >> 5u] | (1u << (j & 31u));
31
- return v;
34
+ let word = j >> 5u;
35
+ let bit = 1u << (j & 31u);
36
+ return vec4<u32>(
37
+ mb.x | select(0u, bit, word == 0u),
38
+ mb.y | select(0u, bit, word == 1u),
39
+ mb.z | select(0u, bit, word == 2u),
40
+ mb.w | select(0u, bit, word == 3u),
41
+ );
32
42
  }
33
43
 
34
44
  @compute @workgroup_size(16, 16)
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fuzzgpu-python"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  edition = "2021"
5
5
  description = "Python bindings for FuzzGPU: GPU-accelerated fuzzy string matching engine"
6
6
  license = "MIT"
@@ -17,7 +17,7 @@ default = ["gpu"]
17
17
  gpu = ["fuzzgpu-core/gpu"]
18
18
 
19
19
  [dependencies]
20
- fuzzgpu-core = { path = "../fuzzgpu-core", version = "0.1.6", default-features = false }
20
+ fuzzgpu-core = { path = "../fuzzgpu-core", version = "0.1.7", default-features = false }
21
21
  pyo3 = { workspace = true, features = ["abi3-py310"] }
22
22
  numpy = "0.23"
23
23
  pollster = { workspace = true }
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fuzzgpu-wasm"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  edition = "2021"
5
5
 
6
6
  [workspace]
@@ -57,22 +57,22 @@ pub fn ratio(a: &str, b: &str) -> f64 {
57
57
 
58
58
  #[wasm_bindgen]
59
59
  pub fn partial_ratio(a: &str, b: &str) -> f64 {
60
- fuzzgpu_core::partial_ratio(a, b)
60
+ fuzzgpu_core::partial_ratio(a, b, 0.0)
61
61
  }
62
62
 
63
63
  #[wasm_bindgen]
64
64
  pub fn token_sort_ratio(a: &str, b: &str) -> f64 {
65
- fuzzgpu_core::token_sort_ratio(a, b)
65
+ fuzzgpu_core::token_sort_ratio(a, b, 0.0)
66
66
  }
67
67
 
68
68
  #[wasm_bindgen]
69
69
  pub fn token_set_ratio(a: &str, b: &str) -> f64 {
70
- fuzzgpu_core::token_set_ratio(a, b)
70
+ fuzzgpu_core::token_set_ratio(a, b, 0.0)
71
71
  }
72
72
 
73
73
  #[wasm_bindgen]
74
74
  pub fn wratio(a: &str, b: &str) -> f64 {
75
- fuzzgpu_core::wratio(a, b)
75
+ fuzzgpu_core::wratio(a, b, 0.0)
76
76
  }
77
77
 
78
78
  #[wasm_bindgen]
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "fuzzgpu"
7
- version = "0.1.6"
7
+ version = "0.1.7"
8
8
  description = "Hardware-accelerated fuzzy string matching & sequence alignment — cross-platform, no CUDA required"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes