Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
418 commits
Select commit Hold shift + click to select a range
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
160ecbb
perf(pool): GC pacing + coarse pressure + burst-sized buckets — fix s…
Nucs Aug 25, 2026
46dbb9c
perf(bool): bool bitwise/logical family rides byte-lane SIMD with Num…
Nucs Aug 25, 2026
7bd4f38
perf(predicates): SIMD isnan/isinf/isfinite kernels for float32/float…
Nucs Aug 25, 2026
d967d99
perf(bool): argmax/argmin find-first scans, comparisons on byte lanes…
Nucs Aug 25, 2026
4dfe761
perf(predicates): isnan/isinf/isfinite return via AsGeneric (shared s…
Nucs Aug 25, 2026
48f894e
perf(argmax): SIMD tournament argmax/argmin for float32/float64 — por…
Nucs Aug 25, 2026
87a8bb8
perf(exp2): SIMD float32 exp2 kernel — hybrid double-2^r + float scal…
Nucs Aug 25, 2026
e89d6d8
perf(openblas): thread-local retained scratch pool — LAPACK factorisa…
Nucs Aug 26, 2026
66ebe78
bench(methodology): min-based ratios + universal sample rule (>=50 ro…
Nucs Aug 26, 2026
d9be201
docs: clarify unit tests and oracle dashboard
Nucs Aug 26, 2026
09963a9
bench(methodology): close the review gaps in the min-basis + sample-r…
Nucs Aug 26, 2026
568f461
feat(weaver): [NDScoped] weaves async/iterator state machines + Task/…
Nucs Aug 26, 2026
3906015
test(oracle): scope gate — undisposed-intermediate detection over the…
Nucs Aug 26, 2026
d37c428
fix(weaver): sniff a Task<T> up-cast to plain Task in ReturnsTask + a…
Nucs Aug 26, 2026
d150678
test(oracle): outside-pool allocation detection — runtime bypass verd…
Nucs Aug 26, 2026
7942e7f
Replace MakeGeneric<bool> with AsGeneric<bool>
Nucs Aug 26, 2026
a004c1e
fix(scope): weave [NDScoped] onto the leaking composition families th…
Nucs Aug 26, 2026
1a01815
fix(scope): engine disposes the NEP50 scalar-cast temp and the copy('…
Nucs Aug 26, 2026
ef9cb0c
test(oracle): trim KnownEscapes for the families the scope fix wave c…
Nucs Aug 26, 2026
41b1d03
fix(scope): [NDScoped] the second wave of composition families (sorti…
Nucs Aug 26, 2026
2b327e4
test(oracle): dispose harness composition intermediates + trim KnownE…
Nucs Aug 26, 2026
14edcbc
fix(scope): the third wave — raw-scratch + field-egress leaks NDScope…
Nucs Aug 26, 2026
99f4db3
fix(scope): comparison copy('F') path orphaned its fResult via AsGene…
Nucs Aug 26, 2026
227aa91
fix(scope): random sampler compositions + harness draw scaffolding — …
Nucs Aug 26, 2026
3c21b0d
bench: publish 2026-08-24_938d0449 benchmark snapshot [skip ci]
Nucs Aug 26, 2026
652af21
fix(ndarray): honor fillZeros in int-size constructor
Nucs Aug 26, 2026
a0a6a43
perf(openblas): shave managed wrapper overhead on cond/vdot/eig/vecma…
Nucs Aug 27, 2026
a381986
perf(broadcast): route small same-dtype single-broadcasts to direct S…
Nucs Aug 27, 2026
3010c33
bench(openblas): fair single-thread matmul cells — pin NumPy threads …
Nucs Aug 27, 2026
bd65574
perf(shift): route small/medium bool<<scalar through astype+SIMD (100…
Nucs Aug 27, 2026
6e94dbc
perf(diff/ediff1d): fused adjacent-difference stencil kernel (6x @1K,…
Nucs Aug 28, 2026
d64f3df
perf(cov/corrcoef): managed symmetric-Gram (syrk) GEMM path (cov/corr…
Nucs Aug 28, 2026
4f666fc
perf(matmul): specialized managed gemv / gevm paths (matvec/vecmat/in…
Nucs Aug 28, 2026
498c42e
docs(skill): add 'specialized-path' — discover/experiment/create/meas…
Nucs Aug 28, 2026
8c6ca42
docs(skill): generalize 'specialized-path' to any function + any kind…
Nucs Aug 28, 2026
a13238a
perf(diag/fill_diagonal): IL strided-store kernel for the diagonal-wr…
Nucs Aug 28, 2026
8c09dc1
perf(reduce): stream int64/uint64 mean axis reductions + unroll flat …
Nucs Aug 28, 2026
9df43fd
docs(specialized-path skill): complete single-thread pinning + the Pu…
Nucs Aug 28, 2026
1c709bf
perf(reduce): parallel integer min/max flat reductions — ~5x NumPy at…
Nucs Aug 28, 2026
7bfc27a
perf(nditer/copy): pre-state cpblk fast path for trivial same-layout …
Nucs Aug 28, 2026
7b8dac6
Revert "perf(reduce): parallel integer min/max flat reductions"
Nucs Aug 28, 2026
48b00e0
feat(linalg): managed LU fallback — det/slogdet/solve/inv compute wit…
Nucs Aug 28, 2026
4125fb3
Add PyTorch pythonnet interoperability
Nucs Aug 28, 2026
99a5b64
Expand PyTorch interop edge coverage
Nucs Aug 28, 2026
480c278
feat(logic): np.nan_to_num + np.isposinf/np.isneginf (NumPy 2.4.2 par…
Nucs Aug 28, 2026
03884ee
perf(linalg): IL-SIMD-power the managed LU — Vector256+FMA register-b…
Nucs Aug 28, 2026
6d471cf
feat(ufunc): np.getbufsize / np.setbufsize — thread-local buffer size…
Nucs Aug 28, 2026
3ba7ac3
Integrate Python array adapters into interop bridge
Nucs Aug 28, 2026
2904a85
Expose Python array adapter registry
Nucs Aug 28, 2026
d126d7e
bench: enforce complete tier and backend coverage
Nucs Aug 28, 2026
cae3514
Add Pandas pythonnet interoperability
Nucs Aug 28, 2026
8668246
perf(ops): reclaim operator NDArray leftovers via [NDScoped]
Nucs Aug 28, 2026
759c385
Expand Pandas interop edge coverage
Nucs Aug 28, 2026
95c512c
test(ufunc): strengthen np.setbufsize suite — chained return + failed…
Nucs Aug 28, 2026
f8683d4
feat(analyzer): NDArray leak detection (NDW012) + weaver-missing guar…
Nucs Aug 28, 2026
feb130e
test(analyzer): NumSharp.Tests.Analyzer suite + intentional-warning f…
Nucs Aug 28, 2026
8bcf461
fix(analyzer): keep NDW012 a warning, never an error (+ contract test)
Nucs Aug 28, 2026
9ee4d1f
docs(analyzer): coverage-expansion plan for the analyzer test suite
Nucs Aug 28, 2026
358bd87
Add examples/NDScoping/Examples.cs — a single-file, leak-to-[NDScoped…
Nucs Aug 28, 2026
445dc6e
perf(dispose): second-pass leak sweep — reclaim linalg LU / delete / …
Nucs Aug 28, 2026
333d169
feat(analyzer): [NDScopedHelper] caller-coverage hint for NDW012 + ap…
Nucs Aug 28, 2026
d839e7d
refactor(analyzer): rename [NDScopedHelper] -> [NDScopedCovered] + ex…
Nucs Aug 28, 2026
6f07062
test(oracle): allowlist ManagedLu's 2 LU-scratch raw allocations in t…
Nucs Aug 28, 2026
1d51e2c
fix(dispose): NDW012 sweep, manipulation + logic — scope the un-scope…
Nucs Aug 28, 2026
1b69785
fix(dispose): NDW012 sweep, indexing + selection + creation + storage…
Nucs Aug 28, 2026
d4c1680
fix(dispose): NDW012 sweep, math + random + statistics — scope modf(T…
Nucs Aug 28, 2026
a67437a
fix(dispose): NDW012 sweep, linalg + polynomial — scope the factorisa…
Nucs Aug 28, 2026
6837c91
fix(dispose): NDW012 sweep, engine kernels — precise disposal on the …
Nucs Aug 28, 2026
4041e30
refactor(build): rename weaver/analyzer subsystem NumSharp.Weaver -> …
Nucs Aug 28, 2026
fd38a41
bench: keep only the latest benchmark history snapshot on this branch
Nucs Aug 28, 2026
fbbda5f
perf(isclose): compute in NumPy's exact result_type, not blanket floa…
Nucs Aug 28, 2026
374dd64
docs(data): move dashboard data to orphan master-code-data branch wit…
Nucs Aug 29, 2026
9b20007
docs(skill): document master-code-data dashboard-data delivery in the…
Nucs Aug 29, 2026
5598192
docs(dashboard): refresh hand-maintained benchmark numbers for the 20…
Nucs Aug 29, 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,738 changes: 1,699 additions & 39 deletions .claude/CLAUDE.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .claude/commands/np-function.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ NumPy is the source of truth and if NumPy does A, we do A but in NumSharp's C# w
- Do not implement struct kernel.
## 2. Implement np method/s
- Implement np methods to the fullest, integrating into our existing infrastructure and patterns.
- Our implementation might differ from NumPy's because NumPy uses C++ macros while we generate IL methods during runtime to achieve peak performance and cpu acceleration. But any input given to NumPy will produce same output with complete parity.
- Our implementation might differ from NumPy's because NumPy uses C++ macros while we generate IL methods during runtime to achieve peak performance and cpu acceleration on 1k, 100k, 1m/10m length (1m on large dtypes). But any input given to NumPy will produce same output with complete parity.
- Our implementation must provide same parameters as the NumPy function and support all dtypes NumSharp currently supports.
- Do not create a function per dtype/NPTypeCode or if-else/switch-case per dtype/NPTypeCode to call a specialized path.
- Do not use struct kernel pattern.
Expand Down
37 changes: 27 additions & 10 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 @@ -20,8 +21,11 @@ is the distilled map + the actionable playbooks. Read `benchmark/CLAUDE.md` when
## THE convention: NPY/NS (memorize this)

> **ratio = NumPy_ms / NumSharp_ms.** `>1` = NumSharp **faster**, `<1` = slower, `=1` = parity. **Higher is better.**
> **Timing basis: best window (min)** — ratios compare each side's per-case min over a ~200 ms time-budgeted
> sweep (a >20 ms/call op runs exactly 100 times; the C# op-matrix keeps 50 BDN iterations), never the mean (NS-side GC/page-fault/machine tails made means lie ~15% geomean-wide);
> per-case means stay in the JSON (`numpy_mean_ms`/`numsharp_mean_ms`) as tail diagnostics.

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 @@ -36,9 +40,10 @@ script assembly, not Core. The BenchmarkDotNet projects are exempt (they mandate

| Side | Where | What |
|------|-------|------|
| C# | `benchmark/NumSharp.Benchmark.CSharp/Benchmarks/<Category>/*.cs` | BenchmarkDotNet classes; `[Benchmark(Description="np.foo(a)")]` methods. |
| C# | `benchmark/NumSharp.Benchmark.CSharp/Benchmarks/<Category>/*.cs` | Core-only BenchmarkDotNet project plus shared benchmark classes; `[Benchmark(Description="np.foo(a)")]` methods. |
| OpenBLAS C# | `benchmark/NumSharp.Benchmark.OpenBLAS/` | Enables one-thread OpenBLAS and reruns the shared official LinearAlgebra classes/config. |
| 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 +52,24 @@ 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`). Universal-tier rule: an
operation/dtype with both 1K and 100K must also schedule 10M; the official merge checks NumPy and C#
independently. Scalar/1K-only dispatch cases are the only intentional non-throughput exception.
Allocation-heavy families map the 10M label to 1M physical elements symmetrically on both sides;
1M is not a separate report/dashboard tier.
- **Backend profiles** — the complete official LinearAlgebra BDN classes run under both the Core-only
executable and `NumSharp.Benchmark.OpenBLAS`; a merge gate rejects any missing exact-cell OpenBLAS
peer. `benchmark/backends/backend_profiles.py` supplements backend-only product/LAPACK routes with
the same schema; MissingBackendException and NotSupportedException are availability outcomes. Every
profile publishes `1K / 100K / 10M`; operation-specific physical work remains bounded (LAPACK maps
those tiers to matrix sides `32 / 96 / 128`). Separate profile JSON files are merged into one
effective dataset, with `actual_backend: managed` retained for controls that never dispatch to BLAS.
- **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 +88,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. Generated dashboard data is now delivered via the orphan **`master-code-data`** branch with a build-time date-priority resolver in `tools/dashboard_data/` — see `references/run-and-report.md`.)
- **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 +108,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
61 changes: 52 additions & 9 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,24 +39,65 @@ 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.

## Dashboard data delivery — the `master-code-data` branch

The three live docs dashboards fetch same-origin JSON that DocFX bakes at build time. That data now has
**two sources, reconciled by date at build time** (`master` stays a backwards-compatible fallback):

- **Code branch (`master`)** — each dataset's committed copy (the historical path; still builds alone).
- **Orphan `master-code-data` branch** — generated data as `<type>/<date>_<sha>/` snapshots + a git
symlink `latest`, one folder per type: `benchmark`, `tests-oracle`, `inventory` (NumPy API coverage),
`benchmark-coverage`. The branch's top-level + per-type READMEs are the authoritative spec.

Tooling lives on the code branch in **`tools/dashboard_data/`** (stdlib-only):
- `publish.py --type <t> --from <dir> --branch-worktree <wt> --sha <sha> --commit` — append a
`<date>_<sha>` snapshot for a type and repoint `latest`.
- `resolve.py --data-worktree <wt> --into .` — at docs-build time, per dataset pick the newer of
master-vs-branch by **git commit date** and overlay it onto the paths DocFX already reads (so the UI's
relative `data/…` fetch is unchanged). `latest` is the newest pointer; missing → max `<date>_<sha>` fallback.
- `common.py` — the per-type file/overlay map + `latest`/fallback/date helpers.

CI: `benchmark.yml` publishes the fresh `benchmark` snapshot after a run; `docs.yml` publishes
`inventory`/`tests-oracle`/`benchmark-coverage` on master pushes and runs `resolve.py` before `docfx build`.
**`docfx.json` is unchanged** — the resolver stages winners into the paths its resource/content blocks already glob.

## 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).
**Publish ritual:** run → review → commit `benchmark/history/`. Reference `benchmark/history/latest/benchmark-report.md`,
never the gitignored scratch.
never the gitignored scratch. The same `benchmark/history/latest` snapshot is also published to the
`master-code-data` branch (see *Dashboard data delivery* above) so the docs resolver can serve it to the site.

## The Debug-taint reminder (bears repeating)

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