Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
344 commits
Select commit Hold shift + click to select a range
b0b6738
refactor(interop): rename PythonConvert->NDArrayInterop, InteropRunti…
Nucs Jul 18, 2026
51baa64
refactor(interop): fold the fluent extensions into NDArrayInterop; dr…
Nucs Jul 18, 2026
ef0c4f5
feat(interop): optional GIL management — per-call nullable requireGIL…
Nucs Jul 18, 2026
1ad2b93
refactor(interop): rename NDArrayInterop->NDArrayPythonInterop, Pytho…
Nucs Jul 19, 2026
9aaf32b
feat(interop): NumpyCodecMode enum with Auto view-first/copy-fallback…
Nucs Jul 19, 2026
0e68177
feat(interop): view non-numpy non-contiguous exporters too (strided/o…
Nucs Jul 19, 2026
f92a63e
feat(interop): acquire leases through the memoryview wrapper + accept…
Nucs Jul 19, 2026
9d43264
fix(interop): widen the pythonnet dependency to [3.0.5,4.0.0) and dia…
Nucs Jul 19, 2026
98916f1
fix(interop): read the copy path through the memoryview too — ToNDArr…
Nucs Jul 19, 2026
54f7498
docs(interop): add 'The Zero-Copy Model' page and refresh the pythonn…
Nucs Jul 19, 2026
2fc7472
docs(interop): deepen the pythonnet and interop-index pages
Nucs Jul 19, 2026
2c67f94
docs(interop): add the supported-Python-range column, and correct the…
Nucs Jul 19, 2026
b5b4948
ci(interop): build, test and publish NumSharp.Interop.pythonnet
Nucs Jul 19, 2026
126f496
ci: stop masking Ubuntu failures — drop continue-on-error from both t…
Nucs Jul 19, 2026
fa0cc8b
fix(interop-test): resolve libpython on macOS framework builds — 140 …
Nucs Jul 19, 2026
53acaca
test(interop): execute every documentation example as a test — and fi…
Nucs Jul 19, 2026
413560a
fix(convolve): de-box the inner loop; replace a working-set test that…
Nucs Jul 19, 2026
563fd6b
test(interop): drop the doc-parsing gate — test the claims, never the…
Nucs Jul 19, 2026
3fc2fc3
feat(interop): map wchar text dtypes, harden array-interface, fix mma…
Jul 22, 2026
2d1fa8b
docs(interop): clean-slate rewrite of the four interop pages + full D…
Nucs Jul 22, 2026
54d24b4
docs(bugs): record the two interop-gate discoveries as detailed bug n…
Nucs Jul 22, 2026
5e1e6fa
Refine interop docs contract wording
Nucs Jul 25, 2026
7f7a50b
fix(interop): key the pythonnet friend grants and inherit repo-root s…
Nucs Aug 13, 2026
2e33250
feat(interop/openblas): widen CBLAS discovery (additive NUMSHARP_OPEN…
Nucs Aug 13, 2026
d9c00b4
feat(interop/openblas): NUMSHARP_OPENBLAS_PATH highest-priority (over…
Nucs Aug 13, 2026
ee4b53e
docs(interop/openblas): design doc for the new OpenBLAS delivery/disc…
Nucs Aug 13, 2026
da10831
feat(interop/openblas): implement the delivery design's runtime side …
Nucs Aug 13, 2026
4bf45b3
feat(interop/openblas): build-phase override delivery — buildTransiti…
Nucs Aug 13, 2026
f889a38
feat(interop/openblas): finalize the delivery model — retire the lega…
Nucs Aug 13, 2026
3b0d111
docs(interop/openblas): fix two stale delivery references found in a …
Nucs Aug 13, 2026
893c523
docs(interop/openblas): full website reference page for NumSharp.Inte…
Nucs Aug 14, 2026
94803cb
docs(interop/openblas): restructure delivery into quick-learn methods…
Nucs Aug 14, 2026
c3204cc
fix(interop/pythonnet): validate __array_interface__ on import (numpy…
Nucs Aug 13, 2026
25ac356
test(interop/pythonnet): pass 2 — property-based fuzzing, codec-compu…
Nucs Aug 14, 2026
9d7219c
docs(interop/pythonnet): pass 3 — byte-identity vs numpy (NaN convent…
Nucs Aug 14, 2026
eaca89e
docs(interop/openblas): reframe around the native-backend speedup, dr…
Nucs Aug 14, 2026
9c7c0a2
docs(interop/openblas): reframe the why around OpenBLAS-as-reference;…
Nucs Aug 14, 2026
359e9d3
test(oracle): add IEEE special-value parity tier (nan/±inf/±0/subnorm…
Nucs Aug 14, 2026
76f0c91
test(oracle): truthful-vs-precise adjudication — truth channel + prec…
Nucs Aug 14, 2026
31a178f
test(oracle): expand the gate — np.random byte-parity, CBLAS product …
Nucs Aug 14, 2026
18e4236
build: pin pocketfft as a direct submodule (parity reference for the …
Nucs Aug 14, 2026
5b2ae21
Promote explicit OpenBLAS roots
Nucs Aug 14, 2026
3b9d5cf
feat(fft): port pocketfft 1-D engine + strided driver to managed C# (…
Nucs Aug 14, 2026
d0081b6
feat(fft): np.fft.* API shells + np.conjugate (parity surface, comput…
Nucs Aug 14, 2026
f9405ec
build(submodule): pin OpenBLAS reference to numpy 2.4.2's exact build…
Nucs Aug 14, 2026
a525e35
feat(fft): wire np.fft.* shells to the ported pocketfft engine
Nucs Aug 14, 2026
af88e04
test(fft): parity review + fixes for standard complex transforms
Nucs Aug 14, 2026
ebfe942
test(fft): parity review + fixes for real transforms (rfft/irfft/rfft…
Nucs Aug 14, 2026
240f5fb
test(fft): parity review + fixes for hermitian transforms (hfft/ihfft…
Nucs Aug 14, 2026
895fa77
test(fft): parity review + fixes for helpers (fftfreq/rfftfreq/fftshi…
Nucs Aug 14, 2026
42114f4
fix(fft): central shared-core parity fixes from the /np-function review
Nucs Aug 14, 2026
e58e407
feat(fft): out= dtype flexibility (NumPy ufunc same_kind casting)
Nucs Aug 14, 2026
8b0ac70
feat: np.real/np.imag/np.angle (complex accessors, NumPy 2.4.2 parity)
Nucs Aug 14, 2026
b87895d
feat(interop/pythonnet): big-endian copy-decode (+ fix silent c8 corr…
Nucs Aug 14, 2026
bc91dd2
test(oracle): add the FFT differential-fuzz tier (fft/ifft/rfft/irfft…
Nucs Aug 14, 2026
50f7397
feat(interop/pythonnet): array-like decode ON by default; Decimal enc…
Nucs Aug 14, 2026
97ae852
test(interop/pythonnet): byte-for-byte codec contract suite via a pyt…
Nucs Aug 14, 2026
eb7e050
test(interop/pythonnet): read the numpy side as `Python.np.*` (beside…
Nucs Aug 14, 2026
68d5efa
test(interop/pythonnet): special-value fidelity + numpy-compute diffe…
Nucs Aug 14, 2026
63fba27
test(interop/pythonnet): live-numpy .npy/.npz save/load round-trip co…
Nucs Aug 14, 2026
054991f
test(interop/pythonnet): converting/edge .npy/.npz crossings (big-end…
Nucs Aug 14, 2026
f33f1ab
test(interop/pythonnet): pin the ndarray-subclass gate and the numpy-…
Nucs Aug 14, 2026
c4bb432
refactor(interop/openblas): rename package types to the OpenBlas* scheme
Nucs Aug 14, 2026
11d8d9f
Document FFT parity and clean OpenBLAS pack
Nucs Aug 14, 2026
59a46bd
Remove handover docs and experimental artifacts
Nucs Aug 14, 2026
8d5537a
Merge branch 'master' into journey3
Nucs Aug 14, 2026
f8e3d4f
chore(repo): relocate tooling — verify_strong_name.cs → .github/scrip…
Nucs Aug 14, 2026
ebda1f1
Rewrite ARCHITECTURE.md as system authority
Nucs Aug 14, 2026
038c416
refactor(coverage): rename tool project NumSharp.ApiInventory -> NumS…
Nucs Aug 14, 2026
079d185
refactor(env): rename 7 environment variables to a consistent scheme …
Nucs Aug 15, 2026
77a01ea
feat(core): add EnvVars value-accessor registry; make pythonnet engin…
Nucs Aug 15, 2026
02fe0fb
Expose NumPy dtype and FFT internals
Nucs Aug 15, 2026
d09e437
feat(linalg): LAPACK factorisations via OpenBLAS — add cholesky + qr …
Nucs Aug 15, 2026
b12c163
chore(packaging): align all NuGet packages + wire OpenBLAS/pythonnet …
Nucs Aug 15, 2026
c53a7a2
test(interop): live-NumPy byte-parity for cholesky/qr + enable OpenBL…
Nucs Aug 15, 2026
277ff69
fix(coverage): reflect np.fft/np.linalg facades in ApiInventory
Nucs Aug 15, 2026
dc448ac
feat(linalg): SVD + least-squares via OpenBLAS — svd/svdvals/pinv/mat…
Nucs Aug 15, 2026
dbe9783
test(linalg): completeness audit of the SVD/lstsq surface + fix cond(…
Nucs Aug 15, 2026
48fe74b
test(interop): live-NumPy byte-parity for the SVD/least-squares surfa…
Nucs Aug 15, 2026
9fa4804
feat(math): inverse-hyperbolic trig — arcsinh/arccosh/arctanh (+ asin…
Nucs Aug 15, 2026
615f1ee
perf(math): float16 arcsinh/arccosh/arctanh byte-exact via native Hal…
Nucs Aug 15, 2026
bf4fd5e
docs(math): record empirical parity ceiling for arcsinh/arccosh/arcta…
Nucs Aug 15, 2026
91c2a65
docs(math): POC results — no byte-exact SIMD/unroll speedup exists fo…
Nucs Aug 15, 2026
f2cefba
feat(sort): np.digitize + fix searchsorted NaN-as-largest total order
Nucs Aug 15, 2026
92dc537
feat(stats): np.cov — covariance matrix, byte-parity with NumPy 2.4.2…
Nucs Aug 15, 2026
4cb9189
fix(fft): make np.fft float32/float16 VALUES bit-exact to NumPy 2.4.2…
Nucs Aug 15, 2026
a990559
test(fft): gate every mixed-radix codelet's ido>1 branch (completenes…
Nucs Aug 15, 2026
97e9e82
perf(matmul): blocked GEBP double GEMM — transposed-B float64 dot 15.…
Nucs Aug 15, 2026
ebba2cb
feat(creation): Array-API `device` conformance — ndarray.device/to_de…
Nucs Aug 15, 2026
1140efc
perf(complex-math): branch-light hot paths for Acosh/Sqrt/Hypot (bit-…
Nucs Aug 15, 2026
7d680eb
perf(matmul): route mid-size strided-B double GEMM to blocked; reject…
Nucs Aug 15, 2026
12f484c
Add np.correlate and np.bincount parity coverage
Nucs Aug 15, 2026
f5ec627
feat(linalg): eig/eigvals/eigh/eigvalsh via OpenBLAS geev/syevd/heevd
Nucs Aug 15, 2026
aaf731b
feat(statistics): np.corrcoef — Pearson correlation as a thin wrapper…
Nucs Aug 15, 2026
68d2cdc
Add Level-3 OpenBLAS bindings and tests
Nucs Aug 15, 2026
7bcad84
feat(linalg): np.kron — Kronecker product with NumPy 2.4.2 parity
Nucs Aug 15, 2026
82d8f15
test(kron): differential-fuzz gate for np.kron (products tier, 80 cases)
Nucs Aug 15, 2026
6ee562d
feat(linalg): complex128 np.dot/np.matmul + product gufuncs byte-pari…
Nucs Aug 15, 2026
9787eba
test(linalg): live byte-parity interop gate for complex128 + real CBL…
Nucs Aug 15, 2026
1d4840e
docs: de-stale BLAS/LAPACK API surface — factorisations + complex128 …
Nucs Aug 15, 2026
7d2d7a2
feat(linalg): np.einsum contraction via the matrix products (OpenBLAS…
Nucs Aug 15, 2026
e124c79
feat(coverage): attribute-driven module discovery via [ModuleName] — …
Nucs Aug 20, 2026
d78e07d
feat(einsum): NumPy view/keyword semantics, casting gates, order rule…
Nucs Aug 20, 2026
d636b63
feat(coverage): scan-integrity gates — a silent inventory miss is now…
Nucs Aug 20, 2026
d0be313
feat(correlate/convolve): OpenBLAS byte-parity via the ISlidingDotBac…
Nucs Aug 20, 2026
bb63ba4
feat(linalg): np.einsum_path — greedy/optimal contraction planner, by…
Nucs Aug 20, 2026
956f339
feat(polynomial): NumPy poly family — poly/roots/polyfit/polyval + re…
Nucs Aug 20, 2026
73019dc
feat(linalg): np.matmul full keyword surface + np.cross + out= for np…
Nucs Aug 20, 2026
2628c92
fix(polynomial): parity fixes from adversarial NumPy audit — 0-d poly…
Nucs Aug 20, 2026
87ff579
fix(matmul): out= with extra leading loop dims broadcasts the product…
Nucs Aug 20, 2026
d6a5059
fix(polynomial): poly1d operator parity — array±p is element-wise, p/…
Nucs Aug 20, 2026
d1347c3
feat(linalg): MissingBackendException + OpenBlasMissingBackendExcepti…
Nucs Aug 20, 2026
9feac27
docs(linalg): reframe missing-backend doc comments to OpenBLAS
Nucs Aug 20, 2026
a1920a4
feat(io): np.savetxt — byte-exact NumPy 2.4.2 text serialization
Nucs Aug 20, 2026
17a1ff8
feat(io): np.loadtxt — NumPy 2.4.2 text reader (savetxt round-trip)
Nucs Aug 20, 2026
e44e468
feat(coverage): case-sensitive API matching + case-insensitive near-m…
Nucs Aug 20, 2026
80a0ed5
fix(io): savetxt/loadtxt NumPy-2.4.2 parity — 4 divergences + np.from…
Nucs Aug 20, 2026
d39ff82
fix(io): extend text-family audit to fromfile/tofile siblings
Nucs Aug 20, 2026
792a9f1
feat(ndarray): nbytes, fill, flags — NumPy 2.4.2 parity
Nucs Aug 20, 2026
7765ce5
feat(ndarray): real/imag properties + conj/conjugate methods — NumPy …
Nucs Aug 20, 2026
0686935
feat(ndarray): 14 missing instance methods — NumPy 2.4.2 ndarray-meth…
Nucs Aug 20, 2026
02cc162
style(files): normalize mixed-case NdArray.* filenames to exact NDArr…
Nucs Aug 20, 2026
4a533ef
chore: record NdArray->NDArray case-rename commit in .git-blame-ignor…
Nucs Aug 20, 2026
f677d43
style(files): normalize remaining ndarray-variant filenames to exact …
Nucs Aug 20, 2026
2815b55
chore: record second ndarray->NDArray filename-rename commit in .git-…
Nucs Aug 20, 2026
f4cdc1e
docs: fix stale NdArray.* file-path references to renamed NDArray.* f…
Nucs Aug 21, 2026
8dd8269
chore: record the NdArray path-ref-fix commit in .git-blame-ignore-revs
Nucs Aug 21, 2026
1a7136f
refactor(einsum): move contraction from TensorEngine into the np layer
Nucs Aug 21, 2026
e6fd254
test(oracle): isolate the differential-fuzz harness into NumSharp.Uni…
Nucs Aug 21, 2026
a342e4c
chore(git-blame): ignore the oracle-move commit in blame
Nucs Aug 21, 2026
b701843
Deprecate NDArray.Normalize helper
Nucs Aug 21, 2026
2696a14
refactor(test): rename test projects to the NumSharp.Tests.* family
Nucs Aug 21, 2026
5c00428
chore(git-blame): ignore the test-project rename commit in blame
Nucs Aug 21, 2026
74bf61e
chore(sln): surface oracle/coverage/benchmark in solution; drop NumSh…
Nucs Aug 21, 2026
8b4d626
test(benchmark): upgrade NumSharp.Benchmark to BenchmarkDotNet 0.15.8…
Nucs Aug 21, 2026
beac72d
test(benchmark): revive and scientifically harden the Unmanaged micro…
Nucs Aug 21, 2026
0875dd2
docs(skill/oracle): audit the oracle skill against the implementation…
Nucs Aug 21, 2026
0ab7087
docs(skill/oracle): second-pass audit — precision fixes + two closed …
Nucs Aug 21, 2026
cf559a1
test(oracle): add host-pinned linalg_parity differential-fuzz tier fo…
Nucs Aug 21, 2026
5ff54a7
test(oracle): add differential-fuzz coverage for cross, einsum/einsum…
Nucs Aug 21, 2026
03415ec
test(oracle): host-pinned linalg_parity coverage for the LU factorisa…
Nucs Aug 21, 2026
aee7cba
feat(ndarray): add ndarray.itemsize (NumPy 2.4.2 parity)
Nucs Aug 21, 2026
6ee5426
test(ndarray): lock in ndarray.nbytes NumPy 2.4.2 parity — all-dtype …
Nucs Aug 21, 2026
25ae705
feat(ndarray): add ndarray.data — the memoryview buffer object (np.Me…
Nucs Aug 21, 2026
6ef3021
fix(ndarray): strides in BYTES (NumPy parity) + item(i,j)/(i,j,k) ndi…
Nucs Aug 21, 2026
cc676ea
fix(ndarray): searchsorted key promotion + cumsum/cumprod out= + clip…
Nucs Aug 21, 2026
bc54440
feat(frombuffer): np.frombuffer(np.MemoryView) — the memoryview consu…
Nucs Aug 21, 2026
93abe13
fix(searchsorted): complex lexicographic (CDOUBLE_LT) parity + broade…
Nucs Aug 21, 2026
970ee7f
fix(view): align ndarray.view(dtype) different-itemsize rule with Num…
Nucs Aug 21, 2026
27a19ae
fix(ndarray): fill weak-scalar coercion parity (NaN/inf/complex) + st…
Nucs Aug 21, 2026
67994cb
feat(ndarray): add ndarray.byteswap (NumPy 2.4.2 parity)
Nucs Aug 21, 2026
f9db9c0
test(oracle): differential-fuzz coverage for ndarray.byteswap (manip …
Nucs Aug 21, 2026
7fa9675
test(fill): lock in no-ndim-limit inner-contiguous fill (>64 dims)
Nucs Aug 21, 2026
6bc54c3
bench(manipulation): add ndarray.byteswap to the op matrix
Nucs Aug 21, 2026
8f34e8f
fix(reductions): remove NDAxisIter's 64-dim cap (unlimited ndim, NumS…
Nucs Aug 21, 2026
5aac05f
refactor(reductions): make NDAxisState a ref struct (stack-pointer sa…
Nucs Aug 21, 2026
4b07b71
feat(ndarray): add ndarray.getfield / ndarray.setfield (NumPy 2.4.2 p…
Nucs Aug 21, 2026
275f089
feat(ndarray): add ndarray.setflags + close flags gaps (NumPy 2.4.2 p…
Nucs Aug 21, 2026
ca1b0fa
test(flags): 626-case NumPy differential oracle for ndarray.flags/set…
Nucs Aug 21, 2026
3045369
test(flags): wave-2 oracle from scanning NumPy's flags usages (871 ca…
Nucs Aug 21, 2026
9fe3e3e
test(flags): wave-3 probe-driven oracle (998 cases) + 3 parity-fix ki…
Nucs Aug 21, 2026
d0fd29d
test(flags): wave-4 layout-matrix oracle (74 cases) + astype(order='C…
Nucs Aug 21, 2026
4072577
feat(memoryview): accept np.MemoryView in array/asarray/asanyarray/as…
Nucs Aug 21, 2026
53b5d82
feat(flags): model the 8 formerly-[Misaligned] numpy-internal represe…
Nucs Aug 21, 2026
7d286b2
test(flags): 210-case layout-parity NumPy oracle + 34 integration tes…
Nucs Aug 21, 2026
fcb3663
refactor(shape): fold the stride-perm machinery into the Shape partia…
Nucs Aug 21, 2026
e5b5010
Clarify benchmark docs and report surfaces
Nucs Aug 21, 2026
90e3e31
Rename Oracle solution folder
Nucs Aug 21, 2026
aaa41ef
feat: np.choose
Nucs Aug 21, 2026
b2a8374
fix(np): 7 NumPy 2.4.2 parity fixes across creation/math/linalg/stats
Nucs Aug 22, 2026
0a6e2e4
test(oracle): complete direct operation coverage
Nucs Aug 22, 2026
9a48200
test(oracle): pin journey3 coverage inventory
Nucs Aug 22, 2026
6ba2475
feat(np): np.bmat — block-matrix assembly (NumPy 2.4.2 parity)
Nucs Aug 22, 2026
8a1376f
perf(quantile): pivot-stack block-partition quickselect — 2.5–5× NumP…
Nucs Aug 22, 2026
0370c0a
feat(np): np.nancumsum + np.nancumprod (NaN-aware cumulative scans)
Nucs Aug 22, 2026
d5621d5
feat(np): np.bmat ITuple overload + verbatim NumPy error messages
Nucs Aug 22, 2026
e868d8a
feat(random): np.random.default_rng (PCG64 Generator) + bytes + rando…
Nucs Aug 22, 2026
f491c49
fix(random): np.random.bytes byte[] ceiling — clear error + boundary …
Nucs Aug 22, 2026
75a1d87
perf(argpartition): pivot-stack block-partition quickselect — up to 3…
Nucs Aug 22, 2026
febfbbd
fix(random): completeness-audit parity fixes — uniform high<low, inte…
Nucs Aug 22, 2026
ceb1009
test(oracle): differential-fuzz coverage for the PCG64 Generator + ra…
Nucs Aug 22, 2026
5df1089
perf(unique): route np.unique family through the radix sort core — 5–…
Nucs Aug 22, 2026
ccbeebf
refactor(random): make the PCG64/SeedSequence/BitGenerator public sur…
Nucs Aug 22, 2026
bd96d54
perf(isin): hash-set membership replaces sort+searchsorted — float64 …
Nucs Aug 22, 2026
cb63b0c
bench: complete backend-aware benchmark coverage dashboard
Nucs Aug 22, 2026
eb5d676
merge journey3-bench: complete benchmark coverage dashboard
Nucs Aug 22, 2026
754b747
fix(random): PCG64 Generator parity audit vs NumPy 2.4.2 — 6 byte-exa…
Nucs Aug 22, 2026
ff9d7f5
fix(coverage): credit NumSharp type exports the inventory tool was mi…
Nucs Aug 22, 2026
44d2e7d
feat(random)!: np.random.bytes / Generator.bytes return NDArray<byte>…
Nucs Aug 22, 2026
b07624f
docs(bench): revise status bands and add load more
Nucs Aug 22, 2026
6bf0fa9
docs(bench): include unavailable managed rows in no-data
Nucs Aug 22, 2026
5e7c238
fix(bench): keep tooltip open when loading more rows
Nucs Aug 22, 2026
4fd9434
style(bench): green parity-adjacent status bands
Nucs Aug 22, 2026
487874b
style(bench): color parity-adjacent scores green
Nucs Aug 22, 2026
73d4ec6
fix(bench): stop Decimal cumprod overflow and np.imag OOM in the op m…
Nucs Aug 22, 2026
32598dd
fix(bench): stop Decimal nanprod overflow in NanReductionBenchmarks
Nucs Aug 22, 2026
9aa4eb0
fix(bench): stop np.iscomplex OOM in LogicBenchmarks (dispose shortcu…
Nucs Aug 22, 2026
a150e4e
perf(openblas): stop wasted result-zeroing before full-overwrite BLAS…
Nucs Aug 22, 2026
6521b8b
perf(openblas): extend fillZeros:false to the rest of the product/fac…
Nucs Aug 22, 2026
9cf599c
perf(openblas): batch sliding-dot middle + force tier-1 on LAPACK cop…
Nucs Aug 22, 2026
721bb7a
perf(openblas): close the last degraded small-N benchmarks (tensordot…
Nucs Aug 22, 2026
e16b921
Add changelog skill & commit-sweep playbook
Nucs Aug 23, 2026
4fc8e8d
test(oracle): isolate random-parity replay from the global np.random …
Nucs Aug 23, 2026
3ba078b
docs(oracle): add Tests & Oracle inventory tool + website dashboard
Nucs Aug 23, 2026
279d3e8
bench: refresh benchmark reports and publish the 2026-08-22 history s…
Nucs Aug 23, 2026
64dda28
docs(release): add NumSharp 0.70.0 release notes and the changelog ho…
Nucs Aug 23, 2026
5a69cfe
perf(kernels): OptimizeAndInline the SIMD/bit-transform kernel surface
Nucs Aug 23, 2026
32732a0
fix(reduce): float16 sum via a float32 widen-compute-narrow shadow (N…
Nucs Aug 23, 2026
8231b3c
ci: fix journey3 PR CI failures across test, interop, signing and cov…
Nucs Aug 23, 2026
e0dc1c9
ci: coverage cross-platform determinism + macOS sin/cos inf gate + in…
Nucs Aug 23, 2026
ee2ceb1
ci: regenerate Tests & Oracle inventory for shifted line numbers + cr…
Nucs Aug 23, 2026
330cd9a
ci(gitattributes): mark generated data subtrees binary to drop them f…
Nucs Aug 23, 2026
5e70a9d
ci: fix journey3 PR CI failures across the test and interop-test jobs
Nucs Aug 23, 2026
b3ba6bc
ci(interop): force numpy's OpenBLAS wheel on macOS so byte-parity hol…
Nucs Aug 24, 2026
02e6929
ci+fix: green journey3 cross-platform CI — host-pin libm oracle tiers…
Nucs Aug 24, 2026
1b4e776
feat(lifetime): NDScope ambient reclamation scope — eager buffer rele…
Nucs Aug 23, 2026
e387758
perf(kernels): OptimizeAndInline the reduction/sliding-dot/introselec…
Nucs Aug 23, 2026
99583e2
feat(lifetime): widen NDScope coverage across the np.* surface + NDSc…
Nucs Aug 23, 2026
ba9c2ca
feat(build): [NDScoped] IL weaver — build-time NDScope injection, sit…
Nucs Aug 23, 2026
726ec48
harden(lifetime): NDScope out-of-order Dispose safety + thread assert…
Nucs Aug 24, 2026
e0d9f19
perf(lifetime): scope the LinAlg/Math composition tier ([NDScoped]) —…
Nucs Aug 24, 2026
1c42486
perf(lifetime): scope the polynomial / N-D FFT / norm composition tie…
Nucs Aug 24, 2026
3686f6a
test(lifetime): cover the woven NDScope through nested scopes and nes…
Nucs Aug 24, 2026
9c84a62
test(lifetime): pin NDScope thread-safety invariants (thread-confined…
Nucs Aug 24, 2026
5c01d0f
perf(lifetime): scope linalg backend compositions + fft Hermitian + n…
Nucs Aug 24, 2026
af21fec
test(lifetime): detailed correctness + allocation-discipline verifica…
Nucs Aug 24, 2026
f0187d2
test(lifetime): verify manual Dispose() inside a scope is flawless (n…
Nucs Aug 24, 2026
19dbf19
docs(inventory): refresh test/oracle dashboard snapshot for the journ…
Nucs Aug 24, 2026
27eccaf
Refresh changelog style and release notes
Nucs Aug 24, 2026
6c96beb
test(interop): tolerate <=1 ULP in the managed small-kernel convolve …
Nucs Aug 24, 2026
7e6c127
test(interop): skip arm64 + widen x64 tolerance to <=2 ULP for manage…
Nucs Aug 24, 2026
edc946c
docs(inventory): refresh test/oracle report line numbers after the co…
Nucs Aug 24, 2026
020e654
feat(lifetime): weave carrier returns — ValueTuple-of-NDArray + resul…
Nucs Aug 24, 2026
0db431a
feat(lifetime): generalize tuple weaving via ITuple (any arity up to …
Nucs Aug 24, 2026
09b47a4
fix(lifetime): ~NDArray abandons its buffer ref instead of freeing — …
Nucs Aug 24, 2026
5e2874b
docs(inventory): refresh test/oracle dashboard for the ArcLifecycleTe…
Nucs Aug 24, 2026
cfc7b94
feat(lifetime): weave bare IArraySlice/UnmanagedStorage returns with …
Nucs Aug 24, 2026
3ea2e97
docs(website): add the [NDScoped] / NumSharp.Weaver page
Nucs Aug 24, 2026
1216115
test(lifetime): prove woven [NDScoped] storage-touching methods never…
Nucs Aug 24, 2026
8306fa6
perf(storage): collapse the 15 per-dtype ArraySlice<T> fields into on…
Nucs Aug 24, 2026
793949f
Merge remote-tracking branch 'origin/journey3' into journey3
Nucs Aug 24, 2026
8a039e8
docs(inventory): refresh test/oracle dashboard for TypedSlicesUnionTests
Nucs Aug 24, 2026
c4b7283
bench: refresh full NumPy-vs-NumSharp matrix + subsystems, snapshot 2…
Nucs Aug 24, 2026
5753cf4
docs(union): stamp CI-matrix + ILVerify outcomes into the union desig…
Nucs Aug 24, 2026
cbd39cb
feat(weaver): ship NumSharp.Weaver as an installable build-time weave…
Nucs Aug 24, 2026
76a0dd9
test(weaver): adversarial battery + 14-step gate; cross-platform path…
Nucs Aug 24, 2026
bb21b7d
feat(weaver): harden targets with Nucs.JsonSettings.Autosave's battle…
Nucs Aug 24, 2026
5811381
test(weaver): stress harness — source-mode, nupkg-mode, and 8-way par…
Nucs Aug 24, 2026
0d38e15
bench: measure O(1)/scalar ops with proper averages (>=50 samples, >=…
Nucs Aug 24, 2026
938d044
Add NumSharp.Weaver to solution
Nucs Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1,707 changes: 1,668 additions & 39 deletions .claude/CLAUDE.md

Large diffs are not rendered by default.

24 changes: 15 additions & 9 deletions .claude/skills/benchmark/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
name: benchmark
description: >-
NumSharp's NumPy-vs-NumSharp performance harness — the op/dtype/N matrix (C# BenchmarkDotNet vs a
warm NumPy process) plus five appended subsystems (nditer, layout, operand, cast, fusion), all in
warm NumPy process), unified Managed/OpenBLAS backend profiles, and five appended subsystems
(nditer, layout, operand, cast, fusion), all in
the NPY/NS convention. Use this whenever you add a benchmark for an np.* op, wire a C# benchmark to
its NumPy twin, run the official suite or a subset, read/interpret the ratio matrix or history
snapshots, add a whole subsystem, or debug a suspicious measurement (the Debug-taint 2x pitfall,
Expand All @@ -21,7 +22,7 @@ is the distilled map + the actionable playbooks. Read `benchmark/CLAUDE.md` when

> **ratio = NumPy_ms / NumSharp_ms.** `>1` = NumSharp **faster**, `<1` = slower, `=1` = parity. **Higher is better.**

Used everywhere — matrices, geomeans, commit messages, every `*_sheet.py`. Icons: ✅ `≥1.0` · 🟡 `≥0.5` · 🟠 `≥0.2`
Used everywhere — matrices, geomeans, commit messages, every `*_sheet.py`. Dashboard/report bands: ✅ `≥1.05` · 🟡 `≥0.5` · 🟠 `≥0.2`
· 🔴 `<0.2`. (The legacy `run-benchmarks.ps1` prints the INVERSE NS/NPY — prefer NPY/NS for anything new.)

## THE pitfall: Debug taints timings ~2×
Expand All @@ -38,7 +39,7 @@ script assembly, not Core. The BenchmarkDotNet projects are exempt (they mandate
|------|-------|------|
| C# | `benchmark/NumSharp.Benchmark.CSharp/Benchmarks/<Category>/*.cs` | BenchmarkDotNet classes; `[Benchmark(Description="np.foo(a)")]` methods. |
| NumPy | `benchmark/NumSharp.Benchmark.Python/numpy_benchmark.py` | `run_<suite>_benchmarks(...)` emitting `BenchmarkResult` rows. |
| Merge | `benchmark/scripts/merge-results.py` | Joins on `(normalize_op_name(name), dtype, N)`. |
| Merge | `benchmark/scripts/{merge-results,merge-backend-profiles}.py` | Joins language timings, then backend profiles on the exact cell. |
| Orchestrator | `benchmark/run_benchmark.py` | Builds C#, runs each suite (BDN) + warm NumPy across 1K/100K/10M, merges, snapshots. |

The join is by **normalized op name**: `normalize_op_name` strips the dtype tag, `[annotations]`, and
Expand All @@ -47,12 +48,17 @@ names to normalize identically or the row shows as "C# not run" / "NumPy only".

## The matrix + subsystems

- **Op matrix** — 14 comparison suites, each a C# namespace filter in `run_benchmark.py`'s `SUITES` map
- **Op matrix** — 18 comparison suites, each a C# namespace filter in `run_benchmark.py`'s `SUITES` map
(`arithmetic, unary, reduction, broadcast, creation, manipulation, slicing, comparison, bitwise, logic,
statistics, sorting, linalg, selection`). Swept over 1K/100K/10M × the 15 dtypes.
statistics, sorting, linalg, selection, fft, random, ndarray, api`). Swept over the size/dtype tiers
each API can exercise safely; the classic kernels retain the 1K/100K/10M sweep.
- **Backend profiles** — `benchmark/backends/backend_profiles.py` runs every backend-sensitive API
under Managed C# and OpenBLAS with one schema; MissingBackendException and NotSupportedException
are availability outcomes. Separate profile JSON files are merged into one effective dataset.
- **Five appended subsystems** (own result models, appended not merged): `nditer` (iterator machinery),
`layout` (op × 8 memory layouts × dtype), `operand` (1-D/scalar/mixed/broadcast), `cast` (astype 15×15 × layout),
`fusion` (`np.evaluate`). Each is a `*_bench.{cs,py}` pair + a `*_sheet.py` renderer.
and `fusion` (`np.evaluate`). Each is a
`*_bench.{cs,py}` pair + a `*_sheet.py` renderer.

## Playbook — add a benchmark for a new op

Expand All @@ -71,8 +77,8 @@ The most common task. Full worked example in **`references/add-benchmark.md`**.

## Other tasks → where to go

- **Run the suite (official / subset), interpret the report, snapshots** → `references/run-and-report.md`.
- **Add or edit a matrix subsystem (nditer/layout/operand/cast/fusion)** → `references/subsystems.md`.
- **Run the suite (official / subset), interpret the report, the reports/UI surfaces + snapshots** → `references/run-and-report.md`. (The human-facing UI is the DocFX page `docs/website-src/docs/benchmarks-dashboard.md`; its Function Explorer data is generated, while narrative cards are curated.)
- **Add or edit a matrix subsystem or backend profile case** → `references/subsystems.md`.
- **Everything else (all suites, config internals, troubleshooting, type map)** → `benchmark/CLAUDE.md`.

## Gotchas
Expand All @@ -91,4 +97,4 @@ The most common task. Full worked example in **`references/add-benchmark.md`**.

- `references/add-benchmark.md` — the detailed add-a-benchmark playbook (C# + NumPy twin + join-key rules + smoke).
- `references/run-and-report.md` — running the official run / subsets, the report + history snapshots, InProcessEmit.
- `references/subsystems.md` — the five subsystems and how to add one (`*_bench.{cs,py}` + `*_sheet.py`).
- `references/subsystems.md` — backend profiles plus the five appended subsystems.
2 changes: 1 addition & 1 deletion .claude/skills/benchmark/references/add-benchmark.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Only when your ops form a new category with no existing home:
4. (legacy) optionally add the filter to `run-benchmarks.ps1`'s `ValidateSet` and Program.cs menu.

Then the new suite runs in `python run_benchmark.py --suites <newsuite>` (and in the full run), joined and reported
exactly like the built-in 14. Keep the C# `[Benchmark(Description)]` labels normalizing onto the NumPy `.name`s.
exactly like the built-in 18. Keep the C# `[Benchmark(Description)]` labels normalizing onto the NumPy `.name`s.

## Choosing base class & size (quick reference)

Expand Down
36 changes: 28 additions & 8 deletions .claude/skills/benchmark/references/run-and-report.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,22 @@
## Official run — `benchmark/run_benchmark.py` (the entry point)

Builds the C# suite, runs each suite through BenchmarkDotNet (per-class JSON, resumable), sweeps warm NumPy across
1K/100K/10M, merges on `(op, dtype, N)`, appends the five subsystems, archives raw scratch to
the applicable size tiers, runs Managed/OpenBLAS profiles, merges on `(op, dtype, N, scenario)`,
appends the five complementary subsystems, and archives raw scratch to
`results/<ts>/` (gitignored), and writes the committable `history/<date>_<sha>/` snapshot.

```bash
python run_benchmark.py # full official run (all 14 suites + 5 subsystems)
python run_benchmark.py # full official run (18 suites + backend profiles + subsystems)
python run_benchmark.py --suites manipulation unary # subset of the op matrix
python run_benchmark.py --skip-build # reuse existing Release build
python run_benchmark.py --skip-csharp # NumPy only
python run_benchmark.py --quick # dev: fewer NumPy iterations
python run_benchmark.py --no-history # don't write the history snapshot
# subsystem opt-outs: --skip-nditer --skip-layout --skip-operand --skip-cast --skip-fusion
# backend profile opt-out: --skip-openblas
```

**Cost:** the full matrix is long (µs–ms array ops × 15 dtypes × 3 sizes × 14 suites + subsystems). For iterating
**Cost:** the full matrix is long (µs–ms array ops × applicable dtypes/sizes × 18 suites + subsystems). For iterating
on one op, `--suites <that suite>` or the smoke path (`--list flat` + `numpy_benchmark.py --suite <s> --quick`) is
usually the right scope. A full measured run + committed snapshot is the post-release `.github/workflows/
benchmark.yml` ritual, not something to kick off casually.
Expand All @@ -37,19 +39,37 @@ The nditer subsystem reports a section that crashes all retries (the known inter

## Reading the report

- **Convention is NPY/NS** (NumPy_ms / NumSharp_ms, `>1` = NumSharp faster). Icons ✅ `≥1.0` 🟡 `≥0.5` 🟠 `≥0.2`
🔴 `<0.2`.
- The report has a **per-size geomean summary** + the full **per-(op, dtype, N) ratio matrix**, then the five
appended subsystem sections.
- **Convention is NPY/NS** (NumPy_ms / NumSharp_ms, `>1` = NumSharp faster). Published bands: ✅ `≥1.05×` 🟡 `≥0.5×`
🟠 `≥0.2×` 🔴 `<0.2×` · **▫ negligible** (sub-µs either side or >20× — excluded from geomeans & Best/Worst)
· **⚪** (C# side unjoined). The `%NumPy🕐` column = NumSharp_ms / NumPy_ms × 100 = share of NumPy's time
NumSharp uses (<100% = faster).
- **Credibility gating** (`merge-results.py` `classify()`): only rows where **both sides did ≥1µs of work AND the
speedup is within 20×** count toward the geomeans and rankings. Sub-µs call-overhead rows, view returns, lazy
allocs and dead-code-eliminated kernels are `▫ negligible` — kept in the per-suite tables, never showcased.
- The report has the full **per-(op, dtype, N, scenario) matrix**, both profile results, one
fastest-valid effective value, then the five appended subsystem sections.
- A row missing a C# or NumPy value ("C# not run" / "NumPy only") almost always means the two names didn't
**normalize to the same join key** — check the C# `[Benchmark(Description)]` vs the NumPy `.name`.

## Reports & UI surfaces (canonical → human-facing)

They drift — know which is which:
- **`benchmark/benchmark-report.md`** — the canonical backend-aware report. Tracked; refreshed by CI. Start here.
- **`benchmark-report.{managed,openblas}.json`** — separate profiles using the same schema; the unsuffixed
JSON contains both profiles plus the effective selection.
- **`benchmark/history/latest/*`** — the committable snapshot the docs/CI reference.
- **`benchmark/benchmark-dashboard.md`** — a dense ASCII-bar sheet from `scripts/render_dashboard.py`. Gitignored,
**NOT** wired into `run_benchmark.py` or CI — run it by hand to seed the DocFX dashboard's numbers.
- **`docs/website-src/docs/benchmarks-dashboard.md`** — the **real UI**, promoted from the backend POC. It reads
only the canonical combined JSON and computes effective rollups/backend drill-downs from measured rows.
- **`benchmark/README.md`** is a static orientation guide, **not** the report — CI never refreshes it.

## History snapshots — what we commit

| Path | Tracked? | Contents |
|------|----------|----------|
| `benchmark/results/<ts>/` | ❌ gitignored | raw per-run scratch (per-suite NumPy JSON, BDN per-class reports, merged json/csv). |
| `benchmark/history/<date>_<sha>/` | ✅ tracked | the snapshot: `MANIFEST.md` + `benchmark-report.{md,json,csv}` + `numpy-results.json` + every subsystem `*_results.{md,tsv}` + `cards/`. |
| `benchmark/history/<date>_<sha>/` | ✅ tracked | the snapshot: MANIFEST + combined/separate profile JSON + report/csv + NumPy input + subsystem results + cards. |
| `benchmark/history/latest` | ✅ tracked symlink | → the newest snapshot. Stable path for docs/CI. |

`benchmark/scripts/snapshot_history.py` assembles it (called by `run_benchmark.py`; `--commit` to also git-commit).
Expand Down
14 changes: 8 additions & 6 deletions .claude/skills/benchmark/references/subsystems.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# The five matrix subsystems (and how to add one)
# Backend profiles and the five complementary subsystems

Beyond the op/dtype/N matrix, `run_benchmark.py` appends five subsystems that fill axes the op matrix can't
express. Each has its OWN result model and is **appended, not merged** into the op matrix. They live in
`benchmark/{nditer,layout,operand,cast,fusion}/`.
`run_benchmark.py` first merges targeted Managed/OpenBLAS profile rows into the op matrix, then appends
five subsystems whose result models cannot fit that matrix. Backend exceptions are availability states.

| Subsystem | Dir | What it adds the op matrix lacks | Result model |
|-----------|-----|----------------------------------|--------------|
Expand All @@ -11,15 +10,18 @@ express. Each has its OWN result model and is **appended, not merged** into the
| **operand** | `benchmark/operand/` | 1-D (contig/strided/reversed), scalar operand, mixed operand layouts (C+F, C+T), binary broadcast | case × dtype |
| **cast** | `benchmark/cast/` | full `astype` src→dst × 8 layouts at 1M — no op-matrix coverage at all | 15×15 per-layout matrices |
| **fusion** | `benchmark/fusion/` | `np.evaluate` fused vs unfused np.* chains (+ NumPy context) | fixed-expression report |
| **backend profiles** | `benchmark/backends/` → `benchmark/openblas/` | all 39 backend-sensitive APIs under Managed C# and OpenBLAS; catches MissingBackendException and NotSupportedException | op × dtype × N × scenario, merged |

## The shared shape (every subsystem is the same three files)
## The shared shape (the five appended subsystems)

1. **`<name>_bench.cs`** — a NumSharp file-based app fed on stdin via `dotnet run -c Release -`. Emits rows with the
subsystem's keys. Its author-absolute `#:project` path is rewritten to the running checkout by the driver.
2. **`<name>_bench.py`** — the NumPy twin emitting IDENTICAL keys.
3. **`<name>_sheet.py`** — merges the two and renders `<name>_results.md` (+ `.tsv`), in the **NPY/NS** convention.

The build/run/parse plumbing is shared in `benchmark/scripts/bench_common.py`. `run_benchmark.py` calls each
The build/run/parse plumbing is shared in `benchmark/scripts/bench_common.py`. The backend driver uses it too,
but writes same-schema `openblas_results.{managed,openblas}.json` consumed by
`merge-backend-profiles.py`. `run_benchmark.py` calls each
`*_sheet.py` and appends its `*_results.md` as a report section; `--skip-<name>` opts out.

## Adding a new op to an EXISTING subsystem
Expand Down
Loading
Loading