Skip to content

[Major Rewrite] Index/nd.size/nd.shape int→long#596

Merged
Nucs merged 170 commits intomasterfrom
longindexing
Apr 11, 2026
Merged

[Major Rewrite] Index/nd.size/nd.shape int→long#596
Nucs merged 170 commits intomasterfrom
longindexing

Conversation

@Nucs
Copy link
Copy Markdown
Member

@Nucs Nucs commented Mar 26, 2026

Summary

Migrates all index, stride, offset, and size operations from int (int32) to long (int64), aligning NumSharp with NumPy's npy_intp type. This enables support for arrays exceeding 2GB (int32 max = 2.1B elements) and ensures compatibility with NumPy 2.x behavior.

Motivation

NumPy uses npy_intp (equivalent to Py_ssize_t) for all indexing operations, which is 64-bit on x64 platforms. NumSharp's previous int32 limitation prevented working with large arrays and caused silent overflow bugs when array sizes approached int32 limits.

Key drivers:

  • Support arrays with >2.1 billion elements
  • Align with NumPy 2.x npy_intp semantics
  • Eliminate overflow risks in index calculations
  • Enable large-scale scientific computing workloads

What Changed

  • Shape fields: size, dimensions, strides, offset, bufferSizelong
  • Shape methods: GetOffset(), GetCoordinates(), TransformOffset()long parameters and return types
  • Shape constructors: primary constructor now takes long[], int[] overloads delegate to long[]
  • Shape.Unmanaged: pointer parameters int*long* for strides/shapes
  • IArraySlice interface: all index parameters → long
  • IMemoryBlock interface: Count property → long
  • ArraySlice: Count property and all index parameters → long
  • UnmanagedStorage: Count property → long
  • UnmanagedStorage.Getters: all index parameters → long, added long[] overloads
  • UnmanagedStorage.Setters: all index parameters → long, added long[] overloads
  • UnmanagedMemoryBlock: allocation size and index parameters → long
  • NDArray: size, len properties → long
  • NDArray: shape, strides properties → long[]
  • NDArray indexers: added long[] coordinate overloads, int[] delegates to long[]
  • NDArray typed getters/setters: added long[] overloads
  • NDIterator: offset delegate Func<int[], int>Func<long[], long>
  • MultiIterator: coordinate handling → long[]
  • NDCoordinatesIncrementor: coordinates → long[]
  • NDCoordinatesAxisIncrementor: coordinates → long[]
  • NDCoordinatesLeftToAxisIncrementor: coordinates → long[]
  • NDExtendedCoordinatesIncrementor: coordinates → long[]
  • NDOffsetIncrementor: offset tracking → long
  • ValueOffsetIncrementor: offset tracking → long
  • ILKernelGenerator: all loop counters, delegate signatures, and IL emission updated for long
  • ILKernelGenerator: Ldc_I4Ldc_I8, Conv_I4Conv_I8 where appropriate
  • DefaultEngine operations: loop counters and index variables → long
  • DefaultEngine.Transpose: stride calculations → long
  • DefaultEngine.Broadcast: shape/stride calculations → long
  • SimdMatMul: matrix indices and loop counters → long
  • SimdKernels: loop counters → long
  • np.arange(int) and np.arange(int, int, int) now return int64 arrays (NumPy 2.x alignment)
  • np.argmax / np.argmin: return type → long
  • np.nonzero: return type → long[][]
  • Hashset: upgraded to long-based indexing with 33% growth factor for large collections
  • StrideDetector: pointer parameters int*long*, local stride calculations → long
  • LongIndexBuffer: new utility for temporary long index arrays

Breaking Changes

Change Impact Migration
NDArray.size returns long Low Cast to int if needed, or use directly
NDArray.shape returns long[] Medium Update code expecting int[]
NDArray.strides returns long[] Medium Update code expecting int[]
np.arange(int) returns int64 dtype Medium Use .astype(NPTypeCode.Int32) if int32 needed
np.argmax/np.argmin return long Low Cast to int if needed
np.nonzero returns long[][] Low Update code expecting int[][]
Shape[dim] returns long Low Cast to int if needed
Iterator coordinate arrays are long[] Low Internal change, minimal user impact

Performance Impact

Benchmarked at 1-3% overhead for scalar loops, <1% overhead for SIMD-optimized paths. This is acceptable given the benefits of large array support.

  • Pointer arithmetic natively supports long offsets (zero overhead)
  • SIMD paths unaffected (vector operations don't use index type)
  • Scalar loops have minor overhead from 64-bit counter increment
  • Memory layout unchanged (data types unaffected)

What Stays int

Item Reason
NDArray.ndim / Shape.NDim Maximum ~32 dimensions, never exceeds int
Slice.Start / Stop / Step Python slice semantics use int
Dimension loop indices (for (int d = 0; d < ndim; d++)) Iterating over dimensions, not elements
NPTypeCode enum values Small fixed set
Vector lane counts in SIMD Hardware-limited constants

Related

@Nucs Nucs changed the title [Major Rewrite] Index/NDArray.size int→long [Major Rewrite] Index/NDArray.size/nd.dimensions int→long Mar 26, 2026
@Nucs Nucs changed the title [Major Rewrite] Index/NDArray.size/nd.dimensions int→long [Major Rewrite] Index/NDArray.size/nd.shape int→long Mar 26, 2026
@Nucs Nucs changed the title [Major Rewrite] Index/NDArray.size/nd.shape int→long [Major Rewrite] Index/nd.size/nd.shape int→long Mar 26, 2026
Nucs and others added 27 commits March 26, 2026 18:56
Extended the keepdims fix to all remaining reduction operations:
- ReduceAMax (np.amax, np.max)
- ReduceAMin (np.amin, np.min)
- ReduceProduct (np.prod)
- ReduceStd (np.std)
- ReduceVar (np.var)

Also fixed np.amax/np.amin API layer which ignored keepdims when axis=null.

Added comprehensive parameterized test covering all reductions with
multiple dtypes (Int32, Int64, Single, Double, Int16, Byte) to prevent
regression.

All 7 reduction functions now correctly preserve dimensions with
keepdims=true, matching NumPy 2.x behavior.
Apply .gitattributes normalization across all text files.
No code changes - only CRLF → LF conversion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…N handling

This commit adds comprehensive SIMD acceleration for reduction operations
and fixes several NumPy compatibility issues.

- AllSimdHelper<T>(): SIMD-accelerated boolean all() with early-exit on first zero
- AnySimdHelper<T>(): SIMD-accelerated boolean any() with early-exit on first non-zero
- ArgMaxSimdHelper<T>(): Two-pass SIMD: find max value, then find index
- ArgMinSimdHelper<T>(): Two-pass SIMD: find min value, then find index
- NonZeroSimdHelper<T>(): Collects indices where elements != 0
- CountTrueSimdHelper(): Counts true values in bool array
- CopyMaskedElementsHelper<T>(): Copies elements where mask is true
- ConvertFlatIndicesToCoordinates(): Converts flat indices to per-dimension arrays

- **np.any axis-based reduction**: Fixed inverted logic in ComputeAnyPerAxis<T>.
  Was checking `Equals(default)` (returning true when zero found) instead of
  `!Equals(default)` (returning true when non-zero found). Also fixed return
  value to indicate computation success.

- **ArgMax/ArgMin NaN handling**: Added NumPy-compatible NaN propagation where
  first NaN always wins. For both argmax and argmin, NaN takes precedence over
  any other value including Infinity.

- **ArgMax/ArgMin empty array**: Now throws ArgumentException on empty arrays
  matching NumPy's ValueError behavior.

- **ArgMax/ArgMin Boolean support**: Added Boolean type handling. For argmax,
  finds first True; for argmin, finds first False.

- np.all(): Now uses AllSimdHelper for linear (axis=None) reduction
- np.any(): Now uses AnySimdHelper for linear reduction
- np.nonzero(): Added SIMD fast path for contiguous arrays
- Boolean masking (arr[mask]): Added SIMD fast path using CountTrueSimdHelper
  and CopyMaskedElementsHelper

Added comprehensive ownership/responsibility documentation to all
ILKernelGenerator partial class files explaining the architecture:
- ILKernelGenerator.cs: Core infrastructure and type mapping
- ILKernelGenerator.Binary.cs: Same-type binary operations
- ILKernelGenerator.MixedType.cs: Mixed-type with promotion
- ILKernelGenerator.Unary.cs: Unary element-wise operations
- ILKernelGenerator.Comparison.cs: Comparison operations
- ILKernelGenerator.Reduction.cs: Reductions and SIMD helpers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ions

Implements all missing kernel operations and routes SIMD helpers through
IKernelProvider interface for future backend abstraction.

- Power: IL kernel with Math.Pow scalar operation
- FloorDivide: np.floor_divide with NumPy floor-toward-negative-infinity semantics
- LeftShift/RightShift: np.left_shift, np.right_shift with SIMD Vector.ShiftLeft/Right

- Truncate: Vector.Truncate SIMD support
- Reciprocal: np.reciprocal (1/x) with SIMD
- Square: np.square optimized (x*x instead of power(x,2))
- Cbrt: np.cbrt cube root
- Deg2Rad/Rad2Deg: np.deg2rad, np.rad2deg (np.radians/np.degrees aliases)
- BitwiseNot: np.invert, np.bitwise_not with Vector.OnesComplement

- Var/Std: SIMD two-pass algorithm with interface integration
- NanSum/NanProd: np.nansum, np.nanprod (ignore NaN values)
- NanMin/NanMax: np.nanmin, np.nanmax (ignore NaN values)

- Route 6 SIMD helpers through IKernelProvider interface:
  - All<T>, Any<T>, FindNonZero<T>, ConvertFlatToCoordinates
  - CountTrue, CopyMasked<T>
- Clip kernel: SIMD Vector.Min/Max (~620→350 lines)
- Modf kernel: SIMD Vector.Truncate (.NET 9+)

- ATan2: Fixed wrong pointer type (byte*) for x operand in all non-byte cases

- ILKernelGenerator.Clip.cs, ILKernelGenerator.Modf.cs
- Default.{Cbrt,Deg2Rad,FloorDivide,Invert,Rad2Deg,Reciprocal,Shift,Square,Truncate}.cs
- np.{cbrt,deg2rad,floor_divide,invert,left_shift,nanprod,nansum,rad2deg,reciprocal,right_shift,trunc}.cs
- np.{nanmax,nanmin}.cs
- ShiftOpTests.cs, BinaryOpTests.cs (ATan2 tests)
This commit concludes a comprehensive audit of all np.* and DefaultEngine
operations against NumPy 2.x specifications.

- **ATan2**: Fixed non-contiguous array handling by adding np.broadcast_arrays()
  and .copy() materialization before pointer-based processing
- **NegateBoolean**: Removed buggy linear-indexing path, now routes through
  ExecuteUnaryOp with new UnaryOp.LogicalNot for proper stride handling
- **np.square(int)**: Now preserves integer dtype instead of promoting to double
- **np.invert(bool)**: Now uses logical NOT (!x) instead of bitwise NOT (~x)

- **np.power(NDArray, NDArray)**: Added array-to-array power overloads
- **np.logical_and/or/not/xor**: New functions in Logic/np.logical.cs
- **np.equal/not_equal/less/greater/less_equal/greater_equal**: 18 new
  comparison functions in Logic/np.comparison.cs
- **argmax/argmin keepdims**: Added keepdims parameter matching NumPy API

- Renamed `outType` parameter to `dtype` in 19 np.*.cs files to match NumPy
- Added UnaryOp.LogicalNot to KernelOp.cs for boolean array negation

- Created docs/KERNEL_API_AUDIT.md tracking Definition of Done criteria
- Updated .claude/CLAUDE.md with DOD section and current status

- Added NonContiguousTests.cs with 35+ tests for strided/broadcast arrays
- Added DtypeCoverageTests.cs with 26 parameterized tests for all 12 dtypes
- Added np.comparison.Test.cs for new comparison functions
- Updated KernelMisalignmentTests.cs to verify fixed behaviors

Files: 43 changed, 5 new files added
Tests: 3058 passed (93% of 3283 total)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bug #126 - Empty array comparison returns scalar (FIXED):
- All 6 comparison operators now return empty boolean arrays
- Files: NDArray.Equals.cs, NotEquals.cs, Greater.cs, Lower.cs

Bug #127 - Single-element axis reduction shares memory (FIXED):
- Changed Storage.Alias() and squeeze_fast() to return copies
- Fixed 8 files: Add, AMax, AMin, Product, Mean, Var, Std, CumAdd
- Added 20 memory isolation tests

Bug #128 - Empty array axis reduction returns scalar (FIXED):
- Proper empty array handling for all 9 reduction operations
- Sum→zeros, Prod→ones, Min/Max→ValueError, Mean/Std/Var→NaN
- Added 22 tests matching NumPy behavior

Bug #130 - np.unique NaN sorts to beginning (FIXED):
- Added NaNAwareDoubleComparer and NaNAwareSingleComparer
- NaN now sorts to end (NaN > any non-NaN value)
- Matches NumPy: [-inf, 1, 2, inf, nan]

Test summary: +54 new tests, all passing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 20K-line Regen template with clean 300-line implementation:

- ILKernelGenerator.MatMul.cs: Cache-blocked SIMD kernels for float/double
  - 64x64 tile blocking for L1/L2 cache optimization
  - Vector256 with FMA (Fused Multiply-Add) when available
  - IKJ loop order for sequential memory access on B matrix
  - Parallel execution for matrices > 65K elements

- Default.MatMul.2D2D.cs: Clean dispatcher with fallback
  - SIMD fast path for contiguous same-type float/double
  - Type-specific pointer loops for int/long
  - Generic double-accumulator fallback for mixed types

| Size    | Float32 | Float64 |
|---------|---------|---------|
| 32x32   | 34x     | 18x     |
| 64x64   | 38x     | 29x     |
| 128x128 | 15x     | 58x     |
| 256x256 | 183x    | 119x    |

- Before: 19,862 lines (Regen templates, 1728 type combinations)
- After: 284 lines (clean, maintainable)

Old Regen template preserved as .regen_disabled for reference.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
IL Kernel Infrastructure:
- Add ILKernelGenerator.Scan.cs for CumSum scan kernels with SIMD V128/V256/V512 paths
- Extend ILKernelGenerator.Reduction.cs with Var/Std/ArgMax/ArgMin axis reduction support
- Extend ILKernelGenerator.Clip.cs with strided/broadcast array helpers
- Extend ILKernelGenerator.Modf.cs with special value handling (NaN, Inf, -0)
- Add IKernelProvider interface extensions for new kernel types

DefaultEngine Migrations:
- Default.Reduction.Var.cs: IL fast path for contiguous arrays, single-element fix
- Default.Reduction.Std.cs: IL fast path for contiguous arrays, single-element fix
- Default.Reduction.CumAdd.cs: IL scan kernel integration
- Default.Reduction.ArgMax.cs: IL axis reduction with proper coordinate tracking
- Default.Reduction.ArgMin.cs: IL axis reduction with proper coordinate tracking
- Default.Power.cs: Scalar exponent path migrated to IL kernels
- Default.Clip.cs: Unified IL path (76% code reduction, 914→240 lines)
- Default.NonZero.cs: Strided IL fallback path
- Default.Modf.cs: Unified IL with special float handling

Bug Fixes:
- np.var.cs / np.std.cs: ddof parameter now properly passed through
- Var/Std single-element arrays now return double (matching NumPy)

Tests (3,500+ lines added):
- ArgMaxArgMinComprehensiveTests.cs: 480 lines covering all dtypes, shapes, axes
- VarStdComprehensiveTests.cs: 462 lines covering ddof, empty arrays, edge cases
- CumSumComprehensiveTests.cs: 381 lines covering accumulation, overflow, dtypes
- np_nonzero_strided_tests.cs: 221 lines for strided/transposed array support
- 7 NumPyPortedTests files: Edge cases from NumPy test suite

Code Impact:
- Net reduction: 543 lines removed (6,532 added - 2,172 removed from templates)
- ReductionTests.cs removed (884 lines) - replaced by comprehensive per-operation tests
- Eliminated ~1MB of switch/case template code via IL generation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… ClipEdgeCaseTests

- Fix BeOfValues params array unpacking: Cast GetData<T>() to object[] for proper params expansion
- Mark Power_Integer_LargeValues as Misaligned: Math.Pow precision loss for large integers is expected
- Fix np.full argument order in Clip tests: NumSharp uses (fill_value, shapes) not NumPy's (shape, fill_value)
- Mark Base_ReductionKeepdims_Size1Axis_ReturnsView as OpenBugs: view optimization not implemented

Test results: 3,879 total, 3,868 passed, 11 skipped, 0 failed
Breaking change: Migrate from int32 to int64 for array indexing.

Core type changes:
- Shape: size, dimensions[], strides[], offset, bufferSize -> long
- Slice: Start, Stop, Step -> long
- SliceDef: Start, Step, Count -> long
- NDArray: shape, size, strides properties -> long/long[]

Helper methods:
- Shape.ComputeLongShape() for int[] -> long[] conversion
- Shape.Vector(long) overload

Related to #584
- NDArray constructors: int size -> long size
- NDArray.GetAtIndex/SetAtIndex: int index -> long index
- UnmanagedStorage.GetAtIndex/SetAtIndex: int index -> long index
- ValueCoordinatesIncrementor.Next(): int[] -> long[]
- DefaultEngine.MoveAxis: int[] -> long[]

Build still failing - cascading changes needed in:
- All incrementors (NDCoordinatesIncrementor, NDOffsetIncrementor, etc.)
- NDIterator and all cast files
- UnmanagedStorage.Cloning
- np.random.shuffle, np.random.choice

Related to #584
- this[long index] indexer
- GetIndex/SetIndex with long index
- Slice(long start), Slice(long start, long length)
- Explicit IArraySlice implementations

Build has 439 cascading errors remaining across 50+ files.
Most are straightforward loop index changes (int → long).

Related to #584
…int[] convenience

Pattern applied:
- Get*(params long[] indices) - primary implementation calling Storage
- Get*(params int[] indices) - delegates to long[] via Shape.ComputeLongShape()
- Set*(value, params long[] indices) - primary implementation
- Set*(value, params int[] indices) - delegates to long[] version

Covers: GetData, GetBoolean, GetByte, GetChar, GetDecimal, GetDouble,
GetInt16, GetInt32, GetInt64, GetSingle, GetUInt16, GetUInt32, GetUInt64,
GetValue, GetValue<T>, SetData (3 overloads), SetValue (3 overloads),
SetBoolean, SetByte, SetInt16, SetUInt16, SetInt32, SetUInt32, SetInt64,
SetUInt64, SetChar, SetDouble, SetSingle, SetDecimal

Related to #584
…check

- Add overflow check when string length exceeds int.MaxValue
- Explicitly cast Count to int with comment explaining .NET string limitation
- Part of int32 to int64 indexing migration (#584)
- Add overflow check in AsString() instead of Debug.Assert
- Implement empty SetString(string, int[]) wrapper to call long[] version
- Change GetStringAt/SetStringAt offset parameter from int to long
- Part of int32 to int64 indexing migration (#584)
…ndices

- GetValue(int[]) -> GetValue(long[])
- GetValue<T>(int[]) -> GetValue<T>(long[])
- All direct getters (GetBoolean, GetByte, etc.) -> long[] indices
- SetValue<T>(int[]) -> SetValue<T>(long[])
- SetValue(object, int[]) -> SetValue(object, long[])
- SetData(object/NDArray/IArraySlice, int[]) -> long[] indices
- All typed setters (SetBoolean, SetByte, etc.) -> long[] indices
- Fix int sliceSize -> long sliceSize in GetData

Part of int32 to int64 indexing migration (#584)
- NDArray`1.cs: Add long[] indexer, int[] delegates to it
- UnmanagedStorage.cs: Add Span overflow check (Span limited to int)
- UnmanagedStorage.Cloning.cs: Add ArraySlice allocation overflow check
- NDIterator.cs: Change size field from int to long

Note: ~900 cascading errors remain from:
- ArraySlice (needs long count)
- Incrementors (need long coords)
- Various Default.* operations
- IKernelProvider interface

Part of int32 to int64 indexing migration (#584)
- NDCoordinatesIncrementor: Next() returns long[], Index is long[]
- NDCoordinatesIncrementorAutoResetting: all fields long
- NDOffsetIncrementor: Next() returns long, index/offset are long
- NDOffsetIncrementorAutoresetting: same changes
- ValueOffsetIncrementor: Next() returns long
- ValueOffsetIncrementorAutoresetting: same changes
- NDCoordinatesAxisIncrementor: constructor takes long[]
- NDCoordinatesLeftToAxisIncrementor: dimensions/Index are long[]
- NDExtendedCoordinatesIncrementor: dimensions/Index are long[]

Part of int64 indexing migration (#584)
- ArraySlice.cs: Change Allocate count parameter handling for long
- UnmanagedMemoryBlock: Adjust for long count
- np.random.choice.cs: Add explicit casts for int64 indices
- np.random.shuffle.cs: Update index handling for long
- ValueCoordinatesIncrementor.cs: Add long[] Index property
- NDArray.cs: Remove duplicate/dead code (112 lines)
MatMul.2D2D.cs:
- M, K, N parameters now long throughout
- All method signatures updated (long M, long K, long N)
- Loop counters changed to long
- Coordinate arrays changed to long[]

NDArray.unique.cs:
- len variable changed to long
- getOffset delegate now Func<long, long>
- Loop counters changed to long

NDArray.itemset.cs:
- Parameters changed from int[] to long[]

NdArray.Convolve.cs:
- Explicit (int) casts for size - acceptable because convolution
  on huge arrays is computationally infeasible (O(n*m))

NDArray.matrix_power.cs:
- Cast shape[0] to int for np.eye (pending np.eye long support)

np.linalg.norm.cs:
- Fixed bug: was casting int[] to long[] incorrectly

Remaining work:
- IL kernel interfaces still use int for count/size
- SIMD helpers (SimdMatMul) expect int parameters
- Default.Clip, Default.ATan2, Default.Transpose, Default.NonZero
  all need coordinated IL kernel + caller updates
….Unmanaged

- IKernelProvider: Changed interface to use long for size/count parameters
- Default.Transpose: Fixed int/long coordinate and stride handling
- ILKernelGenerator.Clip: Updated to use long loop counters
- TensorEngine: Updated method signatures for long indexing
- UnmanagedStorage.Slicing: Fixed slice offset to use long
- Shape.Unmanaged: Fixed unsafe pointer methods for long indices
- SimdMatMul.MatMulFloat accepts long M, N, K (validates <= int.MaxValue internally)
- MatMul2DKernel delegate uses long M, N, K
- np.nonzero returns NDArray<long>[] instead of NDArray<int>[]
- NDArray pointer indexer changed from int* to long*
- SwapAxes uses long[] for permutation
- AllSimdHelper<T> parameter: int totalSize → long totalSize
- Loop counters and vectorEnd: int → long
- Part of int64 indexing migration
ILKernelGenerator.Clip.cs:
- All loop counters and vectorEnd variables changed from int to long
- Scalar loops also changed to use long iterators

Default.Dot.NDMD.cs:
- contractDim, lshape, rshape, retShape → long/long[]
- Method signatures updated for TryDotNDMDSimd, DotNDMDSimdFloat/Double
- ComputeIterStrides, ComputeBaseOffset, ComputeRhsBaseOffset → long
- DotProductFloat, DotProductDouble → long parameters
- DotNDMDGeneric → long coordinates and iterators
- DecomposeIndex, DecomposeRhsIndex → long parameters
… fixed statements

ILKernelGenerator.Clip.cs:
- Changed 'int offset = shape.TransformOffset' to 'long offset'

Default.ATan2.cs:
- Changed fixed (int* ...) to fixed (long* ...) for strides and dimensions
- Updated ClassifyATan2Path signature to use long*
- Updated ExecuteATan2Kernel fixed statements

Note: StrideDetector and MixedTypeKernel delegate still need updating
- IsContiguous: int* strides/shape -> long* strides/shape
- IsScalar: int* strides -> long* strides
- CanSimdChunk: int* params -> long*, innerSize/lhsInner/rhsInner -> long
- Classify: int* params -> long*
- expectedStride local -> long
Comprehensive guide for developers continuing the migration:
- Decision tree for when to use long vs int
- 7 code patterns with before/after examples
- Valid exceptions (Span, managed arrays, complexity limits)
- What stays int (ndim, dimension indices, Slice)
- Checklist for each file migration
- Common error patterns and fixes
- File priority categories
- Quick reference table
This was referenced Apr 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

architecture Cross-cutting structural changes affecting multiple components core Internal engine: Shape, Storage, TensorEngine, iterators NumPy 2.x Compliance Aligns behavior with NumPy 2.x (NEPs, breaking changes)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Core] Migrate from int32 to int64 indexing (NumPy npy_intp alignment)

1 participant