blip25-mbe 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.
- blip25_mbe-0.1.0/.github/workflows/ci.yml +34 -0
- blip25_mbe-0.1.0/.github/workflows/wheels.yml +97 -0
- blip25_mbe-0.1.0/.gitignore +27 -0
- blip25_mbe-0.1.0/Cargo.lock +319 -0
- blip25_mbe-0.1.0/Cargo.toml +23 -0
- blip25_mbe-0.1.0/LICENSE +21 -0
- blip25_mbe-0.1.0/PATENT_NOTICE.md +17 -0
- blip25_mbe-0.1.0/PKG-INFO +96 -0
- blip25_mbe-0.1.0/README.md +73 -0
- blip25_mbe-0.1.0/pyproject.toml +34 -0
- blip25_mbe-0.1.0/python/blip25_mbe/__init__.py +26 -0
- blip25_mbe-0.1.0/python/blip25_mbe/_blip25_mbe.pyi +89 -0
- blip25_mbe-0.1.0/src/lib.rs +466 -0
- blip25_mbe-0.1.0/tests/test_smoke.py +67 -0
- blip25_mbe-0.1.0/tests/test_tier2.py +74 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
env:
|
|
10
|
+
CARGO_TERM_COLOR: always
|
|
11
|
+
RUST_BACKTRACE: 1
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
test:
|
|
15
|
+
name: build + test (py${{ matrix.python }})
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
strategy:
|
|
18
|
+
fail-fast: false
|
|
19
|
+
matrix:
|
|
20
|
+
python: ["3.9", "3.12"]
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
- uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ matrix.python }}
|
|
26
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
27
|
+
- uses: Swatinem/rust-cache@v2
|
|
28
|
+
- name: install + build via PEP 517
|
|
29
|
+
run: |
|
|
30
|
+
pip install --upgrade pip
|
|
31
|
+
pip install pytest numpy
|
|
32
|
+
pip install .
|
|
33
|
+
- name: pytest
|
|
34
|
+
run: pytest -v
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
name: wheels
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
linux:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
fail-fast: false
|
|
13
|
+
matrix:
|
|
14
|
+
target: [x86_64, aarch64]
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.12"
|
|
20
|
+
- uses: PyO3/maturin-action@v1
|
|
21
|
+
with:
|
|
22
|
+
target: ${{ matrix.target }}
|
|
23
|
+
args: --release --out dist --find-interpreter
|
|
24
|
+
manylinux: "2_28"
|
|
25
|
+
- uses: actions/upload-artifact@v4
|
|
26
|
+
with:
|
|
27
|
+
name: wheels-linux-${{ matrix.target }}
|
|
28
|
+
path: dist
|
|
29
|
+
|
|
30
|
+
macos:
|
|
31
|
+
runs-on: macos-latest
|
|
32
|
+
strategy:
|
|
33
|
+
fail-fast: false
|
|
34
|
+
matrix:
|
|
35
|
+
target: [x86_64, aarch64]
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
- uses: actions/setup-python@v5
|
|
39
|
+
with:
|
|
40
|
+
python-version: "3.12"
|
|
41
|
+
- uses: PyO3/maturin-action@v1
|
|
42
|
+
with:
|
|
43
|
+
target: ${{ matrix.target }}
|
|
44
|
+
args: --release --out dist --find-interpreter
|
|
45
|
+
- uses: actions/upload-artifact@v4
|
|
46
|
+
with:
|
|
47
|
+
name: wheels-macos-${{ matrix.target }}
|
|
48
|
+
path: dist
|
|
49
|
+
|
|
50
|
+
windows:
|
|
51
|
+
runs-on: windows-latest
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v4
|
|
54
|
+
- uses: actions/setup-python@v5
|
|
55
|
+
with:
|
|
56
|
+
python-version: "3.12"
|
|
57
|
+
- uses: PyO3/maturin-action@v1
|
|
58
|
+
with:
|
|
59
|
+
args: --release --out dist --find-interpreter
|
|
60
|
+
- uses: actions/upload-artifact@v4
|
|
61
|
+
with:
|
|
62
|
+
name: wheels-windows
|
|
63
|
+
path: dist
|
|
64
|
+
|
|
65
|
+
sdist:
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
- uses: PyO3/maturin-action@v1
|
|
70
|
+
with:
|
|
71
|
+
command: sdist
|
|
72
|
+
args: --out dist
|
|
73
|
+
- uses: actions/upload-artifact@v4
|
|
74
|
+
with:
|
|
75
|
+
name: sdist
|
|
76
|
+
path: dist
|
|
77
|
+
|
|
78
|
+
publish:
|
|
79
|
+
name: publish to PyPI
|
|
80
|
+
runs-on: ubuntu-latest
|
|
81
|
+
needs: [linux, macos, windows, sdist]
|
|
82
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
83
|
+
environment: pypi
|
|
84
|
+
permissions:
|
|
85
|
+
id-token: write
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/download-artifact@v4
|
|
88
|
+
- name: gather wheels + sdist
|
|
89
|
+
run: |
|
|
90
|
+
mkdir -p dist
|
|
91
|
+
mv wheels-*/* dist/ 2>/dev/null || true
|
|
92
|
+
mv sdist/* dist/ 2>/dev/null || true
|
|
93
|
+
ls -la dist/
|
|
94
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
95
|
+
with:
|
|
96
|
+
packages-dir: dist
|
|
97
|
+
skip-existing: true
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Rust
|
|
2
|
+
/target/
|
|
3
|
+
Cargo.lock
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*.egg-info/
|
|
9
|
+
.eggs/
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
wheels/
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.mypy_cache/
|
|
17
|
+
.ruff_cache/
|
|
18
|
+
|
|
19
|
+
# maturin
|
|
20
|
+
*.so
|
|
21
|
+
*.pyd
|
|
22
|
+
*.dylib
|
|
23
|
+
|
|
24
|
+
# editor
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.swp
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "autocfg"
|
|
7
|
+
version = "1.5.0"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
|
10
|
+
|
|
11
|
+
[[package]]
|
|
12
|
+
name = "blip25-mbe"
|
|
13
|
+
version = "0.1.0"
|
|
14
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
15
|
+
checksum = "4e687922e1c9fa9aa17352074c1b9bcf34c81a29c4c55e14d9a525d6634ff9fc"
|
|
16
|
+
dependencies = [
|
|
17
|
+
"num-complex",
|
|
18
|
+
"rustfft",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[[package]]
|
|
22
|
+
name = "blip25-mbe-py"
|
|
23
|
+
version = "0.1.0"
|
|
24
|
+
dependencies = [
|
|
25
|
+
"blip25-mbe",
|
|
26
|
+
"numpy",
|
|
27
|
+
"pyo3",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[[package]]
|
|
31
|
+
name = "cfg-if"
|
|
32
|
+
version = "1.0.4"
|
|
33
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
34
|
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
35
|
+
|
|
36
|
+
[[package]]
|
|
37
|
+
name = "heck"
|
|
38
|
+
version = "0.5.0"
|
|
39
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
40
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
41
|
+
|
|
42
|
+
[[package]]
|
|
43
|
+
name = "indoc"
|
|
44
|
+
version = "2.0.7"
|
|
45
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
46
|
+
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
|
|
47
|
+
dependencies = [
|
|
48
|
+
"rustversion",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[[package]]
|
|
52
|
+
name = "libc"
|
|
53
|
+
version = "0.2.186"
|
|
54
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
55
|
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
56
|
+
|
|
57
|
+
[[package]]
|
|
58
|
+
name = "matrixmultiply"
|
|
59
|
+
version = "0.3.10"
|
|
60
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
61
|
+
checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
|
|
62
|
+
dependencies = [
|
|
63
|
+
"autocfg",
|
|
64
|
+
"rawpointer",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
[[package]]
|
|
68
|
+
name = "memoffset"
|
|
69
|
+
version = "0.9.1"
|
|
70
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
71
|
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
|
72
|
+
dependencies = [
|
|
73
|
+
"autocfg",
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
[[package]]
|
|
77
|
+
name = "ndarray"
|
|
78
|
+
version = "0.16.1"
|
|
79
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
80
|
+
checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841"
|
|
81
|
+
dependencies = [
|
|
82
|
+
"matrixmultiply",
|
|
83
|
+
"num-complex",
|
|
84
|
+
"num-integer",
|
|
85
|
+
"num-traits",
|
|
86
|
+
"portable-atomic",
|
|
87
|
+
"portable-atomic-util",
|
|
88
|
+
"rawpointer",
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
[[package]]
|
|
92
|
+
name = "num-complex"
|
|
93
|
+
version = "0.4.6"
|
|
94
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
95
|
+
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
|
96
|
+
dependencies = [
|
|
97
|
+
"num-traits",
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
[[package]]
|
|
101
|
+
name = "num-integer"
|
|
102
|
+
version = "0.1.46"
|
|
103
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
104
|
+
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
|
|
105
|
+
dependencies = [
|
|
106
|
+
"num-traits",
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
[[package]]
|
|
110
|
+
name = "num-traits"
|
|
111
|
+
version = "0.2.19"
|
|
112
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
113
|
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
|
114
|
+
dependencies = [
|
|
115
|
+
"autocfg",
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
[[package]]
|
|
119
|
+
name = "numpy"
|
|
120
|
+
version = "0.22.1"
|
|
121
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
122
|
+
checksum = "edb929bc0da91a4d85ed6c0a84deaa53d411abfb387fc271124f91bf6b89f14e"
|
|
123
|
+
dependencies = [
|
|
124
|
+
"libc",
|
|
125
|
+
"ndarray",
|
|
126
|
+
"num-complex",
|
|
127
|
+
"num-integer",
|
|
128
|
+
"num-traits",
|
|
129
|
+
"pyo3",
|
|
130
|
+
"rustc-hash",
|
|
131
|
+
]
|
|
132
|
+
|
|
133
|
+
[[package]]
|
|
134
|
+
name = "once_cell"
|
|
135
|
+
version = "1.21.4"
|
|
136
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
137
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
138
|
+
|
|
139
|
+
[[package]]
|
|
140
|
+
name = "portable-atomic"
|
|
141
|
+
version = "1.13.1"
|
|
142
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
143
|
+
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
|
|
144
|
+
|
|
145
|
+
[[package]]
|
|
146
|
+
name = "portable-atomic-util"
|
|
147
|
+
version = "0.2.7"
|
|
148
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
149
|
+
checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
|
|
150
|
+
dependencies = [
|
|
151
|
+
"portable-atomic",
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
[[package]]
|
|
155
|
+
name = "primal-check"
|
|
156
|
+
version = "0.3.4"
|
|
157
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
158
|
+
checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08"
|
|
159
|
+
dependencies = [
|
|
160
|
+
"num-integer",
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
[[package]]
|
|
164
|
+
name = "proc-macro2"
|
|
165
|
+
version = "1.0.106"
|
|
166
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
167
|
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
168
|
+
dependencies = [
|
|
169
|
+
"unicode-ident",
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
[[package]]
|
|
173
|
+
name = "pyo3"
|
|
174
|
+
version = "0.22.6"
|
|
175
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
176
|
+
checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
|
|
177
|
+
dependencies = [
|
|
178
|
+
"cfg-if",
|
|
179
|
+
"indoc",
|
|
180
|
+
"libc",
|
|
181
|
+
"memoffset",
|
|
182
|
+
"once_cell",
|
|
183
|
+
"portable-atomic",
|
|
184
|
+
"pyo3-build-config",
|
|
185
|
+
"pyo3-ffi",
|
|
186
|
+
"pyo3-macros",
|
|
187
|
+
"unindent",
|
|
188
|
+
]
|
|
189
|
+
|
|
190
|
+
[[package]]
|
|
191
|
+
name = "pyo3-build-config"
|
|
192
|
+
version = "0.22.6"
|
|
193
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
194
|
+
checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38"
|
|
195
|
+
dependencies = [
|
|
196
|
+
"once_cell",
|
|
197
|
+
"target-lexicon",
|
|
198
|
+
]
|
|
199
|
+
|
|
200
|
+
[[package]]
|
|
201
|
+
name = "pyo3-ffi"
|
|
202
|
+
version = "0.22.6"
|
|
203
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
204
|
+
checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636"
|
|
205
|
+
dependencies = [
|
|
206
|
+
"libc",
|
|
207
|
+
"pyo3-build-config",
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
[[package]]
|
|
211
|
+
name = "pyo3-macros"
|
|
212
|
+
version = "0.22.6"
|
|
213
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
214
|
+
checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453"
|
|
215
|
+
dependencies = [
|
|
216
|
+
"proc-macro2",
|
|
217
|
+
"pyo3-macros-backend",
|
|
218
|
+
"quote",
|
|
219
|
+
"syn",
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
[[package]]
|
|
223
|
+
name = "pyo3-macros-backend"
|
|
224
|
+
version = "0.22.6"
|
|
225
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
226
|
+
checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe"
|
|
227
|
+
dependencies = [
|
|
228
|
+
"heck",
|
|
229
|
+
"proc-macro2",
|
|
230
|
+
"pyo3-build-config",
|
|
231
|
+
"quote",
|
|
232
|
+
"syn",
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
[[package]]
|
|
236
|
+
name = "quote"
|
|
237
|
+
version = "1.0.45"
|
|
238
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
239
|
+
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
|
240
|
+
dependencies = [
|
|
241
|
+
"proc-macro2",
|
|
242
|
+
]
|
|
243
|
+
|
|
244
|
+
[[package]]
|
|
245
|
+
name = "rawpointer"
|
|
246
|
+
version = "0.2.1"
|
|
247
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
248
|
+
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
|
|
249
|
+
|
|
250
|
+
[[package]]
|
|
251
|
+
name = "rustc-hash"
|
|
252
|
+
version = "1.1.0"
|
|
253
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
254
|
+
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
|
255
|
+
|
|
256
|
+
[[package]]
|
|
257
|
+
name = "rustfft"
|
|
258
|
+
version = "6.4.1"
|
|
259
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
260
|
+
checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89"
|
|
261
|
+
dependencies = [
|
|
262
|
+
"num-complex",
|
|
263
|
+
"num-integer",
|
|
264
|
+
"num-traits",
|
|
265
|
+
"primal-check",
|
|
266
|
+
"strength_reduce",
|
|
267
|
+
"transpose",
|
|
268
|
+
]
|
|
269
|
+
|
|
270
|
+
[[package]]
|
|
271
|
+
name = "rustversion"
|
|
272
|
+
version = "1.0.22"
|
|
273
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
274
|
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
|
275
|
+
|
|
276
|
+
[[package]]
|
|
277
|
+
name = "strength_reduce"
|
|
278
|
+
version = "0.2.4"
|
|
279
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
280
|
+
checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82"
|
|
281
|
+
|
|
282
|
+
[[package]]
|
|
283
|
+
name = "syn"
|
|
284
|
+
version = "2.0.117"
|
|
285
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
286
|
+
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
|
287
|
+
dependencies = [
|
|
288
|
+
"proc-macro2",
|
|
289
|
+
"quote",
|
|
290
|
+
"unicode-ident",
|
|
291
|
+
]
|
|
292
|
+
|
|
293
|
+
[[package]]
|
|
294
|
+
name = "target-lexicon"
|
|
295
|
+
version = "0.12.16"
|
|
296
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
297
|
+
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
|
298
|
+
|
|
299
|
+
[[package]]
|
|
300
|
+
name = "transpose"
|
|
301
|
+
version = "0.2.3"
|
|
302
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
303
|
+
checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e"
|
|
304
|
+
dependencies = [
|
|
305
|
+
"num-integer",
|
|
306
|
+
"strength_reduce",
|
|
307
|
+
]
|
|
308
|
+
|
|
309
|
+
[[package]]
|
|
310
|
+
name = "unicode-ident"
|
|
311
|
+
version = "1.0.24"
|
|
312
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
313
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
314
|
+
|
|
315
|
+
[[package]]
|
|
316
|
+
name = "unindent"
|
|
317
|
+
version = "0.2.4"
|
|
318
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
319
|
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "blip25-mbe-py"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
authors = ["Chance Lindsey"]
|
|
6
|
+
license = "MIT"
|
|
7
|
+
description = "Python bindings for blip25-mbe (P25 MBE/IMBE/AMBE+2 vocoder family)"
|
|
8
|
+
repository = "https://github.com/openBLIP25/blip25-mbe-py"
|
|
9
|
+
publish = false
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
|
|
12
|
+
[lib]
|
|
13
|
+
name = "_blip25_mbe"
|
|
14
|
+
crate-type = ["cdylib"]
|
|
15
|
+
|
|
16
|
+
[dependencies]
|
|
17
|
+
blip25-mbe = "0.1.0"
|
|
18
|
+
pyo3 = { version = "0.22", features = ["extension-module", "abi3-py39"] }
|
|
19
|
+
numpy = "0.22"
|
|
20
|
+
|
|
21
|
+
[profile.release]
|
|
22
|
+
lto = "thin"
|
|
23
|
+
codegen-units = 1
|
blip25_mbe-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chance Lindsey
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Patent Notice
|
|
2
|
+
|
|
3
|
+
`blip25-py` is a thin Python binding around the upstream Rust crate
|
|
4
|
+
[`blip25-mbe`](https://github.com/openBLIP25/blip25-mbe). All patent
|
|
5
|
+
considerations from upstream carry through. See
|
|
6
|
+
[`blip25-mbe/PATENT_NOTICE.md`](https://github.com/openBLIP25/blip25-mbe/blob/main/PATENT_NOTICE.md)
|
|
7
|
+
for the authoritative notice.
|
|
8
|
+
|
|
9
|
+
Summary, for convenience only — the upstream file is authoritative:
|
|
10
|
+
|
|
11
|
+
- IMBE and AMBE / AMBE+ patents are expired.
|
|
12
|
+
- AMBE+2 is protected by US 8,359,197 (expires 2028-05-20). Use of
|
|
13
|
+
`Rate.AMBEPLUS2_3600x2450` / `Rate.AMBEPLUS2_2450x2450` in
|
|
14
|
+
jurisdictions where this patent is in force is at the user's risk.
|
|
15
|
+
- This package is distributed for research, education, and
|
|
16
|
+
interoperability testing. Commercial use should be reviewed against
|
|
17
|
+
the upstream notice.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: blip25-mbe
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Classifier: Development Status :: 3 - Alpha
|
|
5
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: Programming Language :: Rust
|
|
8
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
9
|
+
Classifier: Topic :: Communications :: Ham Radio
|
|
10
|
+
Requires-Dist: numpy>=1.22
|
|
11
|
+
Requires-Dist: pytest>=7 ; extra == 'test'
|
|
12
|
+
Provides-Extra: test
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Summary: Python bindings for blip25-mbe — P25 MBE/IMBE/AMBE+2 vocoder family
|
|
15
|
+
Author: Chance Lindsey
|
|
16
|
+
License: MIT
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
19
|
+
Project-URL: Homepage, https://github.com/openBLIP25/blip25-mbe-py
|
|
20
|
+
Project-URL: Repository, https://github.com/openBLIP25/blip25-mbe-py
|
|
21
|
+
Project-URL: Upstream, https://github.com/openBLIP25/blip25-mbe
|
|
22
|
+
|
|
23
|
+
# blip25-mbe (Python)
|
|
24
|
+
|
|
25
|
+
Python bindings for [`blip25-mbe`](https://github.com/openBLIP25/blip25-mbe),
|
|
26
|
+
a research-grade Rust implementation of the MBE / IMBE / AMBE+2 vocoder
|
|
27
|
+
family for P25 Phase 1 and Phase 2 pipelines.
|
|
28
|
+
|
|
29
|
+
> **Patents.** AMBE+2 is covered by US 8,359,197 until 2028-05-20. See
|
|
30
|
+
> [`PATENT_NOTICE.md`](./PATENT_NOTICE.md).
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install blip25-mbe
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Wheels are published for Linux (manylinux 2_28), macOS (x86_64 + arm64),
|
|
39
|
+
and Windows for Python 3.9+.
|
|
40
|
+
|
|
41
|
+
## Quick start
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
import numpy as np
|
|
45
|
+
import blip25_mbe
|
|
46
|
+
|
|
47
|
+
# One-shot frame round-trip
|
|
48
|
+
vc = blip25_mbe.Vocoder(blip25_mbe.Rate.IMBE_7200X4400)
|
|
49
|
+
pcm_in = np.zeros(vc.frame_samples, dtype=np.int16) # 160 samples = 20 ms
|
|
50
|
+
bits = vc.encode_pcm(pcm_in) # 18-byte FEC frame
|
|
51
|
+
pcm_out = vc.decode_bits(bits) # back to np.int16
|
|
52
|
+
|
|
53
|
+
# Streaming over arbitrary-sized chunks
|
|
54
|
+
enc = blip25_mbe.LiveEncoder(blip25_mbe.Rate.AMBEPLUS2_3600X2450)
|
|
55
|
+
for chunk in pcm_chunks: # any size, any rate
|
|
56
|
+
for frame in enc.push(chunk):
|
|
57
|
+
socket.send(frame) # 9 bytes each
|
|
58
|
+
|
|
59
|
+
# Wire-format bridge (Phase 1 IMBE ⇄ Phase 2 AMBE+2)
|
|
60
|
+
tc = blip25_mbe.Transcoder(
|
|
61
|
+
blip25_mbe.Rate.IMBE_7200X4400,
|
|
62
|
+
blip25_mbe.Rate.AMBEPLUS2_3600X2450,
|
|
63
|
+
)
|
|
64
|
+
out_bits = tc.transcode(in_bits)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`encode_pcm` accepts any `np.int16` array; `decode_bits` returns a fresh
|
|
68
|
+
`np.int16` array. Length must match `vc.frame_samples` / `vc.fec_frame_bytes`.
|
|
69
|
+
|
|
70
|
+
## Rates
|
|
71
|
+
|
|
72
|
+
| Python | Codec | Wire size | Bitrate |
|
|
73
|
+
|-----------------------------------|-------------|-----------|-------------|
|
|
74
|
+
| `Rate.IMBE_7200X4400` | IMBE | 18 bytes | 7 200 bps |
|
|
75
|
+
| `Rate.IMBE_4400X4400` | IMBE no-FEC | 11 bytes | 4 400 bps |
|
|
76
|
+
| `Rate.AMBEPLUS2_3600X2450` | AMBE+2 | 9 bytes | 3 600 bps |
|
|
77
|
+
| `Rate.AMBEPLUS2_2450X2450` | AMBE+2 no-FEC | 7 bytes | 2 450 bps |
|
|
78
|
+
|
|
79
|
+
## Building from source
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install maturin
|
|
83
|
+
maturin develop --release # editable install into current venv
|
|
84
|
+
pytest # smoke tests
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Sibling packages
|
|
88
|
+
|
|
89
|
+
`blip25-mbe` is the vocoder wrapper. Future blip25 components (decoder /
|
|
90
|
+
SDR layer) will ship as separate PyPI packages with their own
|
|
91
|
+
`blip25_*` import names — they don't share a namespace with this one.
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
MIT — see [`LICENSE`](./LICENSE).
|
|
96
|
+
|