Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
196 commits
Select commit Hold shift + click to select a range
16053b4
Add native-source DSL kernels and portable conformance tests
FrancescAlted Oct 6, 2026
4321149
Expand typed portable DSL conformance coverage
FrancescAlted Oct 6, 2026
a5a128d
Expose native portable DSL validation
FrancescAlted Oct 6, 2026
f2380d6
Record native portable artifact milestone
FrancescAlted Oct 6, 2026
6967517
Add portable DSL artifact export and native import
FrancescAlted Oct 6, 2026
eec381a
Extend portable numeric conformance and track JIT gaps
FrancescAlted Oct 6, 2026
281ebe5
Verify typed portable division and interpreter fallback
FrancescAlted Oct 6, 2026
1b9c478
Test portable nested conversion buffer safety
FrancescAlted Oct 6, 2026
5ca5bd3
Verify portable cast argument value semantics
FrancescAlted Oct 6, 2026
fca1ad3
Certify portable float32 leaf math and branch rounding
FrancescAlted Oct 6, 2026
e574d7f
Verify portable floating literal and arithmetic rounding
FrancescAlted Oct 6, 2026
f7af684
Verify portable loop-cap policies and error handling
FrancescAlted Oct 6, 2026
b27849a
Verify masked local and chained-loop lane semantics
FrancescAlted Oct 6, 2026
3015a93
Verify portable float-cast arithmetic rounding
FrancescAlted Oct 6, 2026
9aa3d54
Verify Boolean operands in portable floating arithmetic
FrancescAlted Oct 6, 2026
2953ec8
Verify numeric-then-truth portable Boolean arithmetic
FrancescAlted Oct 6, 2026
d2c2534
Integrate the frozen portable DSL 0.1 profile and native loader
FrancescAlted Oct 6, 2026
ac77561
Fix JIT reduction safety and streamline portable test coverage
FrancescAlted Oct 6, 2026
177f1e0
Remove implicit local miniexpr checkout dependencies from tests
FrancescAlted Oct 6, 2026
cac4522
Exercise portable artifacts without threads on WASM
FrancescAlted Oct 6, 2026
2495345
Certify Windows portable semantics through native fallback
FrancescAlted Oct 6, 2026
302a73c
Preserve exact WASM integer casts and align reduction path checks
FrancescAlted Oct 6, 2026
23a2a91
Pin the native WASM cast certification update
FrancescAlted Oct 6, 2026
c6ede83
Add portable DSL 1.0 authoring and persistence
FrancescAlted Oct 7, 2026
1f68b43
Prepare Menudet 1.0 draft release certification
FrancescAlted Oct 7, 2026
e0e0f3b
Allow pre-release wheel matrix certification
FrancescAlted Oct 7, 2026
df9b5a3
Allow safe GIL fallback during free-threaded wheel tests
FrancescAlted Oct 7, 2026
e768bc5
Apply the scoped GIL warning regex through pytest configuration
FrancescAlted Oct 7, 2026
fd67272
Record green Menudet release certification
FrancescAlted Oct 7, 2026
62135e1
Unify Menudet table kernels and restore LazyExpr persistence
FrancescAlted Oct 8, 2026
5b582df
Add experimental safe LazyExpr graph execution
FrancescAlted Oct 8, 2026
0c92a0d
Profile safe LazyExpr execution against historical control
FrancescAlted Oct 8, 2026
2158e7e
Refresh safe LazyExpr metadata after mutation
FrancescAlted Oct 8, 2026
a03b66c
Validate reduction contracts and preserve typed graph literals
FrancescAlted Oct 8, 2026
6dac94c
Bind backend reduction signatures and infer root metadata
FrancescAlted Oct 8, 2026
eeaf4a4
Validate cumulative operation signatures and metadata
FrancescAlted Oct 8, 2026
99a037b
Propagate nested shapes and synchronize admitted wrappers
FrancescAlted Oct 8, 2026
f2115d9
Infer nested unary dtypes and validate proxy cache provenance
FrancescAlted Oct 8, 2026
325eae1
Resolve NumPy binary and cast metadata and audit column dependencies
FrancescAlted Oct 8, 2026
aa2f337
Preserve field references and validate Parquet operand lifetime
FrancescAlted Oct 8, 2026
b96cc2b
Validate remote graph dependencies and refresh constructor values
FrancescAlted Oct 8, 2026
dd47351
Record safe LazyExpr experiment verdict and remaining gates
FrancescAlted Oct 8, 2026
e84afd7
Release graph evaluation cycles and validate computed-column cache co…
FrancescAlted Oct 8, 2026
a144fc6
Validate portable kernel closures and domain contracts in safe graphs
FrancescAlted Oct 8, 2026
4c83654
Update safe LazyExpr findings after memory and native-operand audits
FrancescAlted Oct 8, 2026
e0c3635
Expand safe graph compatibility and verify container and thread lifet…
FrancescAlted Oct 8, 2026
85c6a07
Record compatibility, container and platform verification boundaries
FrancescAlted Oct 8, 2026
232d747
Verify safe graph follow-ups on NumPy 1.26 and WASM
FrancescAlted Oct 9, 2026
d62b4b9
Record unavailable adapters in safe graph evidence
FrancescAlted Oct 9, 2026
5f3ad6b
Preserve bounded evidence when whole-project tests fail
FrancescAlted Oct 9, 2026
61714ca
Respect NumPy runtime capabilities in compatibility tests
FrancescAlted Oct 9, 2026
f98a8d1
Fix platform fallback metadata and compatibility boundaries
FrancescAlted Oct 9, 2026
a8449ae
Document table threading requirements and add concurrency probes
FrancescAlted Oct 9, 2026
78ae44f
Preserve Blosc2 index dtype in WASM graph verification
FrancescAlted Oct 9, 2026
063fd8b
Record verified NumPy 1.26 and WASM graph evidence
FrancescAlted Oct 9, 2026
cf6f25c
Add Menudet NumPy checkpoint tooling and integration evidence
FrancescAlted Oct 9, 2026
3c19267
Add native Menudet graphs and portable JIT qualification
FrancescAlted Oct 9, 2026
b3c64cd
Qualify inline floating comparisons and record benchmarks
FrancescAlted Oct 9, 2026
6c863eb
Qualify expanded Menudet JIT lowering and faster compiler tests
FrancescAlted Oct 9, 2026
65a25b8
Qualify explicit Menudet pairs across CI runtimes
FrancescAlted Oct 9, 2026
36023f5
Fix Windows corpus transport and CI test dependencies
FrancescAlted Oct 9, 2026
cf9cf35
Normalize inverse-function names and review Menudet release scope
FrancescAlted Oct 9, 2026
e44c004
Select the TCC header fix and record remaining CI gates
FrancescAlted Oct 9, 2026
6f8a45f
Qualify the complete relocated TCC runtime
FrancescAlted Oct 9, 2026
442bf8a
Record green native and paired Menudet qualification
FrancescAlted Oct 9, 2026
225c359
Use native graph preparation for native-required expressions
FrancescAlted Oct 9, 2026
d5a55d5
Expose native graph stages and qualify paired distributions
FrancescAlted Oct 9, 2026
a2a733d
Respect optional runtime and dtype capabilities in qualification tests
FrancescAlted Oct 9, 2026
40434a6
Resolve Windows compiler cache launcher to an absolute path
FrancescAlted Oct 9, 2026
56210c1
Test quiet NaN floor division status across JIT backends
FrancescAlted Oct 9, 2026
fbe68cf
Test native graph and DSL reduction fast paths
FrancescAlted Oct 10, 2026
77d8ad5
Test simple scalar DSL execution and fallbacks
FrancescAlted Oct 10, 2026
3a42fc3
Test weak capture JIT specialization and range fallbacks
FrancescAlted Oct 10, 2026
7f46e7a
Use explicit block reductions in portable DSLs
FrancescAlted Oct 10, 2026
b1b5b04
Test portable JIT comparisons loops and Mandelbrot parity
FrancescAlted Oct 10, 2026
44160d0
Test portable JIT checked casts and numeric builtin boundaries
FrancescAlted Oct 10, 2026
ff7fc44
Use Menudet 1.0 consistently across Python APIs and docs
FrancescAlted Oct 10, 2026
d60ac04
Test computed weak JIT conversions and lazy expression participation
FrancescAlted Oct 10, 2026
5bc74f4
Qualify exact portable JIT pairs and isolate dummy inference diagnostics
FrancescAlted Oct 10, 2026
781a77f
Document portable JIT coverage and qualify floating reduction fusion
FrancescAlted Oct 10, 2026
5dd7c7d
Select the exact experimental native revision in branch qualification
FrancescAlted Oct 10, 2026
9bd5e8f
Qualify the experimental WASM pair without requiring Python threads
FrancescAlted Oct 10, 2026
81f924b
Align qualification tests with portable reduction and NumPy version c…
FrancescAlted Oct 10, 2026
1b36dad
Set safe GitHub CI polling defaults
FrancescAlted Oct 10, 2026
5ba0364
Respect WASM floating status threads and portable reduction widths
FrancescAlted Oct 10, 2026
9cd98e6
Document fixed portable integer reduction accumulator widths
FrancescAlted Oct 10, 2026
57dbab2
Fix WASM qualification tests and add expanded JIT benchmarks
FrancescAlted Oct 10, 2026
e591cfe
Qualify optimized portable JIT casts
FrancescAlted Oct 10, 2026
4e59678
Qualify scalar reduction recipes and document fast native iteration
FrancescAlted Oct 12, 2026
8d3fba9
Qualify numeric extrema and truth JIT reductions
FrancescAlted Oct 12, 2026
6d2c0cb
Qualify multiple reduction scalar flow and range lowering
FrancescAlted Oct 12, 2026
4d2d129
Keep Python JIT qualification focused on native integration
FrancescAlted Oct 12, 2026
a7a00d5
Qualify Python against the corrected sanitizer workflow revision
FrancescAlted Oct 12, 2026
2fa8edc
Keep elementwise equality enabled during concurrent expression fusion
FrancescAlted Oct 12, 2026
10ed21b
Honor disabled JIT requirements in paired Windows qualification
FrancescAlted Oct 12, 2026
8801134
Skip the thread concurrency regression on Pyodide
FrancescAlted Oct 12, 2026
5fdb24e
Qualify integer mean, scalar loops and array-local JIT recipes
FrancescAlted Oct 12, 2026
a2c1614
Integrate Menudet 1.0 authoring with JIT qualification
FrancescAlted Oct 12, 2026
fac522b
Certify Menudet remainder with floor-division references
FrancescAlted Oct 12, 2026
0ab3514
Align paired conformance expectations with Menudet 1.0 arithmetic
FrancescAlted Oct 12, 2026
f0c4dae
Preserve published parent qualification records during integration
FrancescAlted Oct 12, 2026
36d9ce5
Prefer native JIT for eligible lazy expressions
FrancescAlted Oct 12, 2026
5eab025
Add annotated and inferred Menudet decorators
FrancescAlted Oct 12, 2026
a795e26
Add bounded storage readers and portable Menudet prefilter dispatch
FrancescAlted Oct 12, 2026
364be2e
Add parallel resident Menudet execution and profiling benchmarks
FrancescAlted Oct 12, 2026
3197936
Use parallel resident scheduling for eligible LazyExpr JIT graphs
FrancescAlted Oct 12, 2026
ec856f0
Consolidate Menudet engine benchmarks
FrancescAlted Oct 13, 2026
dec3f18
Add scalar reductions to engine benchmarks and update miniexpr
FrancescAlted Oct 13, 2026
fd7c251
Align CI native revision and qualify threadless execution
FrancescAlted Oct 13, 2026
82fa57d
Qualify bounded-reader fallback on threadless runtimes
FrancescAlted Oct 13, 2026
3754ce7
Enable and optimize automatic native graph reductions
FrancescAlted Oct 13, 2026
c421d22
Stream compressed inputs through native graph reductions
FrancescAlted Oct 13, 2026
f3bff62
Parallelize native graph min and max reductions
FrancescAlted Oct 13, 2026
bbe78c8
Parallelize native graph any and all reductions
FrancescAlted Oct 13, 2026
5a7f6f1
Acquire the GIL in postfilters and gate parallel graph tests
FrancescAlted Oct 13, 2026
a52b658
Assert portable accumulator dtypes on WASM32
FrancescAlted Oct 13, 2026
008a941
Keep Windows shared cache locks waiting under contention
FrancescAlted Oct 13, 2026
01a19e4
Align cache lock assertions with explicit Windows retries
FrancescAlted Oct 13, 2026
b6bd97e
Update miniexpr pin for optimized graph reductions
FrancescAlted Oct 13, 2026
733d7af
Benchmark evaluate and write prefilter results into NumPy output
FrancescAlted Oct 13, 2026
4c082bd
Stream parallel compressed maps directly into NumPy output
FrancescAlted Oct 13, 2026
ac688eb
Use native expression ingestion for eligible graphs
FrancescAlted Oct 14, 2026
ed2546d
Cache operand-free evaluate preparation recipes
FrancescAlted Oct 14, 2026
43458b0
Lower the compressed map crossover and balance block regions
FrancescAlted Oct 14, 2026
d8c4b26
Update miniexpr pin for vectorized runtime literals
FrancescAlted Oct 14, 2026
2148b2d
Update miniexpr pin for portable NaN parity checks
FrancescAlted Oct 14, 2026
cb68c85
Qualify Python CI against optimized miniexpr revision
FrancescAlted Oct 14, 2026
eae6b22
Skip concurrent recipe cache tests on threadless WASM
FrancescAlted Oct 14, 2026
8b8507f
Compare computed reduction NaNs by class
FrancescAlted Oct 14, 2026
1077232
Optimize native Menudet output and worker reuse
FrancescAlted Oct 14, 2026
8368a4a
Dispatch LazyExpr execution by output storage
FrancescAlted Oct 14, 2026
6d89b7b
Streamline tests and add benchmark JIT selection
FrancescAlted Oct 14, 2026
7163690
Record historical Menudet CI qualification results
FrancescAlted Oct 14, 2026
d5bec51
Preserve inherited JIT policy in native dispatch
FrancescAlted Oct 14, 2026
35bca07
Gate prefilter tests on host runtime capabilities
FrancescAlted Oct 14, 2026
5950780
Sample compatibility test matrices orthogonally
FrancescAlted Oct 15, 2026
91ec3c9
Reduce redundant test cases and isolate test server diagnostics
FrancescAlted Oct 15, 2026
2a97423
Update to latest C-Blosc2 sources
FrancescAlted Oct 15, 2026
6d1b909
Sample shared test fixtures and remove duplicate cases
FrancescAlted Oct 15, 2026
e9e1146
Accelerate resident Menudet integer kernels
FrancescAlted Oct 16, 2026
0b765da
Pin resolved Menudet libm callbacks and test artifact roundtrip
FrancescAlted Oct 16, 2026
e2e50cd
Accelerate Menudet array execution and pin native optimizations
FrancescAlted Oct 16, 2026
7065765
Isolate evaluate route tests from global thread settings
FrancescAlted Oct 16, 2026
8bf4b7d
Pin native CI dispatch qualification fixes
FrancescAlted Oct 16, 2026
5d96dfd
Align CI native revision and gate host-only route tests
FrancescAlted Oct 16, 2026
0fe7a42
Keep wide integer maps parallel within the scratch budget
FrancescAlted Oct 16, 2026
e168cf9
Share prefilter evaluation across NumPy and Blosc2 outputs
FrancescAlted Oct 16, 2026
ed8bf4f
Fuse resident evaluation with stored output and control allocation be…
FrancescAlted Oct 16, 2026
a16ad00
Improve NumPy-output evaluation compatibility and performance
FrancescAlted Oct 17, 2026
1a5a367
Handle NumPy output layout independently of NumExpr
FrancescAlted Oct 17, 2026
1635396
Add reusable evaluators and complete evaluation API contracts
FrancescAlted Oct 17, 2026
69930b9
Integrate native strided outputs and host graph scheduling
FrancescAlted Oct 17, 2026
b64cff0
Remove NumExpr runtime dependency and use native or NumPy execution
FrancescAlted Oct 17, 2026
06863bf
Handle shared memoryview owners in explicit evaluation outputs
FrancescAlted Oct 17, 2026
0ca4a87
Document native execution results and NumExpr removal tradeoffs
FrancescAlted Oct 17, 2026
9092378
Use JIT lowering for eligible chunks and qualify contiguous kernels
FrancescAlted Oct 17, 2026
e7971db
Improve small math execution and qualify no-JIT vector interpretation
FrancescAlted Oct 17, 2026
237f0ee
Expose flexible math policies in portable artifacts
FrancescAlted Oct 18, 2026
e20d1ce
Pin miniexpr batch parity fix
FrancescAlted Oct 18, 2026
8462c51
Harden NumPy 1 compatibility test guards
FrancescAlted Oct 18, 2026
1125208
Pin miniexpr parity test fix
FrancescAlted Oct 18, 2026
2b8ba1a
Skip host-only native JIT tests when unavailable
FrancescAlted Oct 18, 2026
1ff937e
Record wasm32 Menudet JIT qualification
FrancescAlted Oct 18, 2026
493a86c
Pin qualified wasm32 Menudet JIT
FrancescAlted Oct 18, 2026
7979d8b
Pin portable wasm test fix
FrancescAlted Oct 18, 2026
142e590
Pin wasm kernel cache lifetime fix
FrancescAlted Oct 18, 2026
053700f
Pin wasm narrow integer fix
FrancescAlted Oct 19, 2026
36b8212
Test portable TCC arithmetic integration
FrancescAlted Oct 19, 2026
e177086
Share portable JIT maps across expressions
FrancescAlted Oct 19, 2026
a1937ce
Pin miniexpr arithmetic bridge update
FrancescAlted Oct 19, 2026
331d170
Use full miniexpr commit pin
FrancescAlted Oct 19, 2026
500c5e4
Pin wasm-compatible miniexpr bridge
FrancescAlted Oct 19, 2026
c070f87
Correct full miniexpr revision pin
FrancescAlted Oct 19, 2026
3036375
Use logical negation for nullable predicates
FrancescAlted Oct 19, 2026
21d14a7
Handle inversion of plain boolean columns logically
FrancescAlted Oct 19, 2026
2f3fcc6
Skip unsupported portable JIT checks on Pyodide
FrancescAlted Oct 19, 2026
2b1fc99
Add native Menudet generator prefilters and migrate eye
FrancescAlted Oct 20, 2026
608f9b6
Route small ramps and supported DSL UDFs through Menudet
FrancescAlted Oct 20, 2026
aade6d2
Expand Menudet UDF execution and document complex support plan
FrancescAlted Oct 21, 2026
e604d9d
Enable complex Menudet execution and WASM dispatch
FrancescAlted Oct 21, 2026
b3f8a19
Fix WASM complex paths and quiet NumPy alias lookup
FrancescAlted Oct 21, 2026
3fa4b45
Guard platform-specific Menudet CI paths
FrancescAlted Oct 21, 2026
a66ecfe
Fix complex WASM dispatch and infinity multiplication parity
FrancescAlted Oct 21, 2026
51d0f87
Enable portable complex expressions and Menudet ramp constructors
FrancescAlted Oct 22, 2026
77e2144
Respect the WASM scalar reduction fallback in dispatch coverage
FrancescAlted Oct 22, 2026
e312cac
Default evaluate to interpretation and qualify NumExpr independence
FrancescAlted Oct 22, 2026
8101ed8
Preserve editable package paths in isolated import probes
FrancescAlted Oct 22, 2026
0cb6428
Select Menudet execution automatically from native program structure
FrancescAlted Oct 22, 2026
a34218a
Reduce cold preparation overhead for NumPy expressions
FrancescAlted Oct 23, 2026
b7eacb2
Reduce Menudet preparation and update miniexpr
FrancescAlted Oct 23, 2026
0d8116a
Document complex and fmod helper functions
FrancescAlted Oct 23, 2026
0aac7e1
Share parsed syntax across expression preparation
FrancescAlted Oct 23, 2026
d93b4f9
Remove pandas dependency from unsigned Arrow dictionary imports
FrancescAlted Oct 23, 2026
8a4714a
Merge main and preserve Arrow dictionary regression coverage
FrancescAlted Oct 23, 2026
607517d
Speed up native preparation and resident expression execution
FrancescAlted Oct 23, 2026
e766272
Trim cold resident-map preparation and Menudet binding
FrancescAlted Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/menudet-native-ref
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
e77b91aca382a6123ca04f4e2dbc2430f147e2d6
93 changes: 85 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
env:
CMAKE_GENERATOR: Ninja
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ["3.12"]
Expand All @@ -33,6 +34,31 @@ jobs:
steps:
- uses: actions/checkout@v7

# Experimental tests require the explicit native pair, not the unchanged
# release dependency. Keep this source override local to numpy-compat CI.
- name: Select experimental native revision
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
id: native_ref
shell: bash
run: echo "sha=$(cat .github/menudet-native-ref)" >> "$GITHUB_OUTPUT"

- uses: actions/checkout@v7
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
with:
repository: Blosc/miniexpr
ref: ${{ steps.native_ref.outputs.sha }}
path: ci-native

- name: Override experimental native source
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
shell: bash
run: |
source_path="$PWD/ci-native"
if [ "$RUNNER_OS" = Windows ]; then
source_path=$(cygpath -m "$source_path")
fi
echo "CMAKE_ARGS=-DFETCHCONTENT_SOURCE_DIR_MINIEXPR=$source_path" >> "$GITHUB_ENV"

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
Expand Down Expand Up @@ -67,17 +93,18 @@ jobs:
if: runner.os == 'Windows'
run: echo "C:\\Program Files\\LLVM\\bin" >> $env:GITHUB_PATH

- name: Install specific numpy version
if: matrix.numpy-version
run: pip install "numpy==${{ matrix.numpy-version }}.*"
- name: Resolve compiler cache launcher (Windows)
if: runner.os == 'Windows'
run: |
$launcher = (Get-Command sccache -CommandType Application -ErrorAction Stop).Source.Replace('\', '/')
"CMAKE_C_COMPILER_LAUNCHER=$launcher" >> $env:GITHUB_ENV
"CMAKE_CXX_COMPILER_LAUNCHER=$launcher" >> $env:GITHUB_ENV

- name: Build (Windows)
if: runner.os == 'Windows'
id: build_windows
run: pip install -e . --group test
env:
CMAKE_C_COMPILER_LAUNCHER: sccache
CMAKE_CXX_COMPILER_LAUNCHER: sccache
SCCACHE_DIR: C:\Users\runneradmin\AppData\Local\sccache
CC: clang-cl
CXX: clang-cl
Expand All @@ -89,9 +116,31 @@ jobs:
id: build_non_windows
run: pip install -e . --group test

- name: Install Arrow dictionary test dependency
# Pandas is already a dev dependency; Arrow's dictionary conversions now
# import it even when the test does not construct a pandas object.
run: python -m pip install pandas

# Build isolation uses NumPy 2 headers for the dual-ABI extension. Optional
# test dependencies may upgrade the runtime too, so pin it AFTER installing.
- name: Install NumPy 1.26-compatible test runtime
if: matrix.numpy-version == '1.26'
# PyArrow 26 dropped the NumPy 1 ABI without encoding it in Requires-Dist.
# Keep this host-compatibility job on a known dual-ABI Arrow release.
run: pip install "numpy==1.26.*" "zarr>=3.1.5,<3.2" "pyarrow==21.0.0" pandas

- name: Verify requested NumPy runtime
if: matrix.numpy-version
run: python -c "import numpy as np; assert np.__version__.startswith('${{ matrix.numpy-version }}.'), np.__version__"

- name: Require a NumExpr-free runtime
run: |
python -m pip uninstall -y numexpr
python -c "import importlib.util, importlib.metadata; assert importlib.util.find_spec('numexpr') is None; assert not any(r.lower().startswith('numexpr') for r in importlib.metadata.requires('blosc2') or [])"

- name: Test (Windows)
if: runner.os == 'Windows'
run: python -m pytest -m "not heavy and not network and not tui" --durations=25
run: python scripts/qualify_without_numexpr.py --require-absent -- -m "not heavy and not network and not tui" --durations=25
env:
# A test over this many seconds is a deadlock, not a slow test (the
# slowest is ~7 s): dump stacks and kill the worker so xdist names it
Expand All @@ -101,16 +150,44 @@ jobs:
PYTEST_DEADMAN_SECONDS: "300"
PYTEST_DEADMAN_SESSION_SECONDS: "1500"
# BLOSC_NTHREADS: "1"
# NUMEXPR_NUM_THREADS: "1"
# OMP_NUM_THREADS: "1"

- name: Test (non-Windows)
if: runner.os != 'Windows'
run: python -m pytest -m "not heavy and not network and not tui" --durations=25
run: python scripts/qualify_without_numexpr.py --require-absent -- -m "not heavy and not network and not tui" --durations=25
env:
PYTEST_DEADMAN_SECONDS: "300"
PYTEST_DEADMAN_SESSION_SECONDS: "1500"

- name: Verify independence with optional NumExpr installed
if: runner.os == 'Linux' && matrix.python-version == '3.12' && !matrix.numpy-version
run: |
python -m pip install numexpr
python -m pytest tests/test_no_numexpr.py -q -n 0

- name: Verify experimental safe-graph corpus
if: always() && (steps.build_windows.outcome == 'success' || steps.build_non_windows.outcome == 'success')
run: python scripts/verify_safe_lazyexpr.py --report safe-lazyexpr.json

- name: Upload safe-graph platform evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: safe-lazyexpr-${{ matrix.os }}-py${{ matrix.python-version }}-np${{ matrix.numpy-version || 'default' }}
path: safe-lazyexpr.json
if-no-files-found: ignore

- name: Certify bounded Menudet math against independent references
run: python scripts/certify_menudet_math.py --report menudet-math.json

- name: Upload Menudet math certification
if: always()
uses: actions/upload-artifact@v4
with:
name: menudet-math-${{ matrix.os }}-py${{ matrix.python-version }}-np${{ matrix.numpy-version || 'default' }}
path: menudet-math.json
if-no-files-found: ignore

# TUIs are timing-sensitive and only boot a headless terminal: one OS is
# enough, and a flake here is feedback, not a release blocker.
- name: Test TUI (non-blocking)
Expand Down
26 changes: 25 additions & 1 deletion .github/workflows/cibuildwheels.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Python wheels

on:
# Certify development revisions without creating a release tag or publishing.
workflow_dispatch:
# Trigger the workflow only for tags and PRs to the main branch
push:
tags:
Expand All @@ -11,6 +13,22 @@ on:

env:
CIBW_BUILD_VERBOSITY: 1
# Every tested wheel checks portable descriptors/persistence and independent
# numeric references, not only whether the extension can be imported.
# Free-threaded CPython safely enables the GIL for this extension. Allow only
# that expected import warning; never force PYTHON_GIL=0 or claim no-GIL safety.
CIBW_TEST_COMMAND: >-
python -m pytest
{project}/tests/test_portable_artifact.py
{project}/tests/test_portable_descriptor.py
{project}/tests/test_portable_descriptor_host.py
{project}/tests/test_portable_lazy.py
{project}/tests/test_portable_jit_integration.py
{project}/tests/test_portable_policy.py
{project}/tests/test_portable_table_export.py
{project}/tests/test_dsl_portable.py -q -n 0 &&
python {project}/scripts/certify_menudet_math.py &&
python {project}/scripts/verify_safe_lazyexpr.py
# Skip testing on aarch64 for now, as it is emulated on GitHub Actions and takes too long
# Now that github provides native arm64 runners, we can enable tests again
# CIBW_TEST_SKIP: "*linux*aarch64*"
Expand Down Expand Up @@ -156,7 +174,10 @@ jobs:
CIBW_BUILD: ${{ matrix.cibw_build }}
# WASM/Pyodide has no SIMD/runtime CPU detection; disable optimised paths
CMAKE_ARGS: "-DWITH_ZLIB_OPTIM=OFF -DWITH_OPTIM=OFF -DWITH_RUNTIME_CPU_DETECTION=OFF"
CIBW_TEST_COMMAND: "pytest {project}/tests"
CIBW_TEST_COMMAND: >-
pytest {project}/tests &&
python {project}/scripts/certify_menudet_math.py &&
python {project}/scripts/verify_safe_lazyexpr.py
# Pin the Pyodide version explicitly per target for reproducible builds.
# Note: in-memory SChunk get_slice is broken on the Pyodide 0.29.x
# Emscripten toolchain (works on 314); see gh-664. The affected test is
Expand Down Expand Up @@ -282,6 +303,9 @@ jobs:
python -m pytest tests/test_open.py tests/test_vlmeta.py \
tests/ndarray/test_evaluate.py -q -p no:cacheprovider

- name: Certify Menudet on the installed abi3 wheel
run: python scripts/certify_menudet_math.py


upload_pypi:
needs: [ build_wheels, build_wheels_wasm, test_abi3_matrix ]
Expand Down
116 changes: 116 additions & 0 deletions .github/workflows/menudet-paired.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Menudet paired qualification

# Keep release dependency pins unchanged. Qualification explicitly selects the
# experimental native revision and fails rather than hiding missing capabilities.
on:
push:
branches: [numpy-compat]
workflow_dispatch:
inputs:
native_ref:
description: Fully qualified exact Blosc/miniexpr SHA to integrate with this Python revision
required: true
type: string

concurrency:
group: menudet-pair-${{ github.ref }}-${{ inputs.native_ref }}
cancel-in-progress: true

jobs:
paired:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash -el {0}
env:
MENUDET_REQUIRE_ARRAY_RUNTIME: '1'
MENUDET_REQUIRE_GRAPH_RUNTIME: '1'
CMAKE_GENERATOR: Ninja
steps:
- uses: actions/checkout@v7
- uses: conda-incubator/setup-miniconda@v3
with:
activate-environment: blosc2
python-version: '3.12'
auto-activate-base: false
- name: Require exact full native qualification
id: qualified_native
env:
GH_TOKEN: ${{ github.token }}
REQUESTED_NATIVE: ${{ inputs.native_ref }}
run: |
native_sha="$REQUESTED_NATIVE"
if [ -z "$native_sha" ]; then native_sha=$(cat .github/menudet-native-ref); fi
python scripts/verify_native_qualification.py "$native_sha"
echo "sha=$native_sha" >> "$GITHUB_OUTPUT"
- uses: actions/checkout@v7
with:
repository: Blosc/miniexpr
ref: ${{ steps.qualified_native.outputs.sha }}
path: native
- uses: ilammy/msvc-dev-cmd@v1
if: runner.os == 'Windows'
- name: Select Windows compiler
if: runner.os == 'Windows'
run: |
echo 'CC=clang-cl' >> "$GITHUB_ENV"
echo 'CXX=clang-cl' >> "$GITHUB_ENV"
- name: Build explicit native and Python pair
run: |
python -m pip install ninja cmake
# Match Python's static linkage; Windows Ninja cannot emit both the
# shared import library and static library as miniexpr.lib.
cmake -S native -B native-build -DMINIEXPR_BUILD_ARTIFACT=ON -DMINIEXPR_BUILD_SHARED=OFF -DCMAKE_BUILD_TYPE=Release
# Python's corpus adapter needs this runner, not the native test matrix.
cmake --build native-build --target numpy_compat_runner --parallel 4
native_source="$PWD/native"
if [ "$RUNNER_OS" = Windows ]; then
native_source=$(cygpath -m "$native_source")
fi
python -m pip install -e . --group test --config-settings="cmake.define.FETCHCONTENT_SOURCE_DIR_MINIEXPR=$native_source"
python -m pip install 'numpy==2.5.3'
- name: Require corpus and native array capabilities
run: |
export MENUDET_NUMPY_FUNCTION_CORPUS="$PWD/native/tests/numpy-compat/functions-v1.0.json"
export MENUDET_NUMPY_ARITHMETIC_CORPUS="$PWD/native/tests/numpy-compat/arithmetic-v1.0.json"
export MENUDET_NUMPY_CORPUS="$PWD/native/tests/numpy-compat/vectors.json"
export MENUDET_NUMPY_CORPUS_V2="$PWD/native/tests/numpy-compat/vectors-v2.json"
export MENUDET_NUMPY_RUNNER="$PWD/native-build/tests/numpy_compat_runner"
if [ "$RUNNER_OS" = Windows ]; then
export MENUDET_NUMPY_RUNNER="${MENUDET_NUMPY_RUNNER}.exe"
export PATH="$PWD/native-build:$PATH"
fi
python -c 'import blosc2; assert blosc2.NativeGraph.from_expression("x - sum(x)", {"x": "float32"}).info()["stages"] == 2'
python -m pytest tests/test_menudet_arrays.py tests/test_menudet_native_graph.py tests/test_native_graph_preparation.py tests/test_native_graph_stages.py tests/test_menudet_functions.py tests/test_menudet_arithmetic.py tests/test_menudet_conformance.py tests/test_dsl_portable.py tests/test_portable_artifact.py tests/test_portable_lazy.py tests/test_portable_table_export.py tests/test_portable_policy.py tests/test_portable_descriptor.py tests/test_native_graph_weak_captures.py tests/test_dsl_scalar_dispatch.py -q -n 0
- name: Build exact-pair distribution wheel
env:
ME_DSL_JIT_COMPILER: tcc
MENUDET_REQUIRE_JIT: ${{ runner.os != 'Windows' && '1' || '0' }}
run: |
native_source="$PWD/native"
if [ "$RUNNER_OS" = Windows ]; then
native_source=$(cygpath -m "$native_source")
fi
python -m pip wheel . --no-deps --wheel-dir graph-wheels --config-settings="cmake.define.FETCHCONTENT_SOURCE_DIR_MINIEXPR=$native_source"
python -m pip install --force-reinstall --no-deps graph-wheels/*.whl
python -m pytest tests/test_portable_jit_integration.py tests/test_menudet_jit.py -q -n 0
- name: Record exact paired revisions
if: always()
run: |
git rev-parse HEAD > paired-revisions.txt
git -C native rev-parse HEAD >> paired-revisions.txt
python --version >> paired-revisions.txt
python -m pip freeze >> paired-revisions.txt
cmake --version >> paired-revisions.txt
- uses: actions/upload-artifact@v4
if: always()
with:
name: menudet-pair-${{ matrix.os }}
path: |
paired-revisions.txt
native-qualification.json
graph-wheels/*.whl
49 changes: 47 additions & 2 deletions .github/workflows/wasm-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,27 @@ jobs:
# WASM/Pyodide has no SIMD/runtime CPU detection; disable optimised paths
CMAKE_ARGS: "-DWITH_ZLIB_OPTIM=OFF -DWITH_OPTIM=OFF -DWITH_RUNTIME_CPU_DETECTION=OFF"
# cibuildwheel runs the suite automatically in the node/pyodide runtime
CIBW_TEST_COMMAND: "pytest {project}/tests"
CIBW_TEST_COMMAND: >-
pytest {project}/tests &&
python {project}/scripts/certify_menudet_math.py &&
python {project}/scripts/verify_safe_lazyexpr.py
steps:
- uses: actions/checkout@v7
# Qualify the experimental pair without changing the shipping native pin.
- name: Select experimental native revision
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
id: native_ref
run: echo "sha=$(cat .github/menudet-native-ref)" >> "$GITHUB_OUTPUT"
- uses: actions/checkout@v7
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
with:
repository: Blosc/miniexpr
ref: ${{ steps.native_ref.outputs.sha }}
path: ci-native
- name: Override experimental native source
if: github.ref == 'refs/heads/numpy-compat' || github.ref == 'refs/heads/portable-jit-improvements'
run: |
echo "CMAKE_ARGS=$CMAKE_ARGS -DFETCHCONTENT_SOURCE_DIR_MINIEXPR=$PWD/ci-native" >> "$GITHUB_ENV"
- uses: actions/setup-python@v7
with:
python-version: '3.x'
Expand All @@ -30,4 +48,31 @@ jobs:
- name: Install cibuildwheel
run: pip install "cibuildwheel==4.1.*"
- name: Build and test wheel
run: cibuildwheel --platform pyodide # platform=pyodide is CLI-only
run: |
set -o pipefail
cibuildwheel --platform pyodide 2>&1 | tee wasm-ci.log
- name: Extract safe-graph runtime evidence
if: always()
run: |
python - <<'PY'
import json
from pathlib import Path

log = Path("wasm-ci.log")
if log.exists():
text = log.read_text()
marker = '{\n "scope": "bounded experimental safe-graph corpus;'
start = text.rfind(marker)
if start >= 0:
report, _ = json.JSONDecoder().raw_decode(text[start:])
Path("safe-lazyexpr-wasm.json").write_text(json.dumps(report, indent=2) + "\n")
PY
- name: Upload WASM platform evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: safe-lazyexpr-wasm
path: |
safe-lazyexpr-wasm.json
wasm-ci.log
if-no-files-found: ignore
Loading
Loading