Skip to content

Commit f86f141

Browse files
authored
Merge branch 'master' into perf/array-param-batched-fill
2 parents 2b71b91 + dc8e57d commit f86f141

20 files changed

Lines changed: 810 additions & 225 deletions

.github/workflows/build-with-clang.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313

1414
strategy:
1515
matrix:
16-
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
16+
python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]
1717
numpy_version: ["'numpy>=2'"]
1818
env:
1919
ONEAPI_ROOT: /opt/intel/oneapi
@@ -55,7 +55,7 @@ jobs:
5555

5656
- name: Install mkl_random dependencies
5757
run: |
58-
pip install meson-python ninja cython cmake
58+
pip install meson-python ninja "cython>=3.1.0" cmake
5959
pip install ${{ matrix.numpy_version }}
6060
6161
- name: List oneAPI folder content

.github/workflows/build-with-standard-clang.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414

1515
strategy:
1616
matrix:
17-
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
17+
python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]
1818
numpy_version: ["'numpy>=2'"]
1919

2020
env:
@@ -49,7 +49,7 @@ jobs:
4949

5050
- name: Install mkl_random dependencies
5151
run: |
52-
pip install meson-python ninja cmake cython mkl-devel
52+
pip install meson-python ninja cmake "cython>=3.1.0" mkl-devel
5353
pip install ${{ matrix.numpy_version }}
5454
5555
- name: Build mkl_random

.github/workflows/build_pip.yml

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,35 @@ permissions:
1111

1212
jobs:
1313
build:
14+
name: build (${{ matrix.python_tag || matrix.python }}${{ matrix.use_pre != '' && ', pre' || '' }})
1415
runs-on: ubuntu-latest
1516
defaults:
1617
run:
1718
shell: bash -el {0}
1819

1920
strategy:
2021
matrix:
21-
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
22+
python: ["3.10", "3.11", "3.12", "3.13"]
2223
use_pre: ["", "--pre"]
24+
include:
25+
- python: "3.14"
26+
python_tag: "3.14"
27+
python_spec: "3.14.* *_cp314"
28+
use_pre: ""
29+
- python: "3.14"
30+
python_tag: "3.14"
31+
python_spec: "3.14.* *_cp314"
32+
use_pre: "--pre"
33+
- python: "3.14"
34+
python_tag: "3.14t"
35+
python_spec: "3.14.* *_cp314t"
36+
free_threaded: "true"
37+
use_pre: ""
38+
- python: "3.14"
39+
python_tag: "3.14t"
40+
python_spec: "3.14.* *_cp314t"
41+
free_threaded: "true"
42+
use_pre: "--pre"
2343

2444
steps:
2545
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -36,11 +56,28 @@ jobs:
3656

3757
- name: Install MKL
3858
run: |
39-
conda install mkl-devel
59+
conda install mkl-devel "python=${{ matrix.python_spec || matrix.python }}"
60+
61+
- name: Verify GIL vs free-threaded ABI
62+
env:
63+
EXPECT_FREE_THREADED: ${{ matrix.free_threaded || '' }}
64+
run: |
65+
python - <<'PY'
66+
import os, sys, sysconfig
67+
gil_disabled = bool(sysconfig.get_config_var("Py_GIL_DISABLED"))
68+
expected = bool(os.environ.get("EXPECT_FREE_THREADED"))
69+
assert gil_disabled == expected, (
70+
f"ABI mismatch: Py_GIL_DISABLED={gil_disabled}, expected "
71+
f"free-threaded={expected}; the conda ABI swap did not take effect"
72+
)
73+
if expected:
74+
assert not sys._is_gil_enabled(), "GIL re-enabled on free-threaded build"
75+
print(f"OK: Py_GIL_DISABLED={gil_disabled}")
76+
PY
4077
4178
- name: Build with pip
4279
run: |
43-
pip install --no-cache-dir meson-python ninja cmake cython
80+
pip install --no-cache-dir meson-python ninja cmake "cython>=3.1.0"
4481
pip install --no-cache-dir numpy ${{ matrix.use_pre }}
4582
pip install -e . --no-build-isolation --no-deps --verbose
4683
pip install --no-cache-dir pytest

.github/workflows/conda-package-cf.yml

Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ jobs:
3131
numpy: "2.3"
3232
- python: "3.14"
3333
numpy: "2.3"
34+
python_spec: "3.14.* *_cp314"
35+
python_tag: "3.14"
36+
- python: "3.14"
37+
numpy: "2.3"
38+
python_spec: "3.14.* *_cp314t"
39+
python_tag: "3.14t"
3440

3541
steps:
3642
- name: Cancel Previous Runs
@@ -54,9 +60,9 @@ jobs:
5460
with:
5561
path: ~/.conda/pkgs
5662
key:
57-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
63+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('**/meta.yaml') }}
5864
restore-keys: |
59-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
65+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
6066
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
6167
6268
- name: Add conda to system path
@@ -68,7 +74,7 @@ jobs:
6874
- name: Build conda package
6975
run: |
7076
CHANNELS=(-c conda-forge --override-channels)
71-
VERSIONS=(--python "${{ matrix.python }}" --numpy "${{ matrix.numpy }}")
77+
VERSIONS=(--python "${{ matrix.python_spec || matrix.python }}" --numpy "${{ matrix.numpy }}")
7278
TEST=(--no-test)
7379
7480
conda build \
@@ -80,7 +86,7 @@ jobs:
8086
- name: Upload artifact
8187
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
8288
with:
83-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
89+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
8490
path: /usr/share/miniconda/conda-bld/linux-64/${{ env.PACKAGE_NAME }}-*.conda
8591

8692
build_windows:
@@ -101,6 +107,12 @@ jobs:
101107
numpy: "2.3"
102108
- python: "3.14"
103109
numpy: "2.3"
110+
python_spec: "3.14.* *_cp314"
111+
python_tag: "3.14"
112+
- python: "3.14"
113+
numpy: "2.3"
114+
python_spec: "3.14.* *_cp314t"
115+
python_tag: "3.14t"
104116

105117
env:
106118
conda-bld: C:\Miniconda\conda-bld\win-64\
@@ -130,9 +142,9 @@ jobs:
130142
with:
131143
path: /home/runner/conda_pkgs_dir
132144
key:
133-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
145+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('**/meta.yaml') }}
134146
restore-keys: |
135-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
147+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
136148
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
137149
138150
- name: Store conda paths as envs
@@ -146,12 +158,12 @@ jobs:
146158
conda list -n base
147159
148160
- name: Build conda package
149-
run: conda build --no-test --python ${{ matrix.python }} --numpy ${{ matrix.numpy }} -c conda-forge --override-channels conda-recipe-cf
161+
run: conda build --no-test --python "${{ matrix.python_spec || matrix.python }}" --numpy ${{ matrix.numpy }} -c conda-forge --override-channels conda-recipe-cf
150162

151163
- name: Upload artifact
152164
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
153165
with:
154-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
166+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
155167
path: ${{ env.CONDA_BLD }}${{ env.PACKAGE_NAME }}-*.conda
156168

157169
test_linux:
@@ -171,6 +183,12 @@ jobs:
171183
numpy: "2.3"
172184
- python: "3.14"
173185
numpy: "2.3"
186+
python_spec: "3.14.* *_cp314"
187+
python_tag: "3.14"
188+
- python: "3.14"
189+
numpy: "2.3"
190+
python_spec: "3.14.* *_cp314t"
191+
python_tag: "3.14t"
174192

175193
env:
176194
CHANNELS: -c conda-forge --override-channels
@@ -179,7 +197,7 @@ jobs:
179197
- name: Download artifact
180198
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
181199
with:
182-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
200+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
183201

184202
- name: Add conda to system path
185203
run: echo "$CONDA/bin" >> "$GITHUB_PATH"
@@ -202,7 +220,7 @@ jobs:
202220
. "$CONDA/etc/profile.d/conda.sh"
203221
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
204222
export PACKAGE_VERSION
205-
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" "python=${{ matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels --only-deps --dry-run > lockfile
223+
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" "python=${{ matrix.python_spec || matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels --only-deps --dry-run > lockfile
206224
cat lockfile
207225
208226
- name: Set pkgs_dirs
@@ -216,17 +234,17 @@ jobs:
216234
with:
217235
path: ~/.conda/pkgs
218236
key:
219-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
237+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('lockfile') }}
220238
restore-keys: |
221-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
239+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
222240
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
223241
224242
- name: Install mkl_random
225243
run: |
226244
. "$CONDA/etc/profile.d/conda.sh"
227245
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
228246
export PACKAGE_VERSION
229-
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" pytest "python=${{ matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels
247+
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" pytest "python=${{ matrix.python_spec || matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels
230248
# Test installed packages
231249
conda list
232250
@@ -255,6 +273,12 @@ jobs:
255273
numpy: "2.3"
256274
- python: "3.14"
257275
numpy: "2.3"
276+
python_spec: "3.14.* *_cp314"
277+
python_tag: "3.14"
278+
- python: "3.14"
279+
numpy: "2.3"
280+
python_spec: "3.14.* *_cp314t"
281+
python_tag: "3.14t"
258282

259283
env:
260284
CHANNELS: -c conda-forge --override-channels
@@ -263,14 +287,13 @@ jobs:
263287
- name: Download artifact
264288
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
265289
with:
266-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
290+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
267291

268292
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
269293
with:
270294
miniforge-version: latest
271295
channels: conda-forge
272-
activate-environment: ${{ env.TEST_ENV_NAME }}
273-
python-version: ${{ matrix.python }}
296+
activate-environment: base
274297

275298
- name: Install conda-index
276299
run: |
@@ -295,7 +318,7 @@ jobs:
295318
FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "%SCRIPT%"`) DO (
296319
SET PACKAGE_VERSION=%%F
297320
)
298-
conda install -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% python=${{ matrix.python }} numpy=${{ matrix.numpy }} -c ${{ env.GITHUB_WORKSPACE }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile
321+
conda create -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% "python=${{ matrix.python_spec || matrix.python }}" numpy=${{ matrix.numpy }} -c ${{ env.GITHUB_WORKSPACE }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile
299322
300323
- name: Cache conda packages
301324
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
@@ -304,9 +327,9 @@ jobs:
304327
with:
305328
path: /home/runner/conda_pkgs_dir
306329
key:
307-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
330+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('lockfile') }}
308331
restore-keys: |
309-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
332+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
310333
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
311334
312335
- name: Install mkl_random
@@ -318,7 +341,7 @@ jobs:
318341
FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "%SCRIPT%"`) DO (
319342
SET PACKAGE_VERSION=%%F
320343
)
321-
conda create -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% pytest python=${{ matrix.python }} numpy=${{ matrix.numpy }} -c ${{ env.GITHUB_WORKSPACE }}/channel ${{ env.CHANNELS }}
344+
conda create -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% pytest "python=${{ matrix.python_spec || matrix.python }}" numpy=${{ matrix.numpy }} -c ${{ env.GITHUB_WORKSPACE }}/channel ${{ env.CHANNELS }}
322345
# Test installed packages
323346
conda list
324347
@@ -342,6 +365,12 @@ jobs:
342365
numpy: "2.3"
343366
- python: "3.14"
344367
numpy: "2.3"
368+
python_spec: "3.14.* *_cp314"
369+
python_tag: "3.14"
370+
- python: "3.14"
371+
numpy: "2.3"
372+
python_spec: "3.14.* *_cp314t"
373+
python_tag: "3.14t"
345374

346375
steps:
347376
- name: Cancel Previous Runs
@@ -368,9 +397,9 @@ jobs:
368397
with:
369398
path: /Users/runner/conda_pkgs_dir
370399
key:
371-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
400+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('**/meta.yaml') }}
372401
restore-keys: |
373-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
402+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
374403
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
375404
376405
- name: Install conda-build
@@ -388,7 +417,7 @@ jobs:
388417
shell: bash -el {0}
389418
run: |
390419
CHANNELS=(-c conda-forge --override-channels)
391-
VERSIONS=(--python "${{ matrix.python }}" --numpy "${{ matrix.numpy }}")
420+
VERSIONS=(--python "${{ matrix.python_spec || matrix.python }}" --numpy "${{ matrix.numpy }}")
392421
TEST=(--no-test)
393422
394423
conda build \
@@ -400,7 +429,7 @@ jobs:
400429
- name: Upload artifact
401430
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
402431
with:
403-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
432+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
404433
path: ${{ env.CONDA_BLD }}${{ env.PACKAGE_NAME }}-*.conda
405434

406435
test_osx:
@@ -419,12 +448,18 @@ jobs:
419448
numpy: "2.3"
420449
- python: "3.14"
421450
numpy: "2.3"
451+
python_spec: "3.14.* *_cp314"
452+
python_tag: "3.14"
453+
- python: "3.14"
454+
numpy: "2.3"
455+
python_spec: "3.14.* *_cp314t"
456+
python_tag: "3.14t"
422457

423458
steps:
424459
- name: Download artifact
425460
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
426461
with:
427-
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
462+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python_tag || matrix.python }}
428463

429464
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
430465
with:
@@ -452,7 +487,7 @@ jobs:
452487
run: |
453488
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
454489
export PACKAGE_VERSION
455-
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" "python=${{ matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels --only-deps --dry-run > lockfile
490+
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" "python=${{ matrix.python_spec || matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels --only-deps --dry-run > lockfile
456491
cat lockfile
457492
458493
- name: Cache conda packages
@@ -462,17 +497,17 @@ jobs:
462497
with:
463498
path: /Users/runner/conda_pkgs_dir
464499
key:
465-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
500+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-${{hashFiles('lockfile') }}
466501
restore-keys: |
467-
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
502+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python_tag || matrix.python }}-
468503
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
469504
470505
- name: Install mkl_random
471506
shell: bash -el {0}
472507
run: |
473508
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
474509
export PACKAGE_VERSION
475-
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" pytest "python=${{ matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels
510+
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" pytest "python=${{ matrix.python_spec || matrix.python }}" "numpy=${{ matrix.numpy }}" -c "$GITHUB_WORKSPACE/channel" -c conda-forge --override-channels
476511
# Test installed packages
477512
conda list -n "${{ env.TEST_ENV_NAME }}"
478513

0 commit comments

Comments
 (0)