|
1 | 1 | # CI: build and test both backends on every push/PR. |
2 | 2 | # |
3 | 3 | # Two test jobs run in parallel: |
4 | | -# test-bitexact — NUMPYCPP_STD_ONLY=OFF (default) |
5 | | -# All 900 tests verify IEEE-754 bit-identical results vs numpy. |
6 | | -# Requires: numpy .so loaded (OpenBLAS + SVML dlsym), AVX-512 capable CPU. |
7 | | -# |
8 | | -# test-std — NUMPYCPP_STD_ONLY=ON |
9 | | -# Same API, pure <cmath> + C++ loops. ~423 precision-independent tests. |
10 | | -# No external math dependencies. |
| 4 | +# test-bitexact — NUMPYCPP_STD_ONLY=OFF → must be GREEN (900/900 bit-exact) |
| 5 | +# test-std — NUMPYCPP_STD_ONLY=ON → informational only (continue-on-error) |
| 6 | +# std::exp/log/pow/atan2 and C++ loops are intentionally NOT bit-exact vs numpy. |
| 7 | +# Failures here document the precision gap — they do NOT block the build or DEB. |
11 | 8 | # |
12 | 9 | # DEB packaging: single DEB (header-only — backend is consumer's compile choice) |
13 | 10 | # cmake .. → numpycpp-dev-<ver>-Linux.deb |
@@ -64,10 +61,13 @@ jobs: |
64 | 61 | cd tests |
65 | 62 | python -m pytest test_all.py -q --tb=short --no-header |
66 | 63 |
|
67 | | - # ── Job 2: std / performance-first backend ─────────────────────────────────── |
| 64 | + # ── Job 2: std / performance-first backend (informational) ─────────────────── |
68 | 65 | test-std: |
69 | 66 | name: std / Python ${{ matrix.python }} |
70 | 67 | runs-on: ubuntu-latest |
| 68 | + # std backend is intentionally NOT bit-exact vs numpy. |
| 69 | + # Failures are expected and informational — they do NOT block the DEB job. |
| 70 | + continue-on-error: true |
71 | 71 |
|
72 | 72 | strategy: |
73 | 73 | fail-fast: false |
@@ -96,27 +96,19 @@ jobs: |
96 | 96 | - name: Build |
97 | 97 | run: cmake --build tests/build_std -j$(nproc) |
98 | 98 |
|
99 | | - - name: Run API-compatibility tests (std mode) |
100 | | - # std mode: skip all tests that require bit-exact math (0 ULP). |
101 | | - # Skipped categories (std::exp/pow/atan2 and C++ loops are NOT bit-exact vs numpy): |
102 | | - # test_unary_math — transcendental element-wise (exp/log/sin/…) |
103 | | - # test_power — std::pow vs numpy SVML pow (0-1 ULP on AVX-512 runners) |
104 | | - # test_arctan2 — std::atan2 vs numpy SVML atan2 (0-1 ULP on AVX-512 runners) |
105 | | - # test_dot/norm/matmul — linalg (BLAS vs C++ loops) |
106 | | - # TestEinsum — einsum (BLAS vs loops) |
107 | | - # test_avx512_boundary — AVX-512 path not present in std build |
108 | | - # nan/domain/signed_zero/_inf — transcendental edge cases |
109 | | - # All structural, reduction, manipulation, io, comparison, astype, |
110 | | - # and advanced-indexing tests still run (~417 / 900). |
| 99 | + - name: Run all 900 tests (std mode — failures expected for transcendental/linalg) |
| 100 | + # Run the full suite so the CI log honestly shows which tests align and |
| 101 | + # which do not. std::exp/log/pow/atan2 and C++ loops differ from numpy's |
| 102 | + # SVML/OpenBLAS paths by 0-2 ULP — those failures are expected and documented. |
111 | 103 | run: | |
112 | 104 | cd tests |
113 | | - python -m pytest test_all.py -q --tb=short --no-header -k "not (test_unary_math or test_power or test_arctan2 or test_dot or test_norm or test_matmul or TestEinsum or test_avx512_boundary or test_nan_passthrough or test_nan_mixed or test_domain or signed_zero or _inf or test_sign_inf)" |
| 105 | + python -m pytest test_all.py -q --tb=no --no-header |
114 | 106 |
|
115 | 107 | # ── Job 3: package DEB ─────────────────────────────────────────────────────── |
116 | 108 | package: |
117 | 109 | name: Package DEB |
118 | 110 | runs-on: ubuntu-latest |
119 | | - needs: [test-bitexact, test-std] |
| 111 | + needs: [test-bitexact] # std failures are informational; only bitexact must pass |
120 | 112 |
|
121 | 113 | steps: |
122 | 114 | - uses: actions/checkout@v4 |
|
0 commit comments