numpy-ts 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/core/slicing.ts", "../src/core/dtype.ts", "../src/core/storage.ts", "../src/internal/compute.ts", "../src/ops/arithmetic.ts", "../src/core/broadcasting.ts", "../src/ops/comparison.ts", "../src/internal/indexing.ts", "../src/ops/reduction.ts", "../src/ops/shape.ts", "../src/ops/linalg.ts", "../src/ops/exponential.ts", "../src/ops/trig.ts", "../src/ops/hyperbolic.ts", "../src/ops/advanced.ts", "../src/ops/bitwise.ts", "../src/ops/sorting.ts", "../src/core/ndarray.ts", "../src/io/npy/format.ts", "../src/io/npy/parser.ts", "../src/io/npy/serializer.ts", "../src/io/zip/types.ts", "../src/io/zip/reader.ts", "../src/io/npz/parser.ts", "../src/io/zip/writer.ts", "../src/io/npz/serializer.ts"],
4
- "sourcesContent": ["/**\n * numpy-ts - Complete NumPy implementation for TypeScript and JavaScript\n *\n * @module numpy-ts\n */\n\n// Core array functions\nexport {\n NDArray,\n zeros,\n ones,\n array,\n arange,\n linspace,\n logspace,\n geomspace,\n eye,\n empty,\n full,\n identity,\n asarray,\n copy,\n zeros_like,\n ones_like,\n empty_like,\n full_like,\n // New array creation functions\n asanyarray,\n ascontiguousarray,\n asfortranarray,\n diag,\n diagflat,\n frombuffer,\n fromfile,\n fromfunction,\n fromiter,\n fromstring,\n meshgrid,\n tri,\n tril,\n triu,\n vander,\n // Math functions\n sqrt,\n power,\n absolute,\n negative,\n sign,\n mod,\n floor_divide,\n positive,\n reciprocal,\n cbrt,\n fabs,\n divmod,\n square,\n remainder,\n heaviside,\n dot,\n trace,\n diagonal,\n kron,\n transpose,\n inner,\n outer,\n tensordot,\n einsum,\n // Trigonometric functions\n sin,\n cos,\n tan,\n arcsin,\n arccos,\n arctan,\n arctan2,\n hypot,\n degrees,\n radians,\n deg2rad,\n rad2deg,\n // Hyperbolic functions\n sinh,\n cosh,\n tanh,\n arcsinh,\n arccosh,\n arctanh,\n // Array manipulation\n swapaxes,\n moveaxis,\n concatenate,\n stack,\n vstack,\n hstack,\n dstack,\n split,\n array_split,\n vsplit,\n hsplit,\n tile,\n repeat,\n // New array manipulation functions\n ravel,\n reshape,\n squeeze,\n expand_dims,\n flip,\n fliplr,\n flipud,\n rot90,\n roll,\n rollaxis,\n atleast_1d,\n atleast_2d,\n atleast_3d,\n dsplit,\n column_stack,\n row_stack,\n resize,\n append,\n delete_ as delete,\n insert,\n pad,\n // Advanced\n broadcast_to,\n broadcast_arrays,\n broadcast_shapes,\n take,\n put,\n choose,\n array_equal,\n array_equiv,\n // Indexing functions\n take_along_axis,\n put_along_axis,\n putmask,\n compress,\n select,\n place,\n diag_indices,\n diag_indices_from,\n tril_indices,\n tril_indices_from,\n triu_indices,\n triu_indices_from,\n mask_indices,\n indices,\n ix_,\n ravel_multi_index,\n unravel_index,\n // Reduction functions\n cumsum,\n cumprod,\n ptp,\n median,\n percentile,\n quantile,\n average,\n // NaN-aware reduction functions\n nansum,\n nanprod,\n nanmean,\n nanvar,\n nanstd,\n nanmin,\n nanmax,\n nanargmin,\n nanargmax,\n nancumsum,\n nancumprod,\n nanmedian,\n // Bitwise functions\n bitwise_and,\n bitwise_or,\n bitwise_xor,\n bitwise_not,\n invert,\n left_shift,\n right_shift,\n packbits,\n unpackbits,\n // Sorting functions\n sort,\n argsort,\n lexsort,\n partition,\n argpartition,\n sort_complex,\n // Searching functions\n nonzero,\n flatnonzero,\n where,\n searchsorted,\n extract,\n count_nonzero,\n} from './core/ndarray';\n\n// IO functions (environment-agnostic parsing/serialization)\n// These work with bytes (ArrayBuffer/Uint8Array), not files\nexport {\n // NPY format\n parseNpy,\n serializeNpy,\n parseNpyHeader,\n parseNpyData,\n UnsupportedDTypeError,\n InvalidNpyError,\n SUPPORTED_DTYPES,\n DTYPE_TO_DESCR,\n type NpyHeader,\n type NpyMetadata,\n type NpyVersion,\n // NPZ format\n parseNpz,\n parseNpzSync,\n loadNpz,\n loadNpzSync,\n serializeNpz,\n serializeNpzSync,\n type NpzParseOptions,\n type NpzParseResult,\n type NpzSerializeOptions,\n} from './io';\n\n// Version (replaced at build time from package.json)\n// In development/tests, use package.json directly; in production, use the replaced value\ndeclare const __VERSION_PLACEHOLDER__: string;\nexport const __version__ =\n typeof __VERSION_PLACEHOLDER__ !== 'undefined' ? __VERSION_PLACEHOLDER__ : '0.8.0'; // Fallback for development/tests\n", "/**\n * Slicing utilities for NumPy-compatible array indexing\n *\n * Supports Python-style slice syntax via strings: \"0:5\", \":\", \"::2\", \"-1\"\n */\n\n/**\n * Represents a parsed slice specification\n */\nexport interface SliceSpec {\n start: number | null;\n stop: number | null;\n step: number;\n isIndex: boolean; // true if this is a single index, not a slice\n}\n\n/**\n * Parse a slice string into a SliceSpec\n *\n * Supports:\n * - Single index: \"5\", \"-1\"\n * - Full slice: \"0:5\", \"2:8\"\n * - With step: \"0:10:2\", \"::2\"\n * - Partial: \"5:\", \":10\", \":\"\n * - Negative: \"-5:\", \":-2\", \"::-1\"\n *\n * @param sliceStr - String representation of slice (e.g., \"0:5\", \":\", \"::2\")\n * @returns Parsed slice specification\n *\n * @example\n * ```typescript\n * parseSlice(\"0:5\") // {start: 0, stop: 5, step: 1, isIndex: false}\n * parseSlice(\":\") // {start: null, stop: null, step: 1, isIndex: false}\n * parseSlice(\"::2\") // {start: null, stop: null, step: 2, isIndex: false}\n * parseSlice(\"-1\") // {start: -1, stop: null, step: 1, isIndex: true}\n * parseSlice(\"5\") // {start: 5, stop: null, step: 1, isIndex: true}\n * ```\n */\nexport function parseSlice(sliceStr: string): SliceSpec {\n // Check if it's a single index (no colons)\n if (!sliceStr.includes(':')) {\n // Reject decimal points - indices must be integers\n if (sliceStr.includes('.')) {\n throw new Error(`Invalid slice index: \"${sliceStr}\" (must be integer)`);\n }\n const index = parseInt(sliceStr, 10);\n if (isNaN(index)) {\n throw new Error(`Invalid slice index: \"${sliceStr}\"`);\n }\n return {\n start: index,\n stop: null,\n step: 1,\n isIndex: true,\n };\n }\n\n // Parse slice notation: start:stop:step\n const parts = sliceStr.split(':');\n\n if (parts.length > 3) {\n throw new Error(`Invalid slice notation: \"${sliceStr}\" (too many colons)`);\n }\n\n const start = parts[0] === '' ? null : parseInt(parts[0]!, 10);\n const stop = parts[1] === '' || parts[1] === undefined ? null : parseInt(parts[1], 10);\n const step = parts[2] === '' || parts[2] === undefined ? 1 : parseInt(parts[2], 10);\n\n // Validate parsed values\n if (start !== null && isNaN(start)) {\n throw new Error(`Invalid start index in slice: \"${sliceStr}\"`);\n }\n if (stop !== null && isNaN(stop)) {\n throw new Error(`Invalid stop index in slice: \"${sliceStr}\"`);\n }\n if (isNaN(step)) {\n throw new Error(`Invalid step in slice: \"${sliceStr}\"`);\n }\n if (step === 0) {\n throw new Error(`Slice step cannot be zero`);\n }\n\n return {\n start,\n stop,\n step,\n isIndex: false,\n };\n}\n\n/**\n * Normalize a slice specification to absolute indices\n *\n * Handles negative indices and defaults:\n * - Negative indices count from the end\n * - null start becomes 0 (or size-1 for negative step)\n * - null stop becomes size (or -1 for negative step)\n *\n * @param spec - Parsed slice specification\n * @param size - Size of the dimension being sliced\n * @returns Normalized slice with absolute start, stop, step\n *\n * @example\n * ```typescript\n * normalizeSlice({start: -1, stop: null, step: 1, isIndex: true}, 10)\n * // {start: 9, stop: 10, step: 1, isIndex: true}\n *\n * normalizeSlice({start: null, stop: -2, step: 1, isIndex: false}, 10)\n * // {start: 0, stop: 8, step: 1, isIndex: false}\n * ```\n */\nexport function normalizeSlice(\n spec: SliceSpec,\n size: number\n): { start: number; stop: number; step: number; isIndex: boolean } {\n let { start, stop } = spec;\n const { step, isIndex } = spec;\n\n // For single index, normalize and return\n if (isIndex) {\n if (start === null) {\n throw new Error('Index cannot be null');\n }\n const normalizedStart = start < 0 ? size + start : start;\n if (normalizedStart < 0 || normalizedStart >= size) {\n throw new Error(`Index ${start} is out of bounds for size ${size}`);\n }\n return {\n start: normalizedStart,\n stop: normalizedStart + 1,\n step: 1,\n isIndex: true,\n };\n }\n\n // Handle slice defaults based on step direction\n if (step > 0) {\n // Forward slice\n if (start === null) start = 0;\n if (stop === null) stop = size;\n } else {\n // Backward slice\n if (start === null) start = size - 1;\n if (stop === null) stop = -size - 1; // Will be normalized to before start\n }\n\n // Normalize negative indices\n if (start < 0) start = size + start;\n if (stop < 0) stop = size + stop;\n\n // Clamp to valid range\n start = Math.max(0, Math.min(start, size));\n stop = Math.max(-1, Math.min(stop, size)); // -1 allowed for backward slices\n\n return {\n start,\n stop,\n step,\n isIndex: false,\n };\n}\n\n/**\n * Compute the length of a slice result\n *\n * @param start - Normalized start index\n * @param stop - Normalized stop index\n * @param step - Step value\n * @returns Number of elements in the slice\n */\nexport function computeSliceLength(start: number, stop: number, step: number): number {\n if (step > 0) {\n if (start >= stop) return 0;\n return Math.ceil((stop - start) / step);\n } else {\n if (start <= stop) return 0;\n return Math.ceil((start - stop) / -step);\n }\n}\n\n/**\n * Parse multiple slice specifications for multi-dimensional indexing\n *\n * @param sliceStrs - Array of slice strings, one per dimension\n * @returns Array of parsed slice specifications\n *\n * @example\n * ```typescript\n * parseSlices([\"0:5\", \":\", \"::2\"])\n * // [\n * // {start: 0, stop: 5, step: 1, isIndex: false},\n * // {start: null, stop: null, step: 1, isIndex: false},\n * // {start: null, stop: null, step: 2, isIndex: false}\n * // ]\n * ```\n */\nexport function parseSlices(sliceStrs: string[]): SliceSpec[] {\n return sliceStrs.map((s) => parseSlice(s));\n}\n", "/**\n * DType (Data Type) system for numpy-ts\n *\n * Supports NumPy numeric types:\n * - Floating point: float32, float64\n * - Signed integers: int8, int16, int32, int64\n * - Unsigned integers: uint8, uint16, uint32, uint64\n * - Boolean: bool\n */\n\n/**\n * All supported dtypes\n */\nexport type DType =\n | 'float64'\n | 'float32'\n | 'int64'\n | 'int32'\n | 'int16'\n | 'int8'\n | 'uint64'\n | 'uint32'\n | 'uint16'\n | 'uint8'\n | 'bool';\n\n/**\n * TypedArray types for each dtype\n */\nexport type TypedArray =\n | Float64Array\n | Float32Array\n | BigInt64Array\n | Int32Array\n | Int16Array\n | Int8Array\n | BigUint64Array\n | Uint32Array\n | Uint16Array\n | Uint8Array;\n\n/**\n * Default dtype (matches NumPy)\n */\nexport const DEFAULT_DTYPE: DType = 'float64';\n\n/**\n * Get the TypedArray constructor for a given dtype\n */\nexport function getTypedArrayConstructor(dtype: DType): TypedArrayConstructor | null {\n switch (dtype) {\n case 'float64':\n return Float64Array;\n case 'float32':\n return Float32Array;\n case 'int64':\n return BigInt64Array;\n case 'int32':\n return Int32Array;\n case 'int16':\n return Int16Array;\n case 'int8':\n return Int8Array;\n case 'uint64':\n return BigUint64Array;\n case 'uint32':\n return Uint32Array;\n case 'uint16':\n return Uint16Array;\n case 'uint8':\n return Uint8Array;\n case 'bool':\n return Uint8Array; // bool is stored as uint8\n default:\n throw new Error(`Unknown dtype: ${dtype}`);\n }\n}\n\ntype TypedArrayConstructor =\n | Float64ArrayConstructor\n | Float32ArrayConstructor\n | BigInt64ArrayConstructor\n | Int32ArrayConstructor\n | Int16ArrayConstructor\n | Int8ArrayConstructor\n | BigUint64ArrayConstructor\n | Uint32ArrayConstructor\n | Uint16ArrayConstructor\n | Uint8ArrayConstructor;\n\n/**\n * Get the element size in bytes for a given dtype\n */\nexport function getDTypeSize(dtype: DType): number {\n switch (dtype) {\n case 'float64':\n case 'int64':\n case 'uint64':\n return 8;\n case 'float32':\n case 'int32':\n case 'uint32':\n return 4;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int8':\n case 'uint8':\n case 'bool':\n return 1;\n default:\n throw new Error(`Unknown dtype: ${dtype}`);\n }\n}\n\n/**\n * Check if dtype is integer\n */\nexport function isIntegerDType(dtype: DType): boolean {\n return (\n dtype === 'int64' ||\n dtype === 'int32' ||\n dtype === 'int16' ||\n dtype === 'int8' ||\n dtype === 'uint64' ||\n dtype === 'uint32' ||\n dtype === 'uint16' ||\n dtype === 'uint8'\n );\n}\n\n/**\n * Check if dtype is floating point\n */\nexport function isFloatDType(dtype: DType): boolean {\n return dtype === 'float64' || dtype === 'float32';\n}\n\n/**\n * Check if dtype uses BigInt\n */\nexport function isBigIntDType(dtype: DType): boolean {\n return dtype === 'int64' || dtype === 'uint64';\n}\n\n/**\n * Infer dtype from JavaScript value\n */\nexport function inferDType(value: unknown): DType {\n if (typeof value === 'bigint') {\n return 'int64';\n } else if (typeof value === 'number') {\n // Check if integer\n if (Number.isInteger(value)) {\n // Choose appropriate integer type based on range\n if (value >= 0 && value <= 255) return 'uint8';\n if (value >= -128 && value <= 127) return 'int8';\n if (value >= 0 && value <= 65535) return 'uint16';\n if (value >= -32768 && value <= 32767) return 'int16';\n if (value >= 0 && value <= 4294967295) return 'uint32';\n if (value >= -2147483648 && value <= 2147483647) return 'int32';\n return 'float64'; // Fallback for large integers\n }\n return 'float64';\n } else if (typeof value === 'boolean') {\n return 'bool';\n }\n return DEFAULT_DTYPE;\n}\n\n/**\n * Promote two dtypes to a common dtype\n * Follows NumPy's type promotion rules\n */\nexport function promoteDTypes(dtype1: DType, dtype2: DType): DType {\n // Same dtype\n if (dtype1 === dtype2) return dtype1;\n\n // Boolean - promote to the other type\n if (dtype1 === 'bool') return dtype2;\n if (dtype2 === 'bool') return dtype1;\n\n // Float types - integer + float always promotes to float\n if (isFloatDType(dtype1) || isFloatDType(dtype2)) {\n // NumPy behavior: Promote to the float type\n // float64 always wins\n if (dtype1 === 'float64' || dtype2 === 'float64') return 'float64';\n\n // float32 with small integers (8, 16 bit) \u2192 float32\n // float32 with large integers (32, 64 bit) \u2192 float64 (precision safety)\n // This is because float32 has 24-bit mantissa, can't hold all int32 values\n if (dtype1 === 'float32') {\n const intDtype = dtype2;\n if (\n intDtype === 'int32' ||\n intDtype === 'int64' ||\n intDtype === 'uint32' ||\n intDtype === 'uint64'\n ) {\n return 'float64';\n }\n return 'float32';\n }\n if (dtype2 === 'float32') {\n const intDtype = dtype1;\n if (\n intDtype === 'int32' ||\n intDtype === 'int64' ||\n intDtype === 'uint32' ||\n intDtype === 'uint64'\n ) {\n return 'float64';\n }\n return 'float32';\n }\n\n // Both are float32\n return 'float32';\n }\n\n // Integer types - complex promotion rules\n const isSigned1 = dtype1.startsWith('int');\n const isSigned2 = dtype2.startsWith('int');\n const isUnsigned1 = dtype1.startsWith('uint');\n const isUnsigned2 = dtype2.startsWith('uint');\n\n // Get bit sizes\n const getSize = (dtype: DType): number => {\n if (dtype.includes('64')) return 64;\n if (dtype.includes('32')) return 32;\n if (dtype.includes('16')) return 16;\n if (dtype.includes('8')) return 8;\n return 0;\n };\n\n const size1 = getSize(dtype1);\n const size2 = getSize(dtype2);\n\n // Special case: int64 + uint64 \u2192 float64 (no larger int type available)\n if ((dtype1 === 'int64' && dtype2 === 'uint64') || (dtype1 === 'uint64' && dtype2 === 'int64')) {\n return 'float64';\n }\n\n // Mixing signed and unsigned of the same size: promote to larger signed type\n if (isSigned1 && isUnsigned2 && size1 === size2) {\n if (size1 === 8) return 'int16';\n if (size1 === 16) return 'int32';\n if (size1 === 32) return 'int64';\n }\n if (isUnsigned1 && isSigned2 && size1 === size2) {\n if (size2 === 8) return 'int16';\n if (size2 === 16) return 'int32';\n if (size2 === 32) return 'int64';\n }\n\n // Same signedness: promote to larger size\n if ((isSigned1 && isSigned2) || (isUnsigned1 && isUnsigned2)) {\n const maxSize = Math.max(size1, size2);\n if (isSigned1) {\n if (maxSize === 64) return 'int64';\n if (maxSize === 32) return 'int32';\n if (maxSize === 16) return 'int16';\n return 'int8';\n } else {\n if (maxSize === 64) return 'uint64';\n if (maxSize === 32) return 'uint32';\n if (maxSize === 16) return 'uint16';\n return 'uint8';\n }\n }\n\n // Different signedness, different sizes: promote to type that can hold both\n // NumPy behavior: If signed type is larger, use it; otherwise promote conservatively\n\n // If signed int is larger than unsigned int, signed int can hold unsigned\n if (isSigned1 && isUnsigned2) {\n if (size1 > size2) {\n // e.g., int16 + uint8 \u2192 int16, int32 + uint16 \u2192 int32\n return dtype1;\n }\n // Otherwise need larger signed type\n // e.g., int8 + uint16 \u2192 int32\n if (size2 === 8) return 'int16';\n if (size2 === 16) return 'int32';\n if (size2 === 32) return 'int64';\n return 'float64'; // uint64 with smaller signed \u2192 float64\n }\n\n if (isUnsigned1 && isSigned2) {\n if (size2 > size1) {\n // e.g., uint8 + int16 \u2192 int16, uint16 + int32 \u2192 int32\n return dtype2;\n }\n // Otherwise need larger signed type\n // e.g., uint16 + int8 \u2192 int32\n if (size1 === 8) return 'int16';\n if (size1 === 16) return 'int32';\n if (size1 === 32) return 'int64';\n return 'float64'; // uint64 with smaller signed \u2192 float64\n }\n\n // Fallback (shouldn't reach here if logic above is complete)\n return 'float64';\n}\n\n/**\n * Validate dtype string\n */\nexport function isValidDType(dtype: string): dtype is DType {\n const validDTypes: DType[] = [\n 'float64',\n 'float32',\n 'int64',\n 'int32',\n 'int16',\n 'int8',\n 'uint64',\n 'uint32',\n 'uint16',\n 'uint8',\n 'bool',\n ];\n return validDTypes.includes(dtype as DType);\n}\n\n/**\n * Convert value to the appropriate type for the given dtype\n */\nexport function castValue(value: number | bigint | boolean, dtype: DType): number | bigint {\n if (isBigIntDType(dtype)) {\n return BigInt(value as number | bigint);\n }\n if (dtype === 'bool') {\n return value ? 1 : 0;\n }\n return Number(value);\n}\n\n/**\n * Map our dtype to @stdlib's supported dtype\n * @stdlib doesn't support int64, uint64 natively, but does support bool\n */\nexport function toStdlibDType(dtype: DType): string {\n // Map int64/uint64 to generic (we manage the BigInt arrays ourselves)\n if (dtype === 'int64' || dtype === 'uint64') {\n return 'generic';\n }\n // All other dtypes (including bool) are supported by stdlib\n return dtype;\n}\n", "/**\n * ArrayStorage - Internal storage abstraction\n *\n * Stores array data directly using TypedArrays without external dependencies.\n *\n * @internal - This is not part of the public API\n */\n\nimport {\n type DType,\n type TypedArray,\n DEFAULT_DTYPE,\n getTypedArrayConstructor,\n isBigIntDType,\n} from './dtype';\n\n/**\n * Internal storage for NDArray data\n * Manages the underlying TypedArray and metadata\n */\nexport class ArrayStorage {\n // Underlying TypedArray data buffer\n private _data: TypedArray;\n // Array shape\n private _shape: readonly number[];\n // Strides for each dimension\n private _strides: readonly number[];\n // Offset into the data buffer\n private _offset: number;\n // Data type\n private _dtype: DType;\n\n constructor(\n data: TypedArray,\n shape: readonly number[],\n strides: readonly number[],\n offset: number,\n dtype: DType\n ) {\n this._data = data;\n this._shape = shape;\n this._strides = strides;\n this._offset = offset;\n this._dtype = dtype;\n }\n\n /**\n * Shape of the array\n */\n get shape(): readonly number[] {\n return this._shape;\n }\n\n /**\n * Number of dimensions\n */\n get ndim(): number {\n return this._shape.length;\n }\n\n /**\n * Total number of elements\n */\n get size(): number {\n return this._shape.reduce((a, b) => a * b, 1);\n }\n\n /**\n * Data type\n */\n get dtype(): DType {\n return this._dtype;\n }\n\n /**\n * Underlying data buffer\n */\n get data(): TypedArray {\n return this._data;\n }\n\n /**\n * Strides (steps in each dimension)\n */\n get strides(): readonly number[] {\n return this._strides;\n }\n\n /**\n * Offset into the data buffer\n */\n get offset(): number {\n return this._offset;\n }\n\n /**\n * Check if array is C-contiguous (row-major, no gaps)\n */\n get isCContiguous(): boolean {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) return true;\n if (ndim === 1) return strides[0] === 1;\n\n // Check if strides match row-major order\n let expectedStride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n if (strides[i] !== expectedStride) return false;\n expectedStride *= shape[i]!;\n }\n return true;\n }\n\n /**\n * Check if array is F-contiguous (column-major, no gaps)\n */\n get isFContiguous(): boolean {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) return true;\n if (ndim === 1) return strides[0] === 1;\n\n // Check if strides match column-major order\n let expectedStride = 1;\n for (let i = 0; i < ndim; i++) {\n if (strides[i] !== expectedStride) return false;\n expectedStride *= shape[i]!;\n }\n return true;\n }\n\n /**\n * Get element at linear index (respects strides and offset)\n */\n iget(linearIndex: number): number | bigint {\n // Convert linear index to multi-index, then to actual buffer position\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) {\n return this._data[this._offset]!;\n }\n\n // Convert linear index to multi-index in row-major order\n let remaining = linearIndex;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < ndim; i++) {\n // Compute size of remaining dimensions\n let dimSize = 1;\n for (let j = i + 1; j < ndim; j++) {\n dimSize *= shape[j]!;\n }\n const idx = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n bufferIndex += idx * strides[i]!;\n }\n\n return this._data[bufferIndex]!;\n }\n\n /**\n * Set element at linear index (respects strides and offset)\n */\n iset(linearIndex: number, value: number | bigint): void {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) {\n (this._data as unknown as (number | bigint)[])[this._offset] = value;\n return;\n }\n\n let remaining = linearIndex;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < ndim; i++) {\n let dimSize = 1;\n for (let j = i + 1; j < ndim; j++) {\n dimSize *= shape[j]!;\n }\n const idx = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n bufferIndex += idx * strides[i]!;\n }\n\n (this._data as unknown as (number | bigint)[])[bufferIndex] = value;\n }\n\n /**\n * Get element at multi-index position\n */\n get(...indices: number[]): number | bigint {\n const strides = this._strides;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < indices.length; i++) {\n bufferIndex += indices[i]! * strides[i]!;\n }\n\n return this._data[bufferIndex]!;\n }\n\n /**\n * Set element at multi-index position\n */\n set(indices: number[], value: number | bigint): void {\n const strides = this._strides;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < indices.length; i++) {\n bufferIndex += indices[i]! * strides[i]!;\n }\n\n (this._data as unknown as (number | bigint)[])[bufferIndex] = value;\n }\n\n /**\n * Create a deep copy of this storage\n */\n copy(): ArrayStorage {\n const shape = Array.from(this._shape);\n const dtype = this._dtype;\n const size = this.size;\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot copy array with dtype ${dtype}`);\n }\n\n // Create new data buffer and copy\n const newData = new Constructor(size);\n\n if (this.isCContiguous && this._offset === 0) {\n // Fast path: direct copy\n if (isBigIntDType(dtype)) {\n const src = this._data as BigInt64Array | BigUint64Array;\n const dst = newData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n dst[i] = src[i]!;\n }\n } else {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>).set(\n this._data as Exclude<TypedArray, BigInt64Array | BigUint64Array>\n );\n }\n } else {\n // Slow path: respect strides\n if (isBigIntDType(dtype)) {\n const dst = newData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n dst[i] = this.iget(i) as bigint;\n }\n } else {\n for (let i = 0; i < size; i++) {\n newData[i] = this.iget(i) as number;\n }\n }\n }\n\n return new ArrayStorage(newData, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Create storage from TypedArray data\n */\n static fromData(\n data: TypedArray,\n shape: number[],\n dtype: DType,\n strides?: number[],\n offset?: number\n ): ArrayStorage {\n const finalStrides = strides ?? ArrayStorage._computeStrides(shape);\n const finalOffset = offset ?? 0;\n return new ArrayStorage(data, shape, finalStrides, finalOffset, dtype);\n }\n\n /**\n * Create storage with zeros\n */\n static zeros(shape: number[], dtype: DType = DEFAULT_DTYPE): ArrayStorage {\n const size = shape.reduce((a, b) => a * b, 1);\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n\n const data = new Constructor(size);\n\n return new ArrayStorage(data, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Create storage with ones\n */\n static ones(shape: number[], dtype: DType = DEFAULT_DTYPE): ArrayStorage {\n const size = shape.reduce((a, b) => a * b, 1);\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n\n const data = new Constructor(size);\n\n // Fill with ones using native fill (much faster than loop)\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array).fill(BigInt(1));\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(1);\n }\n\n return new ArrayStorage(data, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Compute strides for row-major (C-order) layout\n * @private\n */\n private static _computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n }\n}\n\n/**\n * Compute strides for a given shape (row-major order)\n * @internal\n */\nexport function computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * Computation backend abstraction\n *\n * Internal module for element-wise and broadcast operations.\n * Provides a swappable backend for different computation strategies.\n *\n * @internal\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { promoteDTypes, isBigIntDType } from '../core/dtype';\n\n/**\n * Compute the broadcast shape of two arrays\n * Returns the shape that results from broadcasting a and b together\n * Throws if shapes are not compatible for broadcasting\n */\nexport function broadcastShapes(shapeA: readonly number[], shapeB: readonly number[]): number[] {\n const ndimA = shapeA.length;\n const ndimB = shapeB.length;\n const ndim = Math.max(ndimA, ndimB);\n const result = new Array(ndim);\n\n for (let i = 0; i < ndim; i++) {\n const dimA = i < ndim - ndimA ? 1 : shapeA[i - (ndim - ndimA)]!;\n const dimB = i < ndim - ndimB ? 1 : shapeB[i - (ndim - ndimB)]!;\n\n if (dimA === dimB) {\n result[i] = dimA;\n } else if (dimA === 1) {\n result[i] = dimB;\n } else if (dimB === 1) {\n result[i] = dimA;\n } else {\n throw new Error(\n `operands could not be broadcast together with shapes ${JSON.stringify(Array.from(shapeA))} ${JSON.stringify(Array.from(shapeB))}`\n );\n }\n }\n\n return result;\n}\n\n/**\n * Compute the strides for broadcasting an array to a target shape\n * Returns strides where dimensions that need broadcasting have stride 0\n */\nfunction broadcastStrides(\n shape: readonly number[],\n strides: readonly number[],\n targetShape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n const result = new Array(targetNdim).fill(0);\n\n // Align dimensions from the right\n for (let i = 0; i < ndim; i++) {\n const targetIdx = targetNdim - ndim + i;\n const dim = shape[i]!;\n const targetDim = targetShape[targetIdx]!;\n\n if (dim === targetDim) {\n // Same size, use original stride\n result[targetIdx] = strides[i]!;\n } else if (dim === 1) {\n // Broadcasting, stride is 0 (repeat along this dimension)\n result[targetIdx] = 0;\n } else {\n // This shouldn't happen if shapes were validated\n throw new Error('Invalid broadcast');\n }\n }\n\n return result;\n}\n\n/**\n * Create a broadcast view of an ArrayStorage\n * The returned storage shares data with the original but has different shape/strides\n */\nfunction broadcastTo(storage: ArrayStorage, targetShape: readonly number[]): ArrayStorage {\n const broadcastedStrides = broadcastStrides(storage.shape, storage.strides, targetShape);\n return ArrayStorage.fromData(\n storage.data,\n Array.from(targetShape),\n storage.dtype,\n broadcastedStrides,\n storage.offset\n );\n}\n\n/**\n * Perform element-wise operation with broadcasting\n *\n * NOTE: This is the slow path for broadcasting/non-contiguous arrays.\n * Fast paths for contiguous arrays are implemented directly in ops/arithmetic.ts\n *\n * @param a - First array storage\n * @param b - Second array storage\n * @param op - Operation to perform (a, b) => result\n * @param opName - Name of operation (for special handling)\n * @returns Result storage\n */\nexport function elementwiseBinaryOp(\n a: ArrayStorage,\n b: ArrayStorage,\n op: (a: number, b: number) => number,\n opName: string\n): ArrayStorage {\n // Compute broadcast shape\n const outputShape = broadcastShapes(a.shape, b.shape);\n\n // Create broadcast views\n const aBroadcast = broadcastTo(a, outputShape);\n const bBroadcast = broadcastTo(b, outputShape);\n\n // Determine output dtype using NumPy promotion rules\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n const resultData = result.data;\n const size = result.size;\n\n if (isBigIntDType(resultDtype)) {\n // BigInt arithmetic - no precision loss\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert to BigInt - handle case where value is already BigInt\n const aVal = typeof aRaw === 'bigint' ? aRaw : BigInt(Math.round(aRaw));\n const bVal = typeof bRaw === 'bigint' ? bRaw : BigInt(Math.round(bRaw));\n\n // Use BigInt operations\n if (opName === 'add') {\n resultTyped[i] = aVal + bVal;\n } else if (opName === 'subtract') {\n resultTyped[i] = aVal - bVal;\n } else if (opName === 'multiply') {\n resultTyped[i] = aVal * bVal;\n } else if (opName === 'divide') {\n resultTyped[i] = aVal / bVal;\n } else {\n resultTyped[i] = BigInt(Math.round(op(Number(aVal), Number(bVal))));\n }\n }\n } else {\n // Regular numeric types (including float dtypes)\n // Need to convert BigInt values to Number if mixing dtypes\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert to Number if needed (handles BigInt \u2192 float promotion)\n const aVal = needsConversion && typeof aRaw === 'bigint' ? Number(aRaw) : Number(aRaw);\n const bVal = needsConversion && typeof bRaw === 'bigint' ? Number(bRaw) : Number(bRaw);\n\n resultData[i] = op(aVal, bVal);\n }\n }\n\n return result;\n}\n\n/**\n * Perform element-wise comparison with broadcasting\n * Returns boolean array (dtype: 'bool', stored as Uint8Array)\n */\nexport function elementwiseComparisonOp(\n a: ArrayStorage,\n b: ArrayStorage,\n op: (a: number, b: number) => boolean\n): ArrayStorage {\n // Compute broadcast shape\n const outputShape = broadcastShapes(a.shape, b.shape);\n\n // Create broadcast views\n const aBroadcast = broadcastTo(a, outputShape);\n const bBroadcast = broadcastTo(b, outputShape);\n\n // Get output shape\n const size = outputShape.reduce((a, b) => a * b, 1);\n\n // Create result array with bool dtype\n const resultData = new Uint8Array(size);\n\n // Check if we need to convert BigInt to Number for comparison\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n // Perform element-wise comparison\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert BigInt to Number if needed\n const aVal = needsConversion && typeof aRaw === 'bigint' ? Number(aRaw) : Number(aRaw);\n const bVal = needsConversion && typeof bRaw === 'bigint' ? Number(bRaw) : Number(bRaw);\n\n resultData[i] = op(aVal, bVal) ? 1 : 0;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'bool');\n}\n\n/**\n * Perform element-wise unary operation\n *\n * @param a - Input array storage\n * @param op - Operation to perform (x) => result\n * @param preserveDtype - If true, preserve input dtype; if false, promote to float64 (default: true)\n * @returns Result storage\n */\nexport function elementwiseUnaryOp(\n a: ArrayStorage,\n op: (x: number) => number,\n preserveDtype = true\n): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const size = a.size;\n\n // Determine output dtype\n // Math operations like sqrt may need float output even for integer input\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = preserveDtype ? dtype : isIntegerType ? 'float64' : dtype;\n\n // Create result storage\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n const inputData = a.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt input - convert to Number for operation, then convert back if preserving dtype\n if (isBigIntDType(resultDtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = Number(inputData[i]!);\n resultTyped[i] = BigInt(Math.round(op(val)));\n }\n } else {\n // BigInt input, float output\n for (let i = 0; i < size; i++) {\n resultData[i] = op(Number(inputData[i]!));\n }\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = op(Number(inputData[i]!));\n }\n }\n\n return result;\n}\n", "/**\n * Arithmetic operations\n *\n * Pure functions for element-wise arithmetic operations:\n * add, subtract, multiply, divide\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, promoteDTypes } from '../core/dtype';\nimport { elementwiseBinaryOp } from '../internal/compute';\n\n/**\n * Helper: Check if two arrays can use the fast path\n * (both C-contiguous with same shape, no broadcasting needed)\n */\nfunction canUseFastPath(a: ArrayStorage, b: ArrayStorage): boolean {\n return (\n a.isCContiguous &&\n b.isCContiguous &&\n a.shape.length === b.shape.length &&\n a.shape.every((dim, i) => dim === b.shape[i])\n );\n}\n\n/**\n * Add two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function add(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return addScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return addArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x + y, 'add');\n}\n\n/**\n * Fast path for adding two contiguous arrays\n * @private\n */\nfunction addArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) + (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! + bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal + bVal;\n }\n } else {\n // Pure numeric operations - fully optimizable\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) + (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Subtract two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function subtract(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return subtractScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return subtractArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x - y, 'subtract');\n}\n\n/**\n * Fast path for subtracting two contiguous arrays\n * @private\n */\nfunction subtractArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) - (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! - bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal - bVal;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) - (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Multiply two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function multiply(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return multiplyScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return multiplyArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x * y, 'multiply');\n}\n\n/**\n * Fast path for multiplying two contiguous arrays\n * @private\n */\nfunction multiplyArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) * (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! * bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal * bVal;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) * (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Divide two arrays or array and scalar\n *\n * NumPy behavior: Integer division always promotes to float\n * Type promotion rules:\n * - float64 + anything \u2192 float64\n * - float32 + integer \u2192 float32\n * - integer + integer \u2192 float64\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage with promoted float dtype\n */\nexport function divide(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return divideScalar(a, b);\n }\n\n // Determine result dtype using NumPy promotion rules\n const aIsFloat64 = a.dtype === 'float64';\n const bIsFloat64 = b.dtype === 'float64';\n const aIsFloat32 = a.dtype === 'float32';\n const bIsFloat32 = b.dtype === 'float32';\n\n // If either is float64, result is float64\n if (aIsFloat64 || bIsFloat64) {\n const aFloat = aIsFloat64 ? a : convertToFloatDType(a, 'float64');\n const bFloat = bIsFloat64 ? b : convertToFloatDType(b, 'float64');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n }\n\n // If either is float32, result is float32\n if (aIsFloat32 || bIsFloat32) {\n const aFloat = aIsFloat32 ? a : convertToFloatDType(a, 'float32');\n const bFloat = bIsFloat32 ? b : convertToFloatDType(b, 'float32');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n }\n\n // Both are integers, promote to float64\n const aFloat = convertToFloatDType(a, 'float64');\n const bFloat = convertToFloatDType(b, 'float64');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n}\n\n/**\n * Convert ArrayStorage to float dtype\n * @private\n */\nfunction convertToFloatDType(\n storage: ArrayStorage,\n targetDtype: 'float32' | 'float64'\n): ArrayStorage {\n const result = ArrayStorage.zeros(Array.from(storage.shape), targetDtype);\n const size = storage.size;\n const srcData = storage.data;\n const dstData = result.data;\n\n for (let i = 0; i < size; i++) {\n dstData[i] = Number(srcData[i]!);\n }\n\n return result;\n}\n\n/**\n * Add scalar to array (optimized path)\n * @private\n */\nfunction addScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! + scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) + scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Subtract scalar from array (optimized path)\n * @private\n */\nfunction subtractScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! - scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) - scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Multiply array by scalar (optimized path)\n * @private\n */\nfunction multiplyScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! * scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) * scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Divide array by scalar (optimized path)\n * NumPy behavior: Integer division promotes to float64\n * @private\n */\nfunction divideScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: Integer division always promotes to float64\n // This allows representing inf/nan for division by zero\n // Bool is also promoted to float64 (NumPy behavior)\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n // Create result with promoted dtype\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // Convert BigInt to Number for division (promotes to float64)\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) / scalar;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) / scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Absolute value of each element\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with absolute values\n */\nexport function absolute(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n resultTyped[i] = val < 0n ? -val : val;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.abs(Number(data[i]!));\n }\n }\n\n return result;\n}\n\n/**\n * Numerical negative (element-wise negation)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with negated values\n */\nexport function negative(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = -thisTyped[i]!;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = -Number(data[i]!);\n }\n }\n\n return result;\n}\n\n/**\n * Sign of each element (-1, 0, or 1)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with signs\n */\nexport function sign(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n resultTyped[i] = val > 0n ? 1n : val < 0n ? -1n : 0n;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n resultData[i] = val > 0 ? 1 : val < 0 ? -1 : 0;\n }\n }\n\n return result;\n}\n\n/**\n * Modulo operation (remainder after division)\n * NumPy behavior: Uses floor modulo (sign follows divisor), not JavaScript's truncate modulo\n * Preserves dtype for integer types\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with modulo values\n */\nexport function mod(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return modScalar(a, b);\n }\n // NumPy uses floor modulo: ((x % y) + y) % y for proper sign handling\n return elementwiseBinaryOp(a, b, (x, y) => ((x % y) + y) % y, 'mod');\n}\n\n/**\n * Modulo with scalar divisor (optimized path)\n * NumPy uses floor modulo: result has same sign as divisor\n * @private\n */\nfunction modScalar(storage: ArrayStorage, divisor: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - use floor modulo\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const divisorBig = BigInt(Math.round(divisor));\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n // Floor modulo for BigInt\n resultTyped[i] = ((val % divisorBig) + divisorBig) % divisorBig;\n }\n } else {\n // Regular numeric types - use floor modulo\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n // Floor modulo: ((x % y) + y) % y\n resultData[i] = ((val % divisor) + divisor) % divisor;\n }\n }\n\n return result;\n}\n\n/**\n * Floor division (division with result rounded down)\n * NumPy behavior: Preserves integer types\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with floor division values\n */\nexport function floorDivide(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return floorDivideScalar(a, b);\n }\n return elementwiseBinaryOp(a, b, (x, y) => Math.floor(x / y), 'floor_divide');\n}\n\n/**\n * Floor division with scalar divisor (optimized path)\n * @private\n */\nfunction floorDivideScalar(storage: ArrayStorage, divisor: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: floor_divide preserves integer types\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt floor division\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const divisorBig = BigInt(Math.round(divisor));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! / divisorBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.floor(Number(data[i]!) / divisor);\n }\n }\n\n return result;\n}\n\n/**\n * Unary positive (returns a copy of the array)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage (copy of input)\n */\nexport function positive(a: ArrayStorage): ArrayStorage {\n // Positive is essentially a no-op that returns a copy\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n // Copy data\n for (let i = 0; i < size; i++) {\n resultData[i] = data[i]!;\n }\n\n return result;\n}\n\n/**\n * Reciprocal (1/x) of each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with reciprocal values\n */\nexport function reciprocal(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // NumPy behavior: reciprocal always promotes integers to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt input promotes to float64\n for (let i = 0; i < size; i++) {\n resultData[i] = 1.0 / Number(data[i]!);\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = 1.0 / Number(data[i]!);\n }\n }\n\n return result;\n}\n\n/**\n * Cube root of each element\n * NumPy behavior: Promotes integer types to float64\n *\n * @param a - Input array storage\n * @returns Result storage with cube root values\n */\nexport function cbrt(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // NumPy behavior: cbrt always promotes integers to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n // Handle all types uniformly - convert to number and apply Math.cbrt\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.cbrt(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Absolute value of each element, returning float\n * NumPy behavior: fabs always returns floating point\n *\n * @param a - Input array storage\n * @returns Result storage with absolute values as float\n */\nexport function fabs(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // fabs always returns float64, except for float32 which stays float32\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n // Handle all types uniformly\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.abs(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Returns both quotient and remainder (floor divide and modulo)\n * NumPy behavior: divmod(a, b) = (floor_divide(a, b), mod(a, b))\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Tuple of [quotient, remainder] storages\n */\nexport function divmod(a: ArrayStorage, b: ArrayStorage | number): [ArrayStorage, ArrayStorage] {\n const quotient = floorDivide(a, b);\n const remainder = mod(a, b);\n return [quotient, remainder];\n}\n\n/**\n * Element-wise square of each element\n * NumPy behavior: x**2\n *\n * @param a - Input array storage\n * @returns Result storage with squared values\n */\nexport function square(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const bigData = data as BigInt64Array | BigUint64Array;\n const bigResultData = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n bigResultData[i] = bigData[i]! * bigData[i]!;\n }\n } else {\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n resultData[i] = val * val;\n }\n }\n\n return result;\n}\n\n/**\n * Remainder of division (same as mod)\n * NumPy behavior: Same as mod, alias for compatibility\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with remainder values\n */\nexport function remainder(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n return mod(a, b);\n}\n\n/**\n * Heaviside step function\n * NumPy behavior:\n * heaviside(x1, x2) = 0 if x1 < 0\n * = x2 if x1 == 0\n * = 1 if x1 > 0\n *\n * @param x1 - Input array storage\n * @param x2 - Value to use when x1 == 0 (array storage or scalar)\n * @returns Result storage with heaviside values\n */\nexport function heaviside(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n const dtype = x1.dtype;\n const shape = Array.from(x1.shape);\n const size = x1.size;\n\n // Result is always float64\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (typeof x2 === 'number') {\n // Scalar x2\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = x2;\n } else {\n resultData[i] = 1;\n }\n }\n } else {\n // Array x2 - needs to broadcast\n const x2Data = x2.data;\n const x2Shape = x2.shape;\n\n // Simple case: same shape\n if (shape.every((d, i) => d === x2Shape[i])) {\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = Number(x2Data[i]!);\n } else {\n resultData[i] = 1;\n }\n }\n } else {\n // Broadcasting case - use elementwiseBinaryOp approach\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n // Simple broadcast: assume x2 is broadcastable to x1\n const x2Idx = i % x2.size;\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = Number(x2Data[x2Idx]!);\n } else {\n resultData[i] = 1;\n }\n }\n }\n }\n\n return result;\n}\n", "/**\n * Broadcasting utilities for NumPy-compatible array operations\n *\n * Implements NumPy broadcasting rules without external dependencies\n */\n\nimport { ArrayStorage } from './storage';\n\n/**\n * Check if two or more shapes are broadcast-compatible\n * and compute the resulting output shape\n *\n * @param shapes - Array of shapes to broadcast\n * @returns The broadcast output shape, or null if incompatible\n *\n * @example\n * ```typescript\n * computeBroadcastShape([[3, 4], [4]]); // [3, 4]\n * computeBroadcastShape([[3, 4], [3, 1]]); // [3, 4]\n * computeBroadcastShape([[3, 4], [5]]); // null (incompatible)\n * ```\n */\nexport function computeBroadcastShape(shapes: readonly number[][]): number[] | null {\n if (shapes.length === 0) {\n return [];\n }\n\n if (shapes.length === 1) {\n return Array.from(shapes[0]!);\n }\n\n // Find max number of dimensions\n const maxNdim = Math.max(...shapes.map((s) => s.length));\n const result = new Array(maxNdim);\n\n for (let i = 0; i < maxNdim; i++) {\n let dim = 1;\n for (const shape of shapes) {\n const shapeIdx = shape.length - maxNdim + i;\n const shapeDim = shapeIdx < 0 ? 1 : shape[shapeIdx]!;\n\n if (shapeDim === 1) {\n // Can be broadcast\n continue;\n } else if (dim === 1) {\n // First non-1 dimension\n dim = shapeDim;\n } else if (dim !== shapeDim) {\n // Incompatible\n return null;\n }\n }\n result[i] = dim;\n }\n\n return result;\n}\n\n/**\n * Check if two shapes are broadcast-compatible\n *\n * @param shape1 - First shape\n * @param shape2 - Second shape\n * @returns true if shapes can be broadcast together, false otherwise\n *\n * @example\n * ```typescript\n * areBroadcastable([3, 4], [4]); // true\n * areBroadcastable([3, 4], [3, 1]); // true\n * areBroadcastable([3, 4], [5]); // false\n * ```\n */\nexport function areBroadcastable(shape1: readonly number[], shape2: readonly number[]): boolean {\n return computeBroadcastShape([Array.from(shape1), Array.from(shape2)]) !== null;\n}\n\n/**\n * Compute the strides for broadcasting an array to a target shape\n * Returns strides where dimensions that need broadcasting have stride 0\n */\nfunction broadcastStrides(\n shape: readonly number[],\n strides: readonly number[],\n targetShape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n const result = new Array(targetNdim).fill(0);\n\n // Align dimensions from the right\n for (let i = 0; i < ndim; i++) {\n const targetIdx = targetNdim - ndim + i;\n const dim = shape[i]!;\n const targetDim = targetShape[targetIdx]!;\n\n if (dim === targetDim) {\n // Same size, use original stride\n result[targetIdx] = strides[i]!;\n } else if (dim === 1) {\n // Broadcasting, stride is 0 (repeat along this dimension)\n result[targetIdx] = 0;\n } else {\n // This shouldn't happen if shapes were validated\n throw new Error('Invalid broadcast');\n }\n }\n\n return result;\n}\n\n/**\n * Broadcast an ArrayStorage to a target shape\n * Returns a view with modified strides for broadcasting\n *\n * @param storage - The storage to broadcast\n * @param targetShape - The target shape to broadcast to\n * @returns A new ArrayStorage view with broadcasting strides\n */\nexport function broadcastTo(storage: ArrayStorage, targetShape: readonly number[]): ArrayStorage {\n const broadcastedStrides = broadcastStrides(storage.shape, storage.strides, targetShape);\n return ArrayStorage.fromData(\n storage.data,\n Array.from(targetShape),\n storage.dtype,\n broadcastedStrides,\n storage.offset\n );\n}\n\n/**\n * Broadcast multiple ArrayStorage objects to a common shape\n *\n * Returns views of the input arrays broadcast to the same shape.\n * Views share memory with the original arrays.\n *\n * @param storages - ArrayStorage objects to broadcast\n * @returns Array of broadcast ArrayStorage views\n * @throws Error if arrays have incompatible shapes\n */\nexport function broadcastArrays(storages: ArrayStorage[]): ArrayStorage[] {\n if (storages.length === 0) {\n return [];\n }\n\n if (storages.length === 1) {\n return storages;\n }\n\n // Compute broadcast shape\n const shapes = storages.map((s) => Array.from(s.shape));\n const targetShape = computeBroadcastShape(shapes);\n\n if (targetShape === null) {\n throw new Error(\n `operands could not be broadcast together with shapes ${shapes.map((s) => JSON.stringify(s)).join(' ')}`\n );\n }\n\n // Broadcast each storage to the target shape\n return storages.map((s) => broadcastTo(s, targetShape));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes without creating arrays.\n * Returns the resulting shape if all shapes are broadcast-compatible.\n *\n * This is the NumPy-compatible function for computing broadcast shape.\n *\n * @param shapes - Variable number of shapes to broadcast\n * @returns The broadcast output shape\n * @throws Error if shapes are not broadcast-compatible\n *\n * @example\n * ```typescript\n * broadcastShapes([3, 4], [4]); // [3, 4]\n * broadcastShapes([3, 4], [3, 1]); // [3, 4]\n * broadcastShapes([3, 4], [5]); // Error\n * ```\n */\nexport function broadcastShapes(...shapes: readonly number[][]): number[] {\n const result = computeBroadcastShape(shapes);\n\n if (result === null) {\n const shapeStrs = shapes.map((s) => `(${s.join(',')})`).join(' ');\n throw new Error(\n `shape mismatch: objects cannot be broadcast to a single shape. Mismatch is between ${shapeStrs}`\n );\n }\n\n return result;\n}\n\n/**\n * Generate a descriptive error message for broadcasting failures\n *\n * @param shapes - The incompatible shapes\n * @param operation - The operation being attempted (e.g., 'add', 'multiply')\n * @returns Error message string\n */\nexport function broadcastErrorMessage(shapes: readonly number[][], operation?: string): string {\n const opStr = operation ? ` for ${operation}` : '';\n const shapeStrs = shapes.map((s) => `(${s.join(',')})`).join(' ');\n return `operands could not be broadcast together${opStr} with shapes ${shapeStrs}`;\n}\n", "/**\n * Comparison operations\n *\n * Element-wise comparison operations that return boolean arrays:\n * greater, greater_equal, less, less_equal, equal, not_equal,\n * isclose, allclose\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType } from '../core/dtype';\nimport { elementwiseComparisonOp } from '../internal/compute';\nimport { computeBroadcastShape, broadcastTo } from '../core/broadcasting';\n\n/**\n * Element-wise greater than comparison (a > b)\n */\nexport function greater(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return greaterScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x > y);\n}\n\n/**\n * Element-wise greater than or equal comparison (a >= b)\n */\nexport function greaterEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return greaterEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x >= y);\n}\n\n/**\n * Element-wise less than comparison (a < b)\n */\nexport function less(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return lessScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x < y);\n}\n\n/**\n * Element-wise less than or equal comparison (a <= b)\n */\nexport function lessEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return lessEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x <= y);\n}\n\n/**\n * Element-wise equality comparison (a == b)\n */\nexport function equal(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return equalScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x === y);\n}\n\n/**\n * Element-wise inequality comparison (a != b)\n */\nexport function notEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return notEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x !== y);\n}\n\n/**\n * Element-wise \"close\" comparison with tolerance\n * Returns true where |a - b| <= atol + rtol * |b|\n */\nexport function isclose(\n a: ArrayStorage,\n b: ArrayStorage | number,\n rtol: number = 1e-5,\n atol: number = 1e-8\n): ArrayStorage {\n if (typeof b === 'number') {\n return iscloseScalar(a, b, rtol, atol);\n }\n return elementwiseComparisonOp(a, b, (x, y) => {\n const diff = Math.abs(x - y);\n const threshold = atol + rtol * Math.abs(y);\n return diff <= threshold;\n });\n}\n\n/**\n * Check if all elements are close (scalar result)\n * Returns true if all elements satisfy isclose condition\n */\nexport function allclose(\n a: ArrayStorage,\n b: ArrayStorage | number,\n rtol: number = 1e-5,\n atol: number = 1e-8\n): boolean {\n const closeResult = isclose(a, b, rtol, atol);\n const data = closeResult.data as Uint8Array;\n\n // Check if all values are 1 (true)\n for (let i = 0; i < closeResult.size; i++) {\n if (data[i] === 0) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Returns True if two arrays are element-wise equal within a tolerance.\n * Unlike array_equal, this function broadcasts the arrays before comparison.\n *\n * NumPy behavior: Broadcasts arrays before comparing, returns True if shapes\n * are broadcast-compatible and all elements are equal.\n *\n * @param a1 - First input array\n * @param a2 - Second input array\n * @returns True if arrays are equivalent (after broadcasting), False otherwise\n */\nexport function arrayEquiv(a1: ArrayStorage, a2: ArrayStorage): boolean {\n // Check if arrays can be broadcast together\n const shapes = [Array.from(a1.shape), Array.from(a2.shape)];\n const broadcastShape = computeBroadcastShape(shapes);\n\n if (broadcastShape === null) {\n // If shapes are incompatible for broadcasting, arrays are not equivalent\n return false;\n }\n\n // Broadcast both arrays to the common shape\n const b1 = broadcastTo(a1, broadcastShape);\n const b2 = broadcastTo(a2, broadcastShape);\n\n // Compare element by element using proper multi-dimensional indexing\n const ndim = broadcastShape.length;\n const size = broadcastShape.reduce((acc, d) => acc * d, 1);\n\n // Handle different dtypes\n const isBigInt1 = isBigIntDType(b1.dtype);\n const isBigInt2 = isBigIntDType(b2.dtype);\n\n // Iterate over all elements using multi-dimensional indices\n for (let flatIdx = 0; flatIdx < size; flatIdx++) {\n // Convert flat index to multi-dimensional indices\n let temp = flatIdx;\n const indices: number[] = new Array(ndim);\n for (let i = ndim - 1; i >= 0; i--) {\n indices[i] = temp % broadcastShape[i]!;\n temp = Math.floor(temp / broadcastShape[i]!);\n }\n\n // Get values using proper indexing\n const val1 = b1.get(...indices);\n const val2 = b2.get(...indices);\n\n // Compare values\n if (isBigInt1 || isBigInt2) {\n const v1 = typeof val1 === 'bigint' ? val1 : BigInt(Number(val1));\n const v2 = typeof val2 === 'bigint' ? val2 : BigInt(Number(val2));\n if (v1 !== v2) {\n return false;\n }\n } else {\n if (val1 !== val2) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n// Scalar comparison optimized paths\n\nfunction greaterScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! > scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction greaterEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! >= scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction lessScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! < scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction lessEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! <= scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction equalScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n const dtype = storage.dtype;\n\n if (isBigIntDType(dtype)) {\n // BigInt comparison: convert scalar to BigInt\n const scalarBig = BigInt(Math.round(scalar));\n const typedData = thisData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < storage.size; i++) {\n data[i] = typedData[i]! === scalarBig ? 1 : 0;\n }\n } else {\n // Regular comparison\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! === scalar ? 1 : 0;\n }\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction notEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! !== scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction iscloseScalar(\n storage: ArrayStorage,\n scalar: number,\n rtol: number,\n atol: number\n): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n const dtype = storage.dtype;\n\n if (isBigIntDType(dtype)) {\n // For BigInt, convert to Number for comparison\n const thisTyped = thisData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < storage.size; i++) {\n const a = Number(thisTyped[i]!);\n const diff = Math.abs(a - scalar);\n const threshold = atol + rtol * Math.abs(scalar);\n data[i] = diff <= threshold ? 1 : 0;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < storage.size; i++) {\n const a = Number(thisData[i]!);\n const diff = Math.abs(a - scalar);\n const threshold = atol + rtol * Math.abs(scalar);\n data[i] = diff <= threshold ? 1 : 0;\n }\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n", "/**\n * Indexing utilities for array operations\n * @internal\n */\n\n/**\n * Compute row-major strides for a given shape\n */\nexport function computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n\n/**\n * Convert multi-index to linear index in row-major order\n */\nexport function multiIndexToLinear(indices: number[], shape: readonly number[]): number {\n let linearIdx = 0;\n let stride = 1;\n for (let i = indices.length - 1; i >= 0; i--) {\n linearIdx += indices[i]! * stride;\n stride *= shape[i]!;\n }\n return linearIdx;\n}\n\n/**\n * Convert outer index and axis index to full multi-index\n * Used in reductions along a specific axis\n *\n * @param outerIdx - Linear index in the reduced (output) array\n * @param axis - The axis being reduced\n * @param axisIdx - Position along the reduction axis\n * @param shape - Original array shape\n * @returns Full multi-index in the original array\n */\nexport function outerIndexToMultiIndex(\n outerIdx: number,\n axis: number,\n axisIdx: number,\n shape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const indices = new Array(ndim);\n const outputShape = Array.from(shape).filter((_, i) => i !== axis);\n\n // Convert outerIdx to multi-index in the output shape\n let remaining = outerIdx;\n for (let i = outputShape.length - 1; i >= 0; i--) {\n indices[i >= axis ? i + 1 : i] = remaining % outputShape[i]!;\n remaining = Math.floor(remaining / outputShape[i]!);\n }\n\n // Insert the axis index\n indices[axis] = axisIdx;\n return indices;\n}\n", "/**\n * Reduction operations (sum, mean, max, min)\n *\n * Pure functions for reducing arrays along axes.\n * @module ops/reduction\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType } from '../core/dtype';\nimport { outerIndexToMultiIndex, multiIndexToLinear } from '../internal/indexing';\n\n/**\n * Sum array elements over a given axis\n */\nexport function sum(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Sum all elements - return scalar\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n let total = BigInt(0);\n for (let i = 0; i < size; i++) {\n total += typedData[i]!;\n }\n return Number(total);\n } else {\n let total = 0;\n for (let i = 0; i < size; i++) {\n total += Number(data[i]!);\n }\n return total;\n }\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar - reuse scalar sum logic\n return sum(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumVal = BigInt(0);\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n sumVal += typedData[linearIdx]!;\n }\n resultTyped[outerIdx] = sumVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumVal = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n sumVal += Number(data[linearIdx]!);\n }\n resultData[outerIdx] = sumVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Compute the arithmetic mean along the specified axis\n * Note: mean() returns float64 for integer dtypes, matching NumPy behavior\n */\nexport function mean(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n\n if (axis === undefined) {\n return (sum(storage) as number) / storage.size;\n }\n\n // Normalize negative axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = shape.length + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= shape.length) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${shape.length}`);\n }\n\n const sumResult = sum(storage, axis, keepdims);\n if (typeof sumResult === 'number') {\n return sumResult / shape[normalizedAxis]!;\n }\n\n // Divide by the size of the reduced axis\n const divisor = shape[normalizedAxis]!;\n\n // For integer dtypes, mean returns float64 (matching NumPy behavior)\n let resultDtype = dtype;\n if (isBigIntDType(dtype) || dtype.startsWith('int') || dtype.startsWith('uint')) {\n resultDtype = 'float64';\n }\n\n const result = ArrayStorage.zeros(Array.from(sumResult.shape), resultDtype);\n const resultData = result.data;\n const sumData = sumResult.data;\n\n if (isBigIntDType(dtype)) {\n // Convert BigInt sum results to float for mean\n const sumTyped = sumData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < resultData.length; i++) {\n resultData[i] = Number(sumTyped[i]!) / divisor;\n }\n } else {\n for (let i = 0; i < resultData.length; i++) {\n resultData[i] = Number(sumData[i]!) / divisor;\n }\n }\n\n return result;\n}\n\n/**\n * Return the maximum along a given axis\n */\nexport function max(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Max of all elements - return scalar\n if (size === 0) {\n throw new Error('max of empty array');\n }\n\n let maxVal = data[0]!;\n for (let i = 1; i < size; i++) {\n if (data[i]! > maxVal) {\n maxVal = data[i]!;\n }\n }\n return Number(maxVal);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return max(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let maxVal = typedData[firstIdx]!;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val > maxVal) {\n maxVal = val;\n }\n }\n resultTyped[outerIdx] = maxVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val > maxVal) {\n maxVal = val;\n }\n }\n resultData[outerIdx] = maxVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Product array elements over a given axis\n */\nexport function prod(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Product of all elements - return scalar\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n let product = BigInt(1);\n for (let i = 0; i < size; i++) {\n product *= typedData[i]!;\n }\n return Number(product);\n } else {\n let product = 1;\n for (let i = 0; i < size; i++) {\n product *= Number(data[i]!);\n }\n return product;\n }\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar - reuse scalar prod logic\n return prod(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let prodVal = BigInt(1);\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n prodVal *= typedData[linearIdx]!;\n }\n resultTyped[outerIdx] = prodVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let prodVal = 1;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n prodVal *= Number(data[linearIdx]!);\n }\n resultData[outerIdx] = prodVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Return the minimum along a given axis\n */\nexport function min(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Min of all elements - return scalar\n if (size === 0) {\n throw new Error('min of empty array');\n }\n\n let minVal = data[0]!;\n for (let i = 1; i < size; i++) {\n if (data[i]! < minVal) {\n minVal = data[i]!;\n }\n }\n return Number(minVal);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return min(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let minVal = typedData[firstIdx]!;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val < minVal) {\n minVal = val;\n }\n }\n resultTyped[outerIdx] = minVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val < minVal) {\n minVal = val;\n }\n }\n resultData[outerIdx] = minVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Return the indices of the minimum values along a given axis\n */\nexport function argmin(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Argmin of all elements - return scalar index\n if (size === 0) {\n throw new Error('argmin of empty array');\n }\n\n let minVal = data[0]!;\n let minIdx = 0;\n for (let i = 1; i < size; i++) {\n if (data[i]! < minVal) {\n minVal = data[i]!;\n minIdx = i;\n }\n }\n return minIdx;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return argmin(storage);\n }\n\n // Create result storage with int32 dtype (indices are always integers)\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let minVal = typedData[firstIdx]!;\n let minAxisIdx = 0;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val < minVal) {\n minVal = val;\n minAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minAxisIdx;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n let minAxisIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val < minVal) {\n minVal = val;\n minAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minAxisIdx;\n }\n }\n\n return result;\n}\n\n/**\n * Return the indices of the maximum values along a given axis\n */\nexport function argmax(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Argmax of all elements - return scalar index\n if (size === 0) {\n throw new Error('argmax of empty array');\n }\n\n let maxVal = data[0]!;\n let maxIdx = 0;\n for (let i = 1; i < size; i++) {\n if (data[i]! > maxVal) {\n maxVal = data[i]!;\n maxIdx = i;\n }\n }\n return maxIdx;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return argmax(storage);\n }\n\n // Create result storage with int32 dtype (indices are always integers)\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let maxVal = typedData[firstIdx]!;\n let maxAxisIdx = 0;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val > maxVal) {\n maxVal = val;\n maxAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxAxisIdx;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n let maxAxisIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val > maxVal) {\n maxVal = val;\n maxAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxAxisIdx;\n }\n }\n\n return result;\n}\n\n/**\n * Compute the variance along the specified axis\n * @param storage - Input array storage\n * @param axis - Axis along which to compute variance\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - Keep dimensions (default: false)\n */\nexport function variance(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n // Compute mean\n const meanResult = mean(storage, axis, keepdims);\n\n if (axis === undefined) {\n // Variance of all elements - return scalar\n const meanVal = meanResult as number;\n let sumSqDiff = 0;\n\n for (let i = 0; i < size; i++) {\n const diff = Number(data[i]!) - meanVal;\n sumSqDiff += diff * diff;\n }\n\n return sumSqDiff / (size - ddof);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const meanArray = meanResult as ArrayStorage;\n const meanData = meanArray.data;\n\n // Compute output shape (same as mean's output shape)\n const outputShape = keepdims\n ? meanArray.shape\n : Array.from(shape).filter((_, i) => i !== normalizedAxis);\n\n // Result is always float64 for variance\n const result = ArrayStorage.zeros(Array.from(outputShape), 'float64');\n const resultData = result.data;\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n // Compute variance for each position\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumSqDiff = 0;\n const meanVal = Number(meanData[outerIdx]!);\n\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const diff = Number(data[linearIdx]!) - meanVal;\n sumSqDiff += diff * diff;\n }\n\n resultData[outerIdx] = sumSqDiff / (axisSize - ddof);\n }\n\n return result;\n}\n\n/**\n * Compute the standard deviation along the specified axis\n * @param storage - Input array storage\n * @param axis - Axis along which to compute std\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - Keep dimensions (default: false)\n */\nexport function std(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const varResult = variance(storage, axis, ddof, keepdims);\n\n if (typeof varResult === 'number') {\n return Math.sqrt(varResult);\n }\n\n // Apply sqrt element-wise\n const result = ArrayStorage.zeros(Array.from(varResult.shape), 'float64');\n const varData = varResult.data;\n const resultData = result.data;\n\n for (let i = 0; i < varData.length; i++) {\n resultData[i] = Math.sqrt(Number(varData[i]!));\n }\n\n return result;\n}\n\n/**\n * Test whether all array elements along a given axis evaluate to True\n */\nexport function all(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | boolean {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Test all elements\n for (let i = 0; i < size; i++) {\n if (!data[i]) {\n return false;\n }\n }\n return true;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return all(storage);\n }\n\n // Create result storage with bool dtype\n const result = ArrayStorage.zeros(outputShape, 'bool');\n const resultData = result.data as Uint8Array;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let allTrue = true;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (!data[linearIdx]) {\n allTrue = false;\n break;\n }\n }\n resultData[outerIdx] = allTrue ? 1 : 0;\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'bool');\n }\n\n return result;\n}\n\n/**\n * Test whether any array elements along a given axis evaluate to True\n */\nexport function any(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | boolean {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Test all elements\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n return true;\n }\n }\n return false;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return any(storage);\n }\n\n // Create result storage with bool dtype\n const result = ArrayStorage.zeros(outputShape, 'bool');\n const resultData = result.data as Uint8Array;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let anyTrue = false;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (data[linearIdx]) {\n anyTrue = true;\n break;\n }\n }\n resultData[outerIdx] = anyTrue ? 1 : 0;\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'bool');\n }\n\n return result;\n}\n\n/**\n * Return cumulative sum of elements along a given axis\n */\nexport function cumsum(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumsum\n const size = storage.size;\n const resultData = new Float64Array(size);\n let sum = 0;\n for (let i = 0; i < size; i++) {\n sum += Number(data[i]);\n resultData[i] = sum;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumsum along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n // Determine position along axis\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = Number(data[i]);\n } else {\n // Add previous element along axis\n resultData[i] = resultData[i - axisStride]! + Number(data[i]);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Return cumulative product of elements along a given axis\n */\nexport function cumprod(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumprod\n const size = storage.size;\n const resultData = new Float64Array(size);\n let prod = 1;\n for (let i = 0; i < size; i++) {\n prod *= Number(data[i]);\n resultData[i] = prod;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumprod along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n // Determine position along axis\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = Number(data[i]);\n } else {\n // Multiply by previous element along axis\n resultData[i] = resultData[i - axisStride]! * Number(data[i]);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Peak to peak (maximum - minimum) value along a given axis\n */\nexport function ptp(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const maxResult = max(storage, axis, keepdims);\n const minResult = min(storage, axis, keepdims);\n\n if (typeof maxResult === 'number' && typeof minResult === 'number') {\n return maxResult - minResult;\n }\n\n // Both are arrays, subtract element-wise\n const maxStorage = maxResult as ArrayStorage;\n const minStorage = minResult as ArrayStorage;\n const maxData = maxStorage.data;\n const minData = minStorage.data;\n const resultData = new Float64Array(maxStorage.size);\n\n for (let i = 0; i < maxStorage.size; i++) {\n resultData[i] = Number(maxData[i]) - Number(minData[i]);\n }\n\n return ArrayStorage.fromData(resultData, [...maxStorage.shape], 'float64');\n}\n\n/**\n * Compute the median along the specified axis\n */\nexport function median(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n return quantile(storage, 0.5, axis, keepdims);\n}\n\n/**\n * Compute the q-th percentile of data along specified axis\n */\nexport function percentile(\n storage: ArrayStorage,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n return quantile(storage, q / 100, axis, keepdims);\n}\n\n/**\n * Compute the q-th quantile of data along specified axis\n */\nexport function quantile(\n storage: ArrayStorage,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n if (q < 0 || q > 1) {\n throw new Error('Quantile must be between 0 and 1');\n }\n\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Compute quantile over all elements\n const values: number[] = [];\n for (let i = 0; i < storage.size; i++) {\n values.push(Number(data[i]));\n }\n values.sort((a, b) => a - b);\n\n const n = values.length;\n const idx = q * (n - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n\n if (lower === upper) {\n return values[lower]!;\n }\n\n // Linear interpolation\n const frac = idx - lower;\n return values[lower]! * (1 - frac) + values[upper]! * frac;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return quantile(storage, q);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(data[linearIdx]));\n }\n values.sort((a, b) => a - b);\n\n const n = values.length;\n const idx = q * (n - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n\n if (lower === upper) {\n resultData[outerIdx] = values[lower]!;\n } else {\n // Linear interpolation\n const frac = idx - lower;\n resultData[outerIdx] = values[lower]! * (1 - frac) + values[upper]! * frac;\n }\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute the weighted average along the specified axis\n */\nexport function average(\n storage: ArrayStorage,\n axis?: number,\n weights?: ArrayStorage,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (weights === undefined) {\n // Unweighted average is just mean\n return mean(storage, axis, keepdims);\n }\n\n if (axis === undefined) {\n // Compute weighted average over all elements\n let sumWeightedValues = 0;\n let sumWeights = 0;\n const weightData = weights.data;\n\n for (let i = 0; i < storage.size; i++) {\n const w = Number(weightData[i % weights.size]);\n sumWeightedValues += Number(data[i]) * w;\n sumWeights += w;\n }\n\n return sumWeights === 0 ? NaN : sumWeightedValues / sumWeights;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return average(storage, undefined, weights);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const weightData = weights.data;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumWeightedValues = 0;\n let sumWeights = 0;\n\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const w = Number(weightData[axisIdx % weights.size]);\n sumWeightedValues += Number(data[linearIdx]) * w;\n sumWeights += w;\n }\n\n resultData[outerIdx] = sumWeights === 0 ? NaN : sumWeightedValues / sumWeights;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n// ============================================================================\n// NaN-aware reduction functions\n// ============================================================================\n\n/**\n * Return sum of elements, treating NaNs as zero\n */\nexport function nansum(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n }\n }\n return total;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nansum(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n }\n }\n resultData[outerIdx] = total;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return product of elements, treating NaNs as one\n */\nexport function nanprod(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total *= val;\n }\n }\n return total;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanprod(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 1;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total *= val;\n }\n }\n resultData[outerIdx] = total;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute mean ignoring NaN values\n */\nexport function nanmean(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 0;\n let count = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n return count === 0 ? NaN : total / count;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmean(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 0;\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n resultData[outerIdx] = count === 0 ? NaN : total / count;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute variance ignoring NaN values\n */\nexport function nanvar(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // First pass: compute mean\n let total = 0;\n let count = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n if (count - ddof <= 0) return NaN;\n const meanVal = total / count;\n\n // Second pass: compute sum of squared deviations\n let sumSq = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n sumSq += (val - meanVal) ** 2;\n }\n }\n return sumSq / (count - ddof);\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanvar(storage, undefined, ddof);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // First pass: compute mean\n let total = 0;\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n\n if (count - ddof <= 0) {\n resultData[outerIdx] = NaN;\n continue;\n }\n\n const meanVal = total / count;\n\n // Second pass: compute sum of squared deviations\n let sumSq = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n sumSq += (val - meanVal) ** 2;\n }\n }\n resultData[outerIdx] = sumSq / (count - ddof);\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute standard deviation ignoring NaN values\n */\nexport function nanstd(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const varResult = nanvar(storage, axis, ddof, keepdims);\n if (typeof varResult === 'number') {\n return Math.sqrt(varResult);\n }\n const varStorage = varResult as ArrayStorage;\n const resultData = new Float64Array(varStorage.size);\n for (let i = 0; i < varStorage.size; i++) {\n resultData[i] = Math.sqrt(Number(varStorage.data[i]));\n }\n return ArrayStorage.fromData(resultData, [...varStorage.shape], 'float64');\n}\n\n/**\n * Return minimum ignoring NaN values\n */\nexport function nanmin(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let minVal = Infinity;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n }\n }\n return minVal === Infinity ? NaN : minVal;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmin(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n }\n }\n resultData[outerIdx] = minVal === Infinity ? NaN : minVal;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return maximum ignoring NaN values\n */\nexport function nanmax(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let maxVal = -Infinity;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n }\n }\n return maxVal === -Infinity ? NaN : maxVal;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmax(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n }\n }\n resultData[outerIdx] = maxVal === -Infinity ? NaN : maxVal;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return indices of minimum value, ignoring NaNs\n */\nexport function nanargmin(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let minVal = Infinity;\n let minIdx = -1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n minIdx = i;\n }\n }\n return minIdx;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanargmin(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Int32Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n let minIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n minIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minIdx;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'int32');\n}\n\n/**\n * Return indices of maximum value, ignoring NaNs\n */\nexport function nanargmax(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let maxVal = -Infinity;\n let maxIdx = -1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n maxIdx = i;\n }\n }\n return maxIdx;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanargmax(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Int32Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n let maxIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n maxIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxIdx;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'int32');\n}\n\n/**\n * Return cumulative sum, treating NaNs as zero\n */\nexport function nancumsum(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumsum\n const size = storage.size;\n const resultData = new Float64Array(size);\n let sum = 0;\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n sum += val;\n }\n resultData[i] = sum;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumsum along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n const val = Number(data[i]);\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = isNaN(val) ? 0 : val;\n } else {\n resultData[i] = resultData[i - axisStride]! + (isNaN(val) ? 0 : val);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Return cumulative product, treating NaNs as one\n */\nexport function nancumprod(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumprod\n const size = storage.size;\n const resultData = new Float64Array(size);\n let prod = 1;\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n prod *= val;\n }\n resultData[i] = prod;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumprod along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n const val = Number(data[i]);\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = isNaN(val) ? 1 : val;\n } else {\n resultData[i] = resultData[i - axisStride]! * (isNaN(val) ? 1 : val);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Compute median ignoring NaN values\n */\nexport function nanmedian(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Collect non-NaN values\n const values: number[] = [];\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n values.push(val);\n }\n }\n\n if (values.length === 0) return NaN;\n\n values.sort((a, b) => a - b);\n const n = values.length;\n const mid = Math.floor(n / 2);\n\n if (n % 2 === 0) {\n return (values[mid - 1]! + values[mid]!) / 2;\n }\n return values[mid]!;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmedian(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect non-NaN values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n values.push(val);\n }\n }\n\n if (values.length === 0) {\n resultData[outerIdx] = NaN;\n continue;\n }\n\n values.sort((a, b) => a - b);\n const n = values.length;\n const mid = Math.floor(n / 2);\n\n if (n % 2 === 0) {\n resultData[outerIdx] = (values[mid - 1]! + values[mid]!) / 2;\n } else {\n resultData[outerIdx] = values[mid]!;\n }\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n", "/**\n * Shape manipulation operations\n *\n * Pure functions for reshaping, transposing, and manipulating array dimensions.\n * @module ops/shape\n */\n\nimport { ArrayStorage, computeStrides } from '../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type TypedArray } from '../core/dtype';\n\n/**\n * Reshape array to a new shape\n * Returns a view if array is C-contiguous, otherwise copies data\n */\nexport function reshape(storage: ArrayStorage, newShape: number[]): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Check if -1 is in the shape (infer dimension)\n const negIndex = newShape.indexOf(-1);\n let finalShape: number[];\n\n if (negIndex !== -1) {\n // Infer the dimension at negIndex\n const knownSize = newShape.reduce((acc, dim, i) => (i === negIndex ? acc : acc * dim), 1);\n const inferredDim = size / knownSize;\n\n if (!Number.isInteger(inferredDim)) {\n throw new Error(\n `cannot reshape array of size ${size} into shape ${JSON.stringify(newShape)}`\n );\n }\n\n finalShape = newShape.map((dim, i) => (i === negIndex ? inferredDim : dim));\n } else {\n finalShape = newShape;\n }\n\n // Validate that the new shape has the same total size\n const newSize = finalShape.reduce((a, b) => a * b, 1);\n if (newSize !== size) {\n throw new Error(\n `cannot reshape array of size ${size} into shape ${JSON.stringify(finalShape)}`\n );\n }\n\n // Fast path: if array is C-contiguous, create a view (no copy)\n if (storage.isCContiguous) {\n const data = storage.data;\n return ArrayStorage.fromData(data, finalShape, dtype, computeStrides(finalShape), 0);\n }\n\n // Slow path: array is not contiguous, must copy data first\n // Create contiguous copy, then reshape\n const contiguousCopy = storage.copy(); // copy() creates C-contiguous array\n const data = contiguousCopy.data;\n return ArrayStorage.fromData(data, finalShape, dtype, computeStrides(finalShape), 0);\n}\n\n/**\n * Return a flattened copy of the array\n * Creates 1D array containing all elements in row-major order\n * Always returns a copy (matching NumPy behavior)\n */\nexport function flatten(storage: ArrayStorage): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n const Constructor = getTypedArrayConstructor(dtype);\n\n if (!Constructor) {\n throw new Error(`Cannot flatten array with dtype ${dtype}`);\n }\n\n // Fast path: if array is C-contiguous, just copy the underlying data\n if (storage.isCContiguous) {\n const data = storage.data;\n const newData = data.slice(storage.offset, storage.offset + size);\n return ArrayStorage.fromData(newData as TypedArray, [size], dtype, [1], 0);\n }\n\n // Slow path: non-contiguous array, copy using iget (flat index)\n // This is much faster than recursive get(...indices) calls\n const newData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n for (let i = 0; i < size; i++) {\n const value = storage.iget(i);\n if (isBigInt) {\n (newData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(newData, [size], dtype, [1], 0);\n}\n\n/**\n * Return a flattened array (view when possible, otherwise copy)\n * Returns a view if array is C-contiguous, otherwise copies data\n */\nexport function ravel(storage: ArrayStorage): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Fast path: if array is C-contiguous, create a view (no copy needed)\n if (storage.isCContiguous) {\n const data = storage.data;\n return ArrayStorage.fromData(data, [size], dtype, [1], 0);\n }\n\n // Slow path: array is not contiguous, must copy like flatten()\n return flatten(storage);\n}\n\n/**\n * Transpose array (permute dimensions)\n * Returns a view with transposed dimensions\n */\nexport function transpose(storage: ArrayStorage, axes?: number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n let permutation: number[];\n\n if (axes === undefined) {\n // Default: reverse all dimensions\n permutation = Array.from({ length: ndim }, (_, i) => ndim - 1 - i);\n } else {\n // Validate axes\n if (axes.length !== ndim) {\n throw new Error(`axes must have length ${ndim}, got ${axes.length}`);\n }\n\n // Check that axes is a valid permutation\n const seen = new Set<number>();\n for (const axis of axes) {\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n if (seen.has(normalizedAxis)) {\n throw new Error(`repeated axis in transpose`);\n }\n seen.add(normalizedAxis);\n }\n\n permutation = axes.map((ax) => (ax < 0 ? ndim + ax : ax));\n }\n\n // Compute new shape and strides\n const newShape = permutation.map((i) => shape[i]!);\n const oldStrides = Array.from(strides);\n const newStrides = permutation.map((i) => oldStrides[i]!);\n\n // Create transposed view\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Remove axes of length 1\n * Returns a view with specified dimensions removed\n */\nexport function squeeze(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n if (axis === undefined) {\n // Remove all axes with size 1\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n for (let i = 0; i < ndim; i++) {\n if (shape[i] !== 1) {\n newShape.push(shape[i]!);\n newStrides.push(strides[i]!);\n }\n }\n\n // If all dimensions were 1, result would be a scalar (0-d array)\n // For now, keep at least one dimension\n if (newShape.length === 0) {\n newShape.push(1);\n newStrides.push(1);\n }\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n } else {\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Check that the axis has size 1\n if (shape[normalizedAxis] !== 1) {\n throw new Error(\n `cannot select an axis which has size not equal to one (axis ${axis} has size ${shape[normalizedAxis]})`\n );\n }\n\n // Remove the specified axis\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n for (let i = 0; i < ndim; i++) {\n if (i !== normalizedAxis) {\n newShape.push(shape[i]!);\n newStrides.push(strides[i]!);\n }\n }\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n }\n}\n\n/**\n * Expand the shape by inserting a new axis of length 1\n * Returns a view with additional dimension\n */\nexport function expandDims(storage: ArrayStorage, axis: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Normalize axis (can be from -ndim-1 to ndim)\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + axis + 1;\n }\n\n if (normalizedAxis < 0 || normalizedAxis > ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim + 1}`);\n }\n\n // Insert 1 at the specified position\n const newShape = [...Array.from(shape)];\n newShape.splice(normalizedAxis, 0, 1);\n\n // Insert a stride at the new axis position\n // The stride for a dimension of size 1 doesn't matter, but conventionally\n // it should be the product of all dimensions to its right\n const newStrides = [...Array.from(strides)];\n const insertedStride =\n normalizedAxis < ndim ? strides[normalizedAxis]! * (shape[normalizedAxis] || 1) : 1;\n newStrides.splice(normalizedAxis, 0, insertedStride);\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Swap two axes of an array\n * Returns a view with axes swapped\n */\nexport function swapaxes(storage: ArrayStorage, axis1: number, axis2: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Normalize axes\n let normalizedAxis1 = axis1 < 0 ? ndim + axis1 : axis1;\n let normalizedAxis2 = axis2 < 0 ? ndim + axis2 : axis2;\n\n if (normalizedAxis1 < 0 || normalizedAxis1 >= ndim) {\n throw new Error(`axis1 ${axis1} is out of bounds for array of dimension ${ndim}`);\n }\n if (normalizedAxis2 < 0 || normalizedAxis2 >= ndim) {\n throw new Error(`axis2 ${axis2} is out of bounds for array of dimension ${ndim}`);\n }\n\n // If same axis, return a view without change\n if (normalizedAxis1 === normalizedAxis2) {\n return ArrayStorage.fromData(\n data,\n Array.from(shape),\n dtype,\n Array.from(strides),\n storage.offset\n );\n }\n\n // Swap shape and strides\n const newShape = Array.from(shape);\n const newStrides = Array.from(strides);\n\n [newShape[normalizedAxis1], newShape[normalizedAxis2]] = [\n newShape[normalizedAxis2]!,\n newShape[normalizedAxis1]!,\n ];\n [newStrides[normalizedAxis1], newStrides[normalizedAxis2]] = [\n newStrides[normalizedAxis2]!,\n newStrides[normalizedAxis1]!,\n ];\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Move axes to new positions\n * Returns a view with axes moved\n */\nexport function moveaxis(\n storage: ArrayStorage,\n source: number | number[],\n destination: number | number[]\n): ArrayStorage {\n const ndim = storage.ndim;\n\n // Convert to arrays\n const sourceArr = Array.isArray(source) ? source : [source];\n const destArr = Array.isArray(destination) ? destination : [destination];\n\n if (sourceArr.length !== destArr.length) {\n throw new Error('source and destination must have the same number of elements');\n }\n\n // Normalize axes\n const normalizedSource = sourceArr.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`source axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n const normalizedDest = destArr.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`destination axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n // Check for duplicate source/dest axes\n if (new Set(normalizedSource).size !== normalizedSource.length) {\n throw new Error('repeated axis in source');\n }\n if (new Set(normalizedDest).size !== normalizedDest.length) {\n throw new Error('repeated axis in destination');\n }\n\n // Build permutation\n // Start with axes not in source\n const order: number[] = [];\n for (let i = 0; i < ndim; i++) {\n if (!normalizedSource.includes(i)) {\n order.push(i);\n }\n }\n\n // Insert source axes at destination positions\n for (let i = 0; i < normalizedSource.length; i++) {\n const dst = normalizedDest[i]!;\n order.splice(dst, 0, normalizedSource[i]!);\n }\n\n return transpose(storage, order);\n}\n\n/**\n * Concatenate arrays along an axis\n */\nexport function concatenate(storages: ArrayStorage[], axis: number = 0): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to concatenate');\n }\n\n if (storages.length === 1) {\n return storages[0]!.copy();\n }\n\n const first = storages[0]!;\n const ndim = first.ndim;\n const dtype = first.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Validate shapes: all arrays must have same shape except along axis\n for (let i = 1; i < storages.length; i++) {\n const s = storages[i]!;\n if (s.ndim !== ndim) {\n throw new Error('all the input arrays must have same number of dimensions');\n }\n for (let d = 0; d < ndim; d++) {\n if (d !== normalizedAxis && s.shape[d] !== first.shape[d]) {\n throw new Error(\n `all the input array dimensions except for the concatenation axis must match exactly`\n );\n }\n }\n }\n\n // Calculate output shape\n const outputShape = Array.from(first.shape);\n let totalAlongAxis = first.shape[normalizedAxis]!;\n for (let i = 1; i < storages.length; i++) {\n totalAlongAxis += storages[i]!.shape[normalizedAxis]!;\n }\n outputShape[normalizedAxis] = totalAlongAxis;\n\n // Create output array\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot concatenate arrays with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Copy data from each input array\n let offset = 0;\n for (const storage of storages) {\n const axisSize = storage.shape[normalizedAxis]!;\n copyToOutput(storage, outputData, outputShape, outputStrides, normalizedAxis, offset, dtype);\n offset += axisSize;\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Helper to copy data into concatenated output\n */\nfunction copyToOutput(\n source: ArrayStorage,\n outputData: TypedArray,\n _outputShape: number[],\n outputStrides: number[],\n axis: number,\n axisOffset: number,\n dtype: string\n): void {\n const sourceShape = source.shape;\n const ndim = sourceShape.length;\n const sourceSize = source.size;\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n\n // Fast path: if concatenating along axis 0 and both are C-contiguous,\n // we can do bulk copy\n if (axis === 0 && source.isCContiguous && ndim > 0) {\n // Calculate the starting position in output array\n const outputOffset = axisOffset * outputStrides[0]!;\n const sourceData = source.data;\n const start = source.offset;\n const end = start + sourceSize;\n\n // Bulk copy the entire source array\n // @ts-expect-error - TypedArray.set() works with any typed array subarray\n outputData.set(sourceData.subarray(start, end), outputOffset);\n return;\n }\n\n // Optimized path for axis=1 (common for hstack): copy row by row\n if (axis === 1 && ndim === 2 && source.isCContiguous) {\n const rows = sourceShape[0]!;\n const cols = sourceShape[1]!;\n const outputCols = _outputShape[1]!;\n const sourceData = source.data;\n const sourceStart = source.offset;\n\n for (let row = 0; row < rows; row++) {\n const sourceRowStart = sourceStart + row * cols;\n const outputRowStart = row * outputCols + axisOffset;\n // @ts-expect-error - TypedArray.set() works with any typed array subarray\n outputData.set(sourceData.subarray(sourceRowStart, sourceRowStart + cols), outputRowStart);\n }\n return;\n }\n\n // Slow path: element-by-element copy using flat indices (iget)\n // Optimized to avoid array spread and pre-compute base offset\n const indices = new Array(ndim).fill(0);\n const baseOutputOffset = axisOffset * outputStrides[axis]!;\n\n for (let i = 0; i < sourceSize; i++) {\n // Get value from source using flat index\n const value = source.iget(i);\n\n // Compute output index more efficiently\n let outputIdx = baseOutputOffset;\n for (let d = 0; d < ndim; d++) {\n outputIdx += indices[d]! * outputStrides[d]!;\n }\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputIdx] =\n value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < sourceShape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n}\n\n/**\n * Stack arrays along a new axis\n */\nexport function stack(storages: ArrayStorage[], axis: number = 0): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n const first = storages[0]!;\n const shape = first.shape;\n const ndim = first.ndim;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + 1 + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis > ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim + 1}`);\n }\n\n // Validate shapes: all arrays must have exact same shape\n for (let i = 1; i < storages.length; i++) {\n const s = storages[i]!;\n if (s.ndim !== ndim) {\n throw new Error('all input arrays must have the same shape');\n }\n for (let d = 0; d < ndim; d++) {\n if (s.shape[d] !== shape[d]) {\n throw new Error('all input arrays must have the same shape');\n }\n }\n }\n\n // Expand dims on each array, then concatenate\n const expanded = storages.map((s) => expandDims(s, normalizedAxis));\n return concatenate(expanded, normalizedAxis);\n}\n\n/**\n * Stack arrays vertically (row-wise)\n * vstack is equivalent to concatenation along the first axis after\n * 1-D arrays of shape (N,) have been reshaped to (1,N)\n */\nexport function vstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // For 1D arrays, reshape to (1, N) first\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!]);\n }\n return s;\n });\n\n return concatenate(prepared, 0);\n}\n\n/**\n * Stack arrays horizontally (column-wise)\n * hstack is equivalent to concatenation along the second axis,\n * except for 1-D arrays where it concatenates along the first axis\n */\nexport function hstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // Check if all arrays are 1D\n const allOneDim = storages.every((s) => s.ndim === 1);\n\n if (allOneDim) {\n // For 1D arrays, concatenate along axis 0\n return concatenate(storages, 0);\n }\n\n // For higher-dimensional arrays, concatenate along axis 1\n return concatenate(storages, 1);\n}\n\n/**\n * Stack arrays depth-wise (along third axis)\n * dstack is equivalent to concatenation along the third axis after\n * 2-D arrays of shape (M,N) have been reshaped to (M,N,1) and\n * 1-D arrays of shape (N,) have been reshaped to (1,N,1)\n */\nexport function dstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // Prepare arrays\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n // Reshape (N,) to (1, N, 1)\n return reshape(expandDims(reshape(s, [1, s.shape[0]!]), 2), [1, s.shape[0]!, 1]);\n } else if (s.ndim === 2) {\n // Reshape (M, N) to (M, N, 1)\n return expandDims(s, 2);\n }\n return s;\n });\n\n return concatenate(prepared, 2);\n}\n\n/**\n * Split array into sub-arrays\n */\nexport function split(\n storage: ArrayStorage,\n indicesOrSections: number | number[],\n axis: number = 0\n): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n let splitIndices: number[];\n\n if (typeof indicesOrSections === 'number') {\n // Split into N equal sections\n if (axisSize % indicesOrSections !== 0) {\n throw new Error(`array split does not result in an equal division`);\n }\n const sectionSize = axisSize / indicesOrSections;\n splitIndices = [];\n for (let i = 1; i < indicesOrSections; i++) {\n splitIndices.push(i * sectionSize);\n }\n } else {\n // Split at specified indices\n splitIndices = indicesOrSections;\n }\n\n return splitAtIndices(storage, splitIndices, normalizedAxis);\n}\n\n/**\n * Split array into sub-arrays (allows unequal splits)\n */\nexport function arraySplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[],\n axis: number = 0\n): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n let splitIndices: number[];\n\n if (typeof indicesOrSections === 'number') {\n // Split into N sections (may be unequal)\n const numSections = indicesOrSections;\n const sectionSize = Math.floor(axisSize / numSections);\n const remainder = axisSize % numSections;\n\n splitIndices = [];\n let offset = 0;\n for (let i = 0; i < numSections - 1; i++) {\n offset += sectionSize + (i < remainder ? 1 : 0);\n splitIndices.push(offset);\n }\n } else {\n // Split at specified indices\n splitIndices = indicesOrSections;\n }\n\n return splitAtIndices(storage, splitIndices, normalizedAxis);\n}\n\n/**\n * Helper to split array at specified indices\n */\nfunction splitAtIndices(storage: ArrayStorage, indices: number[], axis: number): ArrayStorage[] {\n const shape = storage.shape;\n const axisSize = shape[axis]!;\n\n // Add boundaries\n const boundaries = [0, ...indices, axisSize];\n const result: ArrayStorage[] = [];\n\n for (let i = 0; i < boundaries.length - 1; i++) {\n const start = boundaries[i]!;\n const end = boundaries[i + 1]!;\n\n if (start > end) {\n throw new Error('split indices must be in ascending order');\n }\n\n // Create slice\n const sliceShape = Array.from(shape);\n sliceShape[axis] = end - start;\n\n // Calculate new offset and strides\n const newOffset = storage.offset + start * storage.strides[axis]!;\n\n result.push(\n ArrayStorage.fromData(\n storage.data,\n sliceShape,\n storage.dtype,\n Array.from(storage.strides),\n newOffset\n )\n );\n }\n\n return result;\n}\n\n/**\n * Split array vertically (row-wise)\n */\nexport function vsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 2) {\n throw new Error('vsplit only works on arrays of 2 or more dimensions');\n }\n return arraySplit(storage, indicesOrSections, 0);\n}\n\n/**\n * Split array horizontally (column-wise)\n */\nexport function hsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 1) {\n throw new Error('hsplit only works on arrays of 1 or more dimensions');\n }\n // For 1D arrays, split along axis 0; for higher dims, split along axis 1\n const axis = storage.ndim === 1 ? 0 : 1;\n return arraySplit(storage, indicesOrSections, axis);\n}\n\n/**\n * Tile array by repeating along each axis\n */\nexport function tile(storage: ArrayStorage, reps: number | number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize reps to array\n const repsArr = Array.isArray(reps) ? reps : [reps];\n\n // Pad reps or shape to match dimensions\n const maxDim = Math.max(ndim, repsArr.length);\n const paddedShape = new Array(maxDim).fill(1);\n const paddedReps = new Array(maxDim).fill(1);\n\n // Fill from the right\n for (let i = 0; i < ndim; i++) {\n paddedShape[maxDim - ndim + i] = shape[i]!;\n }\n for (let i = 0; i < repsArr.length; i++) {\n paddedReps[maxDim - repsArr.length + i] = repsArr[i]!;\n }\n\n // Calculate output shape\n const outputShape = paddedShape.map((s, i) => s * paddedReps[i]!);\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot tile array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // If we need to expand dimensions of input, reshape it\n let expandedStorage = storage;\n if (ndim < maxDim) {\n expandedStorage = reshape(storage, paddedShape);\n }\n\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n const expandedStrides = expandedStorage.strides;\n\n // Fill output by iterating through all output positions\n const outputIndices = new Array(maxDim).fill(0);\n\n for (let i = 0; i < outputSize; i++) {\n // Compute source flat index directly (wrap around for tiling)\n let sourceFlatIdx = expandedStorage.offset;\n for (let d = 0; d < maxDim; d++) {\n const sourceIdx = outputIndices[d]! % paddedShape[d]!;\n sourceFlatIdx += sourceIdx * expandedStrides[d]!;\n }\n\n // Read value directly from flat index\n const value = expandedStorage.data[sourceFlatIdx];\n\n // Write to output using direct index calculation\n let outputIdx = 0;\n for (let d = 0; d < maxDim; d++) {\n outputIdx += outputIndices[d]! * outputStrides[d]!;\n }\n\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputIdx] =\n value as number;\n }\n\n // Increment indices\n for (let d = maxDim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < outputShape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Repeat elements of an array\n */\nexport function repeat(\n storage: ArrayStorage,\n repeats: number | number[],\n axis?: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n if (axis === undefined) {\n // Flatten and repeat each element\n const flatSize = size;\n const repeatsArr = Array.isArray(repeats) ? repeats : new Array(flatSize).fill(repeats);\n\n if (repeatsArr.length !== flatSize) {\n throw new Error(\n `operands could not be broadcast together with shape (${flatSize},) (${repeatsArr.length},)`\n );\n }\n\n const outputSize = repeatsArr.reduce((a, b) => a + b, 0);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot repeat array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n let outIdx = 0;\n for (let i = 0; i < flatSize; i++) {\n const value = storage.iget(i);\n const rep = repeatsArr[i]!;\n for (let r = 0; r < rep; r++) {\n if (dtype === 'int64' || dtype === 'uint64') {\n (outputData as BigInt64Array | BigUint64Array)[outIdx++] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx++] =\n value as number;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, [outputSize], dtype);\n }\n\n // Repeat along specified axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const repeatsArr = Array.isArray(repeats) ? repeats : new Array(axisSize).fill(repeats);\n\n if (repeatsArr.length !== axisSize) {\n throw new Error(\n `operands could not be broadcast together with shape (${axisSize},) (${repeatsArr.length},)`\n );\n }\n\n // Calculate output shape\n const outputShape = Array.from(shape);\n outputShape[normalizedAxis] = repeatsArr.reduce((a, b) => a + b, 0);\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot repeat array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Iterate through source and write repeated values\n const sourceIndices = new Array(ndim).fill(0);\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n\n // Track cumulative positions along axis\n const axisPositions: number[] = [0];\n for (let i = 0; i < axisSize; i++) {\n axisPositions.push(axisPositions[i]! + repeatsArr[i]!);\n }\n\n for (let i = 0; i < size; i++) {\n // Use iget for flat index access instead of get(...indices)\n const value = storage.iget(i);\n const axisIdx = sourceIndices[normalizedAxis]!;\n const rep = repeatsArr[axisIdx]!;\n\n // Calculate base output index (without axis component)\n let baseOutIdx = 0;\n for (let d = 0; d < ndim; d++) {\n if (d !== normalizedAxis) {\n baseOutIdx += sourceIndices[d]! * outputStrides[d]!;\n }\n }\n\n // Write repeated values\n const axisStride = outputStrides[normalizedAxis]!;\n const axisStart = axisPositions[axisIdx]!;\n for (let r = 0; r < rep; r++) {\n const outIdx = baseOutIdx + (axisStart + r) * axisStride;\n\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] =\n value as number;\n }\n }\n\n // Increment source indices\n for (let d = ndim - 1; d >= 0; d--) {\n sourceIndices[d]++;\n if (sourceIndices[d]! < shape[d]!) {\n break;\n }\n sourceIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Reverse the order of elements in an array along given axis\n */\nexport function flip(storage: ArrayStorage, axis?: number | number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n // Determine which axes to flip\n let axesToFlip: Set<number>;\n if (axis === undefined) {\n // Flip all axes\n axesToFlip = new Set(Array.from({ length: ndim }, (_, i) => i));\n } else if (typeof axis === 'number') {\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n axesToFlip = new Set([normalizedAxis]);\n } else {\n axesToFlip = new Set(\n axis.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n })\n );\n }\n\n // Create output array\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot flip array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n // Fast path for 1D arrays\n if (ndim === 1 && storage.isCContiguous) {\n const sourceData = storage.data;\n const start = storage.offset;\n for (let i = 0; i < size; i++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = sourceData[\n start + size - 1 - i\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = sourceData[\n start + size - 1 - i\n ] as number;\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n // Fast path for 2D arrays\n if (ndim === 2 && storage.isCContiguous) {\n const rows = shape[0]!;\n const cols = shape[1]!;\n const sourceData = storage.data;\n const start = storage.offset;\n\n // Flipping both axes - reverse entire array\n if (axesToFlip.size === 2) {\n for (let i = 0; i < size; i++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = sourceData[\n start + size - 1 - i\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = sourceData[\n start + size - 1 - i\n ] as number;\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n if (axesToFlip.size === 1) {\n if (axesToFlip.has(0)) {\n // Flip rows: copy rows in reverse order\n for (let r = 0; r < rows; r++) {\n const sourceRowStart = start + (rows - 1 - r) * cols;\n const outputRowStart = r * cols;\n for (let c = 0; c < cols; c++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputRowStart + c] = sourceData[\n sourceRowStart + c\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[\n outputRowStart + c\n ] = sourceData[sourceRowStart + c] as number;\n }\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n } else if (axesToFlip.has(1)) {\n // Flip columns: reverse each row\n for (let r = 0; r < rows; r++) {\n const sourceRowStart = start + r * cols;\n const outputRowStart = r * cols;\n for (let c = 0; c < cols; c++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputRowStart + c] = sourceData[\n sourceRowStart + cols - 1 - c\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[\n outputRowStart + c\n ] = sourceData[sourceRowStart + cols - 1 - c] as number;\n }\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n }\n }\n\n // General path: element-by-element copy\n const sourceIndices = new Array(ndim);\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n // Compute source indices by flipping the specified axes\n for (let d = 0; d < ndim; d++) {\n sourceIndices[d] = axesToFlip.has(d) ? shape[d]! - 1 - outputIndices[d]! : outputIndices[d];\n }\n\n // Get value from source\n let sourceOffset = storage.offset;\n for (let d = 0; d < ndim; d++) {\n sourceOffset += sourceIndices[d]! * storage.strides[d]!;\n }\n const value = storage.data[sourceOffset];\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n\n // Increment output indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < shape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n}\n\n/**\n * Rotate array by 90 degrees in the plane specified by axes\n */\nexport function rot90(\n storage: ArrayStorage,\n k: number = 1,\n axes: [number, number] = [0, 1]\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n if (ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n\n // Normalize axes\n const axis0 = axes[0] < 0 ? ndim + axes[0] : axes[0];\n const axis1 = axes[1] < 0 ? ndim + axes[1] : axes[1];\n\n if (axis0 < 0 || axis0 >= ndim || axis1 < 0 || axis1 >= ndim) {\n throw new Error(`Axes are out of bounds for array of dimension ${ndim}`);\n }\n\n if (axis0 === axis1) {\n throw new Error('Axes must be different');\n }\n\n // Normalize k to 0-3\n k = ((k % 4) + 4) % 4;\n\n if (k === 0) {\n return storage.copy();\n }\n\n // Optimized: do the rotation in one pass instead of k iterations\n // k=1: flip axis1, transpose\n // k=2: flip both axes\n // k=3: flip axis0, transpose\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot rotate array with dtype ${dtype}`);\n }\n\n const outputShape = [...shape];\n if (k === 1 || k === 3) {\n // Swap dimensions for axis0 and axis1\n [outputShape[axis0], outputShape[axis1]] = [outputShape[axis1]!, outputShape[axis0]!];\n }\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n const isBigInt = isBigIntDType(dtype);\n\n const indices = new Array(ndim).fill(0);\n const sourceIndices = new Array(ndim);\n\n for (let i = 0; i < storage.size; i++) {\n // Transform indices based on k\n for (let d = 0; d < ndim; d++) {\n sourceIndices[d] = indices[d];\n }\n\n let outIdx0, outIdx1;\n if (k === 1) {\n // 90 degrees: flip axis1, then transpose\n outIdx0 = shape[axis1]! - 1 - indices[axis1]!;\n outIdx1 = indices[axis0];\n } else if (k === 2) {\n // 180 degrees: flip both axes\n outIdx0 = shape[axis0]! - 1 - indices[axis0]!;\n outIdx1 = shape[axis1]! - 1 - indices[axis1]!;\n sourceIndices[axis0] = outIdx0;\n sourceIndices[axis1] = outIdx1;\n } else {\n // k === 3, 270 degrees: flip axis0, then transpose\n outIdx0 = indices[axis1];\n outIdx1 = shape[axis0]! - 1 - indices[axis0]!;\n }\n\n if (k !== 2) {\n sourceIndices[axis0] = outIdx0;\n sourceIndices[axis1] = outIdx1;\n }\n\n // Compute output offset\n let outputOffset = 0;\n for (let d = 0; d < ndim; d++) {\n outputOffset += sourceIndices[d]! * outputStrides[d]!;\n }\n\n // Get source value\n const value = storage.iget(i);\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputOffset] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputOffset] =\n value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < shape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Roll array elements along a given axis\n */\nexport function roll(\n storage: ArrayStorage,\n shift: number | number[],\n axis?: number | number[]\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n // Handle no axis case - roll as flattened array\n if (axis === undefined) {\n const flatShift = Array.isArray(shift) ? shift.reduce((a, b) => a + b, 0) : shift;\n const flatStorage = flatten(storage);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot roll array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n for (let i = 0; i < size; i++) {\n const sourceIdx = (((i - flatShift) % size) + size) % size;\n const value = flatStorage.iget(sourceIdx);\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n // Reshape back to original shape\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n // Handle axis specified case\n const shifts = Array.isArray(shift) ? shift : [shift];\n const axes = Array.isArray(axis) ? axis : [axis];\n\n if (shifts.length !== axes.length) {\n throw new Error('shift and axis must have the same length');\n }\n\n // Normalize axes\n const normalizedAxes = axes.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n // Create output array\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot roll array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n // Iterate through all output positions\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n // Compute source indices by rolling back\n const sourceIndices = [...outputIndices];\n for (let j = 0; j < normalizedAxes.length; j++) {\n const ax = normalizedAxes[j]!;\n const axisSize = shape[ax]!;\n const sh = shifts[j]!;\n sourceIndices[ax] = (((sourceIndices[ax]! - sh) % axisSize) + axisSize) % axisSize;\n }\n\n // Get value from source\n let sourceOffset = storage.offset;\n for (let d = 0; d < ndim; d++) {\n sourceOffset += sourceIndices[d]! * storage.strides[d]!;\n }\n const value = storage.data[sourceOffset];\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n\n // Increment output indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < shape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n}\n\n/**\n * Roll the specified axis backwards until it lies in a given position\n */\nexport function rollaxis(storage: ArrayStorage, axis: number, start: number = 0): ArrayStorage {\n const ndim = storage.ndim;\n\n // Normalize axis\n let normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Normalize start\n let normalizedStart = start < 0 ? ndim + start : start;\n if (normalizedStart < 0 || normalizedStart > ndim) {\n throw new Error(`start ${start} is out of bounds`);\n }\n\n if (normalizedAxis < normalizedStart) {\n normalizedStart--;\n }\n\n if (normalizedAxis === normalizedStart) {\n return ArrayStorage.fromData(\n storage.data,\n Array.from(storage.shape),\n storage.dtype,\n Array.from(storage.strides),\n storage.offset\n );\n }\n\n return moveaxis(storage, normalizedAxis, normalizedStart);\n}\n\n/**\n * Split array along third axis (depth)\n */\nexport function dsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 3) {\n throw new Error('dsplit only works on arrays of 3 or more dimensions');\n }\n return arraySplit(storage, indicesOrSections, 2);\n}\n\n/**\n * Stack 1-D arrays as columns into a 2-D array\n */\nexport function columnStack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // If all arrays are 1D, reshape them to column vectors\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n return reshape(s, [s.shape[0]!, 1]);\n }\n return s;\n });\n\n return hstack(prepared);\n}\n\n/**\n * Stack arrays in sequence vertically (row_stack is an alias for vstack)\n */\nexport const rowStack = vstack;\n\n/**\n * Resize array to new shape (returns new array, may repeat or truncate)\n */\nexport function resize(storage: ArrayStorage, newShape: number[]): ArrayStorage {\n const dtype = storage.dtype;\n const newSize = newShape.reduce((a, b) => a * b, 1);\n const oldSize = storage.size;\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot resize array with dtype ${dtype}`);\n }\n const outputData = new Constructor(newSize);\n const isBigInt = isBigIntDType(dtype);\n\n // Fill output by cycling through source data\n for (let i = 0; i < newSize; i++) {\n const sourceIdx = i % oldSize;\n const value = storage.iget(sourceIdx);\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, newShape, dtype);\n}\n\n/**\n * Convert arrays to at least 1D\n */\nexport function atleast1d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n // 0-D array -> 1-D with one element\n return reshape(s, [1]);\n }\n return s;\n });\n}\n\n/**\n * Convert arrays to at least 2D\n */\nexport function atleast2d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n return reshape(s, [1, 1]);\n } else if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!]);\n }\n return s;\n });\n}\n\n/**\n * Convert arrays to at least 3D\n */\nexport function atleast3d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n return reshape(s, [1, 1, 1]);\n } else if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!, 1]);\n } else if (s.ndim === 2) {\n return reshape(s, [s.shape[0]!, s.shape[1]!, 1]);\n }\n return s;\n });\n}\n", "/**\n * Linear algebra operations\n *\n * Pure functions for matrix operations (matmul, etc.).\n * @module ops/linalg\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { promoteDTypes } from '../core/dtype';\nimport * as shapeOps from './shape';\n\n/**\n * BLAS-like types for matrix operations\n */\ntype Layout = 'row-major' | 'column-major';\ntype Transpose = 'no-transpose' | 'transpose';\n\n/**\n * Double-precision general matrix multiply (DGEMM)\n *\n * Full BLAS-compatible implementation without external dependencies.\n * Performs: C = alpha * op(A) * op(B) + beta * C\n *\n * Supports all combinations of:\n * - Row-major and column-major layouts\n * - Transpose and no-transpose operations\n * - Arbitrary alpha and beta scalars\n *\n * Uses specialized loops for each case to avoid function call overhead.\n *\n * @internal\n */\nfunction dgemm(\n layout: Layout,\n transA: Transpose,\n transB: Transpose,\n M: number, // rows of op(A) and C\n N: number, // cols of op(B) and C\n K: number, // cols of op(A) and rows of op(B)\n alpha: number, // scalar alpha\n A: Float64Array, // matrix A\n lda: number, // leading dimension of A\n B: Float64Array, // matrix B\n ldb: number, // leading dimension of B\n beta: number, // scalar beta\n C: Float64Array, // matrix C (output)\n ldc: number // leading dimension of C\n): void {\n // Apply beta scaling to C first\n if (beta === 0) {\n for (let i = 0; i < M * N; i++) {\n C[i] = 0;\n }\n } else if (beta !== 1) {\n for (let i = 0; i < M * N; i++) {\n C[i] = (C[i] ?? 0) * beta;\n }\n }\n\n // Select specialized loop based on layout and transpose modes\n // This avoids function call overhead in the hot loop\n const isRowMajor = layout === 'row-major';\n const transposeA = transA === 'transpose';\n const transposeB = transB === 'transpose';\n\n if (isRowMajor && !transposeA && !transposeB) {\n // Row-major, no transpose (most common case)\n // C[i,j] = sum_k A[i,k] * B[k,j]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && transposeA && !transposeB) {\n // Row-major, A transposed\n // C[i,j] = sum_k A[k,i] * B[k,j]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && !transposeA && transposeB) {\n // Row-major, B transposed\n // C[i,j] = sum_k A[i,k] * B[j,k]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && transposeA && transposeB) {\n // Row-major, both transposed\n // C[i,j] = sum_k A[k,i] * B[j,k]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && !transposeA && !transposeB) {\n // Column-major, no transpose\n // C[i,j] = sum_k A[i,k] * B[k,j]\n // Column-major: A[i,k] = A[k*lda + i], C[i,j] = C[j*ldc + i]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && transposeA && !transposeB) {\n // Column-major, A transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && !transposeA && transposeB) {\n // Column-major, B transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else {\n // Column-major, both transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n }\n}\n\n/**\n * Dot product of two arrays (fully NumPy-compatible)\n *\n * Behavior depends on input dimensions:\n * - 0D \u00B7 0D: Multiply scalars \u2192 scalar\n * - 0D \u00B7 ND or ND \u00B7 0D: Element-wise multiply \u2192 ND\n * - 1D \u00B7 1D: Inner product \u2192 scalar\n * - 2D \u00B7 2D: Matrix multiplication \u2192 2D\n * - 2D \u00B7 1D: Matrix-vector product \u2192 1D\n * - 1D \u00B7 2D: Vector-matrix product \u2192 1D\n * - ND \u00B7 1D (N\u22652): Sum product over last axis of a \u2192 (N-1)D\n * - 1D \u00B7 ND (N\u22652): Sum product over first axis of b \u2192 (N-1)D\n * - ND \u00B7 MD (N,M\u22652): Sum product over last axis of a and second-to-last of b \u2192 (N+M-2)D\n *\n * For 2D\u00B72D, prefer using matmul() instead.\n */\nexport function dot(a: ArrayStorage, b: ArrayStorage): ArrayStorage | number | bigint {\n const aDim = a.ndim;\n const bDim = b.ndim;\n\n // Case 0: Scalar (0D) cases - treat as multiplication\n if (aDim === 0 || bDim === 0) {\n // Get scalar values\n const aVal = aDim === 0 ? a.get() : null;\n const bVal = bDim === 0 ? b.get() : null;\n\n if (aDim === 0 && bDim === 0) {\n // Both scalars: multiply them\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n return aVal * bVal;\n }\n return Number(aVal) * Number(bVal);\n } else if (aDim === 0) {\n // a is scalar, b is array: scalar * array (element-wise)\n // Equivalent to multiply(a, b)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([...b.shape], resultDtype);\n for (let i = 0; i < b.size; i++) {\n const bData = b.data[i + b.offset];\n if (typeof aVal === 'bigint' && typeof bData === 'bigint') {\n result.data[i] = aVal * bData;\n } else {\n result.data[i] = Number(aVal) * Number(bData);\n }\n }\n return result;\n } else {\n // b is scalar, a is array: array * scalar (element-wise)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([...a.shape], resultDtype);\n for (let i = 0; i < a.size; i++) {\n const aData = a.data[i + a.offset];\n if (typeof aData === 'bigint' && typeof bVal === 'bigint') {\n result.data[i] = aData * bVal;\n } else {\n result.data[i] = Number(aData) * Number(bVal);\n }\n }\n return result;\n }\n }\n\n // Case 1: Both 1D -> scalar (inner product)\n if (aDim === 1 && bDim === 1) {\n if (a.shape[0] !== b.shape[0]) {\n throw new Error(`dot: incompatible shapes (${a.shape[0]},) and (${b.shape[0]},)`);\n }\n const n = a.shape[0]!;\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const aVal = a.get(i);\n const bVal = b.get(i);\n // Handle BigInt\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n return sum;\n }\n\n // Case 2: Both 2D -> matrix multiplication (delegate to matmul)\n if (aDim === 2 && bDim === 2) {\n return matmul(a, b);\n }\n\n // Case 3: 2D \u00B7 1D -> matrix-vector product (returns 1D)\n if (aDim === 2 && bDim === 1) {\n const [m, k] = a.shape;\n const n = b.shape[0]!;\n if (k !== n) {\n throw new Error(`dot: incompatible shapes (${m},${k}) and (${n},)`);\n }\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([m!], resultDtype);\n\n for (let i = 0; i < m!; i++) {\n let sum = 0;\n for (let j = 0; j < k!; j++) {\n const aVal = a.get(i, j);\n const bVal = b.get(j);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set([i], sum);\n }\n\n return result;\n }\n\n // Case 4: 1D \u00B7 2D -> vector-matrix product (returns 1D)\n if (aDim === 1 && bDim === 2) {\n const m = a.shape[0]!;\n const [k, n] = b.shape;\n if (m !== k) {\n throw new Error(`dot: incompatible shapes (${m},) and (${k},${n})`);\n }\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([n!], resultDtype);\n\n for (let j = 0; j < n!; j++) {\n let sum = 0;\n for (let i = 0; i < m; i++) {\n const aVal = a.get(i);\n const bVal = b.get(i, j);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set([j], sum);\n }\n\n return result;\n }\n\n // Case 5: ND \u00B7 1D (N > 2) -> sum product over last axis, result is (N-1)D\n if (aDim > 2 && bDim === 1) {\n const lastDimA = a.shape[aDim - 1]!;\n const bSize = b.shape[0]!;\n if (lastDimA !== bSize) {\n throw new Error(`dot: incompatible shapes ${JSON.stringify(a.shape)} and (${bSize},)`);\n }\n\n // Result shape is a.shape[:-1]\n const resultShape = [...a.shape.slice(0, -1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n // Iterate over all positions in result\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n for (let i = 0; i < resultSize; i++) {\n let sum = 0;\n // Compute multi-dimensional index for result\n let temp = i;\n const resultIdx: number[] = [];\n for (let d = resultShape.length - 1; d >= 0; d--) {\n resultIdx[d] = temp % resultShape[d]!;\n temp = Math.floor(temp / resultShape[d]!);\n }\n\n // Sum over the last dimension of a\n for (let k = 0; k < lastDimA; k++) {\n const aIdx = [...resultIdx, k];\n const aVal = a.get(...aIdx);\n const bVal = b.get(k);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set(resultIdx, sum);\n }\n\n return result;\n }\n\n // Case 6: 1D \u00B7 ND (N > 2) -> sum product over SECOND axis of b, result is (b.shape[0], b.shape[2:])\n // Actually for 1D\u00B73D: sum over axis 1 of b\n // For general case: need to handle this more carefully\n if (aDim === 1 && bDim > 2) {\n const aSize = a.shape[0]!;\n // For 1D (size K) \u00B7 ND, we contract over axis 1 of b (which should have size K)\n const contractAxisB = 1;\n const contractDimB = b.shape[contractAxisB]!;\n\n if (aSize !== contractDimB) {\n throw new Error(`dot: incompatible shapes (${aSize},) and ${JSON.stringify(b.shape)}`);\n }\n\n // Result shape: b.shape[0:1] + b.shape[2:]\n // For (K,) \u00B7 (L, K, M, N, ...) -> (L, M, N, ...)\n const resultShape = [...b.shape.slice(0, contractAxisB), ...b.shape.slice(contractAxisB + 1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n // Compute using multi-dimensional indices\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n for (let i = 0; i < resultSize; i++) {\n // Convert flat index to multi-dim result index\n let temp = i;\n const resultIdx: number[] = [];\n for (let d = resultShape.length - 1; d >= 0; d--) {\n resultIdx[d] = temp % resultShape[d]!;\n temp = Math.floor(temp / resultShape[d]!);\n }\n\n // Build b index by inserting the contract dimension\n // result[i,j,...] corresponds to b[i, :, j, ...]\n const bIdxBefore = resultIdx.slice(0, contractAxisB);\n const bIdxAfter = resultIdx.slice(contractAxisB);\n\n let sum = 0;\n for (let k = 0; k < aSize; k++) {\n const aVal = a.get(k);\n const bIdx = [...bIdxBefore, k, ...bIdxAfter];\n const bVal = b.get(...bIdx);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set(resultIdx, sum);\n }\n\n return result;\n }\n\n // Case 7: ND \u00B7 MD (N,M \u2265 2, not both 2) -> general tensor contraction\n // Result shape: a.shape[:-1] + b.shape[:-2] + b.shape[-1:]\n if (aDim >= 2 && bDim >= 2 && !(aDim === 2 && bDim === 2)) {\n const lastDimA = a.shape[aDim - 1]!;\n const secondLastDimB = b.shape[bDim - 2]!;\n\n if (lastDimA !== secondLastDimB) {\n throw new Error(\n `dot: incompatible shapes ${JSON.stringify(a.shape)} and ${JSON.stringify(b.shape)}`\n );\n }\n\n // Build result shape\n const resultShape = [...a.shape.slice(0, -1), ...b.shape.slice(0, -2), b.shape[bDim - 1]!];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const aOuterSize = a.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const bOuterSize = b.shape.slice(0, -2).reduce((acc, dim) => acc * dim, 1);\n const bLastDim = b.shape[bDim - 1]!;\n const contractionDim = lastDimA;\n\n // Iterate: result[i, j, k] = sum_m a[i, m] * b[j, m, k]\n for (let i = 0; i < aOuterSize; i++) {\n for (let j = 0; j < bOuterSize; j++) {\n for (let k = 0; k < bLastDim; k++) {\n let sum = 0;\n for (let m = 0; m < contractionDim; m++) {\n // Get a[i, m] - need to convert flat index i to multi-dim\n const aIdx = i * contractionDim + m;\n const aVal = a.data[aIdx + a.offset];\n\n // Get b[j, m, k] - need multi-dim indexing\n const bIdx = j * contractionDim * bLastDim + m * bLastDim + k;\n const bVal = b.data[bIdx + b.offset];\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n // Set result at the appropriate position\n const resultIdx = i * bOuterSize * bLastDim + j * bLastDim + k;\n result.data[resultIdx] = sum;\n }\n }\n }\n\n return result;\n }\n\n // Should never reach here - all cases covered\n throw new Error(`dot: unexpected combination of dimensions ${aDim}D \u00B7 ${bDim}D`);\n}\n\n/**\n * Matrix multiplication\n * Requires 2D arrays with compatible shapes\n *\n * Automatically detects transposed/non-contiguous arrays via strides\n * and uses appropriate DGEMM transpose parameters.\n *\n * Note: Currently uses float64 precision for all operations.\n * Integer inputs are promoted to float64 (matching NumPy behavior).\n */\nexport function matmul(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n if (a.ndim !== 2 || b.ndim !== 2) {\n throw new Error('matmul requires 2D arrays');\n }\n\n const [m = 0, k = 0] = a.shape;\n const [k2 = 0, n = 0] = b.shape;\n\n if (k !== k2) {\n throw new Error(`matmul shape mismatch: (${m},${k}) @ (${k2},${n})`);\n }\n\n // Determine result dtype (promote inputs, but use float64 for integer types)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const computeDtype =\n resultDtype.startsWith('int') || resultDtype.startsWith('uint') || resultDtype === 'bool'\n ? 'float64'\n : resultDtype;\n\n // For now, we only support float64 matmul (using dgemm)\n // TODO: Add float32 support using sgemm\n if (computeDtype !== 'float64') {\n throw new Error(`matmul currently only supports float64, got ${computeDtype}`);\n }\n\n // Convert inputs to Float64Array if needed\n let aData =\n a.dtype === 'float64'\n ? (a.data as Float64Array)\n : Float64Array.from(Array.from(a.data as ArrayLike<number>).map(Number));\n let bData =\n b.dtype === 'float64'\n ? (b.data as Float64Array)\n : Float64Array.from(Array.from(b.data as ArrayLike<number>).map(Number));\n\n // Handle offset for sliced arrays (views)\n // If the array has an offset, we need to pass the subarray starting from that offset\n if (a.offset > 0) {\n aData = aData.subarray(a.offset) as Float64Array;\n }\n if (b.offset > 0) {\n bData = bData.subarray(b.offset) as Float64Array;\n }\n\n // Detect array layout from strides\n // Row-major (C-contiguous): row stride > col stride\n // Transposed (F-contiguous or transposed view): col stride > row stride\n const [aStrideRow = 0, aStrideCol = 0] = a.strides;\n const [bStrideRow = 0, bStrideCol = 0] = b.strides;\n\n // Determine if arrays are effectively transposed\n // For a normal MxK array: strides are [K, 1] (row stride = K cols)\n // For a transposed KxM array (viewed as MxK): strides are [1, M] (col stride > row stride)\n const aIsTransposed = aStrideCol > aStrideRow;\n const bIsTransposed = bStrideCol > bStrideRow;\n\n const transA: Transpose = aIsTransposed ? 'transpose' : 'no-transpose';\n const transB: Transpose = bIsTransposed ? 'transpose' : 'no-transpose';\n\n // Determine leading dimensions based on memory layout\n // Leading dimension is the stride of the major dimension in memory\n let lda: number;\n let ldb: number;\n\n if (aIsTransposed) {\n // Array is stored with columns contiguous (F-order or transposed)\n // The leading dimension is how many elements to skip between columns\n lda = aStrideCol;\n } else {\n // Array is row-major (C-order)\n // The leading dimension is the row stride (number of elements per row)\n lda = aStrideRow;\n }\n\n if (bIsTransposed) {\n ldb = bStrideCol;\n } else {\n ldb = bStrideRow;\n }\n\n // Create result array (always row-major)\n const result = ArrayStorage.zeros([m, n], 'float64');\n\n // Call dgemm with detected transpose flags and leading dimensions\n dgemm(\n 'row-major',\n transA,\n transB,\n m,\n n,\n k,\n 1.0, // alpha\n aData,\n lda, // leading dimension of a (accounts for actual memory layout)\n bData,\n ldb, // leading dimension of b (accounts for actual memory layout)\n 0.0, // beta\n result.data as Float64Array,\n n // ldc (result is always row-major with n cols)\n );\n\n return result;\n}\n\n/**\n * Sum along the diagonal of a 2D array\n *\n * Computes the trace (sum of diagonal elements) of a matrix.\n * For non-square matrices, sums along the diagonal up to min(rows, cols).\n *\n * @param a - Input 2D array\n * @returns Sum of diagonal elements\n */\nexport function trace(a: ArrayStorage): number | bigint {\n if (a.ndim !== 2) {\n throw new Error(`trace requires 2D array, got ${a.ndim}D`);\n }\n\n const [rows = 0, cols = 0] = a.shape;\n const diagLen = Math.min(rows, cols);\n\n let sum: number | bigint = 0;\n\n for (let i = 0; i < diagLen; i++) {\n const val = a.get(i, i);\n if (typeof val === 'bigint') {\n sum = (typeof sum === 'bigint' ? sum : BigInt(sum)) + val;\n } else {\n sum = (typeof sum === 'bigint' ? Number(sum) : sum) + val;\n }\n }\n\n return sum;\n}\n\n/**\n * Permute the dimensions of an array\n *\n * Standalone version of NDArray.transpose() method.\n * Returns a view with axes permuted.\n *\n * @param a - Input array\n * @param axes - Optional permutation of axes (defaults to reverse order)\n * @returns Transposed view\n */\nexport function transpose(a: ArrayStorage, axes?: number[]): ArrayStorage {\n return shapeOps.transpose(a, axes);\n}\n\n/**\n * Inner product of two arrays\n *\n * Computes sum product over the LAST axes of both a and b.\n * - 1D \u00B7 1D: Same as dot (ordinary inner product) \u2192 scalar\n * - ND \u00B7 MD: Contracts last dimension of each \u2192 (*a.shape[:-1], *b.shape[:-1])\n *\n * Different from dot: always uses last axis of BOTH arrays.\n *\n * @param a - First array\n * @param b - Second array\n * @returns Inner product result\n */\nexport function inner(a: ArrayStorage, b: ArrayStorage): ArrayStorage | number | bigint {\n const aDim = a.ndim;\n const bDim = b.ndim;\n\n // Last dimensions must match\n const aLastDim = a.shape[aDim - 1]!;\n const bLastDim = b.shape[bDim - 1]!;\n\n if (aLastDim !== bLastDim) {\n throw new Error(\n `inner: incompatible shapes - last dimensions ${aLastDim} and ${bLastDim} don't match`\n );\n }\n\n // Special case: both 1D -> scalar\n if (aDim === 1 && bDim === 1) {\n return dot(a, b) as number;\n }\n\n // General case: result shape is a.shape[:-1] + b.shape[:-1]\n const resultShape = [...a.shape.slice(0, -1), ...b.shape.slice(0, -1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const aOuterSize = aDim === 1 ? 1 : a.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const bOuterSize = bDim === 1 ? 1 : b.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const contractionDim = aLastDim;\n\n // Compute: result[i, j] = sum_k a[i, k] * b[j, k]\n for (let i = 0; i < aOuterSize; i++) {\n for (let j = 0; j < bOuterSize; j++) {\n let sum = 0;\n for (let k = 0; k < contractionDim; k++) {\n // Get a[i, k] and b[j, k]\n const aIdx = aDim === 1 ? k : i * contractionDim + k;\n const bIdx = bDim === 1 ? k : j * contractionDim + k;\n const aVal = a.data[aIdx + a.offset];\n const bVal = b.data[bIdx + b.offset];\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n // Set result\n if (resultShape.length === 0) {\n // Scalar result\n return sum;\n }\n const resultIdx = aOuterSize === 1 ? j : i * bOuterSize + j;\n result.data[resultIdx] = sum;\n }\n }\n\n return result;\n}\n\n/**\n * Outer product of two vectors\n *\n * Computes out[i, j] = a[i] * b[j]\n * Input arrays are flattened if not 1D.\n *\n * @param a - First input (flattened to 1D)\n * @param b - Second input (flattened to 1D)\n * @returns 2D array of shape (a.size, b.size)\n */\nexport function outer(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n // Flatten inputs to 1D\n const aFlat = a.ndim === 1 ? a : shapeOps.ravel(a);\n const bFlat = b.ndim === 1 ? b : shapeOps.ravel(b);\n\n const m = aFlat.size;\n const n = bFlat.size;\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([m, n], resultDtype);\n\n // Compute outer product: result[i,j] = a[i] * b[j]\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n const aVal = aFlat.get(i);\n const bVal = bFlat.get(j);\n\n let product;\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n product = aVal * bVal;\n } else {\n product = Number(aVal) * Number(bVal);\n }\n\n result.set([i, j], product);\n }\n }\n\n return result;\n}\n\n/**\n * Tensor dot product along specified axes\n *\n * Computes sum product over specified axes.\n *\n * @param a - First array\n * @param b - Second array\n * @param axes - Axes to contract:\n * - Integer N: Contract last N axes of a with first N of b\n * - [a_axes, b_axes]: Contract specified axes\n * @returns Tensor dot product\n */\nexport function tensordot(\n a: ArrayStorage,\n b: ArrayStorage,\n axes: number | [number[], number[]]\n): ArrayStorage | number | bigint {\n let aAxes: number[];\n let bAxes: number[];\n\n if (typeof axes === 'number') {\n // Contract last N axes of a with first N of b\n const N = axes;\n if (N < 0) {\n throw new Error('tensordot: axes must be non-negative');\n }\n if (N > a.ndim || N > b.ndim) {\n throw new Error('tensordot: axes exceeds array dimensions');\n }\n\n // Last N axes of a\n aAxes = Array.from({ length: N }, (_, i) => a.ndim - N + i);\n // First N axes of b\n bAxes = Array.from({ length: N }, (_, i) => i);\n } else {\n [aAxes, bAxes] = axes;\n if (aAxes.length !== bAxes.length) {\n throw new Error('tensordot: axes lists must have same length');\n }\n }\n\n // Validate axes and check dimension compatibility\n for (let i = 0; i < aAxes.length; i++) {\n const aAxis = aAxes[i]!;\n const bAxis = bAxes[i]!;\n if (aAxis < 0 || aAxis >= a.ndim || bAxis < 0 || bAxis >= b.ndim) {\n throw new Error('tensordot: axis out of bounds');\n }\n if (a.shape[aAxis] !== b.shape[bAxis]) {\n throw new Error(\n `tensordot: shape mismatch on axes ${aAxis} and ${bAxis}: ${a.shape[aAxis]} != ${b.shape[bAxis]}`\n );\n }\n }\n\n // Separate axes into contracted and free axes\n const aFreeAxes: number[] = [];\n const bFreeAxes: number[] = [];\n\n for (let i = 0; i < a.ndim; i++) {\n if (!aAxes.includes(i)) {\n aFreeAxes.push(i);\n }\n }\n for (let i = 0; i < b.ndim; i++) {\n if (!bAxes.includes(i)) {\n bFreeAxes.push(i);\n }\n }\n\n // Build result shape: free axes of a + free axes of b\n const resultShape = [\n ...aFreeAxes.map((ax) => a.shape[ax]!),\n ...bFreeAxes.map((ax) => b.shape[ax]!),\n ];\n\n // Special case: no free axes (full contraction) -> scalar result\n if (resultShape.length === 0) {\n let sum = 0;\n // Iterate over all combinations of contracted axes\n const contractSize = aAxes.map((ax) => a.shape[ax]!).reduce((acc, dim) => acc * dim, 1);\n\n for (let i = 0; i < contractSize; i++) {\n // Convert flat index to contracted indices\n let temp = i;\n const contractedIdx: number[] = new Array(aAxes.length);\n for (let j = aAxes.length - 1; j >= 0; j--) {\n const ax = aAxes[j]!;\n contractedIdx[j] = temp % a.shape[ax]!;\n temp = Math.floor(temp / a.shape[ax]!);\n }\n\n // Build full indices for a and b\n const aIdx: number[] = new Array(a.ndim);\n const bIdx: number[] = new Array(b.ndim);\n\n for (let j = 0; j < aAxes.length; j++) {\n aIdx[aAxes[j]!] = contractedIdx[j]!;\n }\n for (let j = 0; j < bAxes.length; j++) {\n bIdx[bAxes[j]!] = contractedIdx[j]!;\n }\n\n const aVal = a.get(...aIdx);\n const bVal = b.get(...bIdx);\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n return sum;\n }\n\n // General case: with free axes\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n const contractSize = aAxes.map((ax) => a.shape[ax]!).reduce((acc, dim) => acc * dim, 1);\n\n // Iterate over all result positions\n for (let resIdx = 0; resIdx < resultSize; resIdx++) {\n // Convert flat result index to multi-dimensional\n let temp = resIdx;\n const resultIndices: number[] = [];\n for (let i = resultShape.length - 1; i >= 0; i--) {\n resultIndices[i] = temp % resultShape[i]!;\n temp = Math.floor(temp / resultShape[i]!);\n }\n\n // Extract indices for a's free axes and b's free axes\n const aFreeIndices = resultIndices.slice(0, aFreeAxes.length);\n const bFreeIndices = resultIndices.slice(aFreeAxes.length);\n\n let sum = 0;\n\n // Sum over all contracted axes\n for (let c = 0; c < contractSize; c++) {\n // Convert flat contracted index to multi-dimensional\n temp = c;\n const contractedIndices: number[] = [];\n for (let i = aAxes.length - 1; i >= 0; i--) {\n const ax = aAxes[i]!;\n contractedIndices[i] = temp % a.shape[ax]!;\n temp = Math.floor(temp / a.shape[ax]!);\n }\n\n // Build full indices for a and b\n const aFullIdx: number[] = new Array(a.ndim);\n const bFullIdx: number[] = new Array(b.ndim);\n\n // Fill in free axes\n for (let i = 0; i < aFreeAxes.length; i++) {\n aFullIdx[aFreeAxes[i]!] = aFreeIndices[i]!;\n }\n for (let i = 0; i < bFreeAxes.length; i++) {\n bFullIdx[bFreeAxes[i]!] = bFreeIndices[i]!;\n }\n\n // Fill in contracted axes\n for (let i = 0; i < aAxes.length; i++) {\n aFullIdx[aAxes[i]!] = contractedIndices[i]!;\n bFullIdx[bAxes[i]!] = contractedIndices[i]!;\n }\n\n const aVal = a.get(...aFullIdx);\n const bVal = b.get(...bFullIdx);\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n result.set(resultIndices, sum);\n }\n\n return result;\n}\n\n/**\n * Extract a diagonal or construct a diagonal array.\n *\n * NumPy behavior:\n * - For 2D arrays: extract the k-th diagonal\n * - For ND arrays (N >= 2): extract diagonal from the axes specified\n * - Returns a view when possible, copy otherwise\n *\n * @param a - Input array (must be at least 2D)\n * @param offset - Offset of the diagonal from the main diagonal (default: 0)\n * - offset > 0: diagonal above main diagonal\n * - offset < 0: diagonal below main diagonal\n * @param axis1 - First axis for ND arrays (default: 0)\n * @param axis2 - Second axis for ND arrays (default: 1)\n * @returns Array containing the diagonal elements\n */\nexport function diagonal(\n a: ArrayStorage,\n offset: number = 0,\n axis1: number = 0,\n axis2: number = 1\n): ArrayStorage {\n const shape = a.shape;\n const ndim = shape.length;\n\n if (ndim < 2) {\n throw new Error('diagonal requires an array of at least two dimensions');\n }\n\n // Normalize negative axes\n const ax1 = axis1 < 0 ? ndim + axis1 : axis1;\n const ax2 = axis2 < 0 ? ndim + axis2 : axis2;\n\n if (ax1 < 0 || ax1 >= ndim || ax2 < 0 || ax2 >= ndim) {\n throw new Error('axis out of bounds');\n }\n\n if (ax1 === ax2) {\n throw new Error('axis1 and axis2 cannot be the same');\n }\n\n // Get dimensions of the two axes\n const dim1 = shape[ax1]!;\n const dim2 = shape[ax2]!;\n\n // Calculate diagonal length\n let diagLen: number;\n if (offset >= 0) {\n diagLen = Math.max(0, Math.min(dim1, dim2 - offset));\n } else {\n diagLen = Math.max(0, Math.min(dim1 + offset, dim2));\n }\n\n // Build output shape: remove axis1 and axis2, append diagLen\n const outShape: number[] = [];\n for (let i = 0; i < ndim; i++) {\n if (i !== ax1 && i !== ax2) {\n outShape.push(shape[i]!);\n }\n }\n outShape.push(diagLen);\n\n // Create output array\n const result = ArrayStorage.zeros(outShape, a.dtype);\n\n // Extract diagonal elements\n // We need to iterate over all combinations of indices for other dimensions\n const otherDims = shape.filter((_, i) => i !== ax1 && i !== ax2);\n const otherSize = otherDims.reduce((acc, d) => acc * d, 1);\n\n for (let otherIdx = 0; otherIdx < otherSize; otherIdx++) {\n // Convert flat index to multi-dimensional indices for \"other\" dimensions\n let temp = otherIdx;\n const otherIndices: number[] = [];\n for (let i = otherDims.length - 1; i >= 0; i--) {\n otherIndices.unshift(temp % otherDims[i]!);\n temp = Math.floor(temp / otherDims[i]!);\n }\n\n // Extract diagonal for this slice\n for (let d = 0; d < diagLen; d++) {\n // Build source indices\n const srcIndices: number[] = new Array(ndim);\n let otherIdx2 = 0;\n for (let i = 0; i < ndim; i++) {\n if (i === ax1) {\n srcIndices[i] = offset >= 0 ? d : d - offset;\n } else if (i === ax2) {\n srcIndices[i] = offset >= 0 ? d + offset : d;\n } else {\n srcIndices[i] = otherIndices[otherIdx2++]!;\n }\n }\n\n // Build destination indices\n const dstIndices = [...otherIndices, d];\n\n // Copy element\n const value = a.get(...srcIndices);\n result.set(dstIndices, value);\n }\n }\n\n return result;\n}\n\n/**\n * Einstein summation convention\n *\n * Performs tensor contractions and reductions using Einstein summation notation.\n *\n * Examples:\n * - 'ij,jk->ik': matrix multiplication\n * - 'i,i->': dot product (inner product)\n * - 'ij->ji': transpose\n * - 'ii->': trace\n * - 'ij->j': sum over first axis\n * - 'ijk,ikl->ijl': batched matrix multiplication\n *\n * @param subscripts - Einstein summation subscripts (e.g., 'ij,jk->ik')\n * @param operands - Input arrays\n * @returns Result of the Einstein summation\n */\nexport function einsum(\n subscripts: string,\n ...operands: ArrayStorage[]\n): ArrayStorage | number | bigint {\n // Parse the subscripts\n const arrowMatch = subscripts.indexOf('->');\n\n let inputSubscripts: string;\n let outputSubscript: string;\n\n if (arrowMatch === -1) {\n // Implicit output: collect unique indices not repeated\n inputSubscripts = subscripts;\n outputSubscript = inferOutputSubscript(inputSubscripts);\n } else {\n inputSubscripts = subscripts.slice(0, arrowMatch);\n outputSubscript = subscripts.slice(arrowMatch + 2);\n }\n\n // Parse input subscripts into individual operand subscripts\n const operandSubscripts = inputSubscripts.split(',').map((s) => s.trim());\n\n if (operandSubscripts.length !== operands.length) {\n throw new Error(\n `einsum: expected ${operandSubscripts.length} operands, got ${operands.length}`\n );\n }\n\n // Validate subscripts and build index dimension map\n const indexDims = new Map<string, number>();\n\n for (let i = 0; i < operands.length; i++) {\n const sub = operandSubscripts[i]!;\n const op = operands[i]!;\n\n if (sub.length !== op.ndim) {\n throw new Error(\n `einsum: operand ${i} has ${op.ndim} dimensions but subscript '${sub}' has ${sub.length} indices`\n );\n }\n\n for (let j = 0; j < sub.length; j++) {\n const idx = sub[j]!;\n const dim = op.shape[j]!;\n\n if (indexDims.has(idx)) {\n if (indexDims.get(idx) !== dim) {\n throw new Error(\n `einsum: size mismatch for index '${idx}': ${indexDims.get(idx)} vs ${dim}`\n );\n }\n } else {\n indexDims.set(idx, dim);\n }\n }\n }\n\n // Validate output subscript\n for (const idx of outputSubscript) {\n if (!indexDims.has(idx)) {\n throw new Error(`einsum: output subscript contains unknown index '${idx}'`);\n }\n }\n\n // Identify summation indices (in inputs but not in output)\n const outputIndices = new Set(outputSubscript);\n const allInputIndices = new Set<string>();\n for (const sub of operandSubscripts) {\n for (const idx of sub) {\n allInputIndices.add(idx);\n }\n }\n\n const sumIndices: string[] = [];\n for (const idx of allInputIndices) {\n if (!outputIndices.has(idx)) {\n sumIndices.push(idx);\n }\n }\n\n // ========================================\n // FAST PATHS: Detect common patterns and delegate to optimized implementations\n // ========================================\n\n // Pattern: Matrix multiplication \"ij,jk->ik\" or similar\n if (operands.length === 2 && operandSubscripts.length === 2) {\n const [sub1, sub2] = operandSubscripts;\n const [op1, op2] = operands;\n\n // Check for matmul pattern: two 2D arrays, one shared index\n if (\n sub1!.length === 2 &&\n sub2!.length === 2 &&\n outputSubscript.length === 2 &&\n op1!.ndim === 2 &&\n op2!.ndim === 2\n ) {\n const [i1, j1] = [sub1![0]!, sub1![1]!];\n const [i2, j2] = [sub2![0]!, sub2![1]!];\n const [o1, o2] = [outputSubscript[0]!, outputSubscript[1]!];\n\n // Pattern: \"ij,jk->ik\" (standard matmul)\n if (i1 === o1 && j2 === o2 && j1 === i2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n return matmul(op1!, op2!);\n }\n\n // Pattern: \"ik,kj->ij\" (matmul with different index names)\n if (i1 === o1 && j2 === o2 && j1 === i2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n return matmul(op1!, op2!);\n }\n\n // Pattern: \"ji,jk->ik\" (transpose A then multiply)\n if (j1 === o1 && j2 === o2 && i1 === i2 && sumIndices.length === 1 && sumIndices[0] === i1) {\n const op1T = transpose(op1!);\n return matmul(op1T, op2!);\n }\n\n // Pattern: \"ij,kj->ik\" (transpose B then multiply)\n if (i1 === o1 && i2 === o2 && j1 === j2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n const op2T = transpose(op2!);\n return matmul(op1!, op2T);\n }\n }\n\n // Check for dot product pattern: two 1D arrays \"i,i->\" or \"i,i->scalar\"\n if (\n sub1!.length === 1 &&\n sub2!.length === 1 &&\n sub1 === sub2 &&\n outputSubscript.length === 0 &&\n op1!.ndim === 1 &&\n op2!.ndim === 1\n ) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n\n // Check for outer product pattern: \"i,j->ij\"\n if (\n sub1 &&\n sub2 &&\n sub1.length === 1 &&\n sub2.length === 1 &&\n outputSubscript.length === 2 &&\n outputSubscript === sub1 + sub2 &&\n sumIndices.length === 0 &&\n op1!.ndim === 1 &&\n op2!.ndim === 1\n ) {\n return outer(op1!, op2!);\n }\n }\n\n // Pattern: Single operand trace \"ii->\"\n if (operands.length === 1 && operandSubscripts[0]!.length === 2 && outputSubscript.length === 0) {\n const sub = operandSubscripts[0]!;\n if (sub[0] === sub[1]) {\n // This is a trace operation\n const op = operands[0]!;\n if (op.ndim === 2) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n }\n }\n\n // ========================================\n // END FAST PATHS - Fall through to generic implementation\n // ========================================\n\n // Build output shape\n const outputShape = Array.from(outputSubscript).map((idx) => indexDims.get(idx)!);\n\n // Special case: scalar output\n if (outputShape.length === 0) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n\n // Determine result dtype\n let resultDtype = operands[0]!.dtype;\n for (let i = 1; i < operands.length; i++) {\n resultDtype = promoteDTypes(resultDtype, operands[i]!.dtype);\n }\n\n // Create output array\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n\n // Compute output size\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n // Compute sum range\n let sumSize = 1;\n for (const idx of sumIndices) {\n sumSize *= indexDims.get(idx)!;\n }\n\n // Iterate over all output positions\n for (let outIdx = 0; outIdx < outputSize; outIdx++) {\n // Convert flat index to multi-dimensional output index\n const outMultiIdx = flatToMulti(outIdx, outputShape);\n\n // Build index assignment for output indices\n const indexValues = new Map<string, number>();\n for (let i = 0; i < outputSubscript.length; i++) {\n indexValues.set(outputSubscript[i]!, outMultiIdx[i]!);\n }\n\n // Sum over summation indices\n let sum = 0;\n for (let sumIdx = 0; sumIdx < sumSize; sumIdx++) {\n // Assign values to summation indices\n let temp = sumIdx;\n for (let i = sumIndices.length - 1; i >= 0; i--) {\n const idx = sumIndices[i]!;\n const dim = indexDims.get(idx)!;\n indexValues.set(idx, temp % dim);\n temp = Math.floor(temp / dim);\n }\n\n // Compute product of all operand values\n let product = 1;\n for (let i = 0; i < operands.length; i++) {\n const op = operands[i]!;\n const sub = operandSubscripts[i]!;\n\n // Build operand index\n const opIdx: number[] = [];\n for (const idx of sub) {\n opIdx.push(indexValues.get(idx)!);\n }\n\n const val = op.get(...opIdx);\n product *= Number(val);\n }\n\n sum += product;\n }\n\n result.set(outMultiIdx, sum);\n }\n\n return result;\n}\n\n/**\n * Infer output subscript for implicit einsum notation\n * @private\n */\nfunction inferOutputSubscript(inputSubscripts: string): string {\n // Count occurrences of each index\n const counts = new Map<string, number>();\n const operandSubscripts = inputSubscripts.split(',');\n\n for (const sub of operandSubscripts) {\n for (const idx of sub.trim()) {\n counts.set(idx, (counts.get(idx) || 0) + 1);\n }\n }\n\n // Output contains indices that appear exactly once, sorted alphabetically\n const outputIndices: string[] = [];\n for (const [idx, count] of counts) {\n if (count === 1) {\n outputIndices.push(idx);\n }\n }\n\n return outputIndices.sort().join('');\n}\n\n/**\n * Compute einsum result when output is a scalar\n * @private\n */\nfunction computeEinsumScalar(\n operands: ArrayStorage[],\n operandSubscripts: string[],\n sumIndices: string[],\n indexDims: Map<string, number>\n): number {\n // All indices are summation indices\n let sumSize = 1;\n for (const idx of sumIndices) {\n sumSize *= indexDims.get(idx)!;\n }\n\n let sum = 0;\n\n for (let sumIdx = 0; sumIdx < sumSize; sumIdx++) {\n // Assign values to summation indices\n const indexValues = new Map<string, number>();\n let temp = sumIdx;\n for (let i = sumIndices.length - 1; i >= 0; i--) {\n const idx = sumIndices[i]!;\n const dim = indexDims.get(idx)!;\n indexValues.set(idx, temp % dim);\n temp = Math.floor(temp / dim);\n }\n\n // Compute product of all operand values\n let product = 1;\n for (let i = 0; i < operands.length; i++) {\n const op = operands[i]!;\n const sub = operandSubscripts[i]!;\n\n // Build operand index\n const opIdx: number[] = [];\n for (const idx of sub) {\n opIdx.push(indexValues.get(idx)!);\n }\n\n const val = op.get(...opIdx);\n product *= Number(val);\n }\n\n sum += product;\n }\n\n return sum;\n}\n\n/**\n * Convert flat index to multi-dimensional index\n * @private\n */\nfunction flatToMulti(flatIdx: number, shape: number[]): number[] {\n const result: number[] = new Array(shape.length);\n let temp = flatIdx;\n\n for (let i = shape.length - 1; i >= 0; i--) {\n result[i] = temp % shape[i]!;\n temp = Math.floor(temp / shape[i]!);\n }\n\n return result;\n}\n\n/**\n * Kronecker product of two arrays.\n *\n * Computes the Kronecker product, a composite array made of blocks of the\n * second array scaled by the elements of the first.\n *\n * NumPy behavior:\n * - If both inputs are vectors (1D), output is also a vector\n * - If both inputs are 2D matrices, output shape is (m1*m2, n1*n2)\n * - General case: broadcasts shapes then computes block product\n *\n * @param a - First input array\n * @param b - Second input array\n * @returns Kronecker product of a and b\n */\nexport function kron(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const aShape = a.shape;\n const bShape = b.shape;\n const aNdim = aShape.length;\n const bNdim = bShape.length;\n\n // Promote dtypes\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n\n // Determine output shape\n const ndim = Math.max(aNdim, bNdim);\n const outShape: number[] = new Array(ndim);\n\n // Pad shapes with ones on the left if needed\n const aPadded: number[] = new Array(ndim).fill(1);\n const bPadded: number[] = new Array(ndim).fill(1);\n\n for (let i = 0; i < aNdim; i++) {\n aPadded[ndim - aNdim + i] = aShape[i]!;\n }\n for (let i = 0; i < bNdim; i++) {\n bPadded[ndim - bNdim + i] = bShape[i]!;\n }\n\n // Output shape is element-wise product\n for (let i = 0; i < ndim; i++) {\n outShape[i] = aPadded[i]! * bPadded[i]!;\n }\n\n // Create result array\n const result = ArrayStorage.zeros(outShape, resultDtype);\n\n // Compute total number of elements in each array\n const aSize = aShape.reduce((acc, d) => acc * d, 1);\n const bSize = bShape.reduce((acc, d) => acc * d, 1);\n\n // Nested loop approach: for each element in a, scale all of b\n for (let aIdx = 0; aIdx < aSize; aIdx++) {\n // Convert flat index to multi-dimensional index for a\n let temp = aIdx;\n const aIndices: number[] = new Array(aNdim);\n for (let i = aNdim - 1; i >= 0; i--) {\n aIndices[i] = temp % aShape[i]!;\n temp = Math.floor(temp / aShape[i]!);\n }\n\n // Pad aIndices to match ndim\n const aIndicesPadded: number[] = new Array(ndim).fill(0);\n for (let i = 0; i < aNdim; i++) {\n aIndicesPadded[ndim - aNdim + i] = aIndices[i]!;\n }\n\n const aVal = a.get(...aIndices);\n\n // For each element in b\n for (let bIdx = 0; bIdx < bSize; bIdx++) {\n // Convert flat index to multi-dimensional index for b\n let temp2 = bIdx;\n const bIndices: number[] = new Array(bNdim);\n for (let i = bNdim - 1; i >= 0; i--) {\n bIndices[i] = temp2 % bShape[i]!;\n temp2 = Math.floor(temp2 / bShape[i]!);\n }\n\n // Pad bIndices to match ndim\n const bIndicesPadded: number[] = new Array(ndim).fill(0);\n for (let i = 0; i < bNdim; i++) {\n bIndicesPadded[ndim - bNdim + i] = bIndices[i]!;\n }\n\n const bVal = b.get(...bIndices);\n\n // Compute output index: each dimension is aIdx*bDim + bIdx\n const outIndices: number[] = new Array(ndim);\n for (let i = 0; i < ndim; i++) {\n outIndices[i] = aIndicesPadded[i]! * bPadded[i]! + bIndicesPadded[i]!;\n }\n\n // Compute product and store\n const product =\n typeof aVal === 'bigint' || typeof bVal === 'bigint'\n ? BigInt(Number(aVal)) * BigInt(Number(bVal))\n : Number(aVal) * Number(bVal);\n\n result.set(outIndices, product);\n }\n }\n\n return result;\n}\n", "/**\n * Exponential, logarithmic, and power operations\n *\n * Pure functions for element-wise exponential operations:\n * exp, log, sqrt, power, etc.\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp, elementwiseBinaryOp } from '../internal/compute';\nimport { isBigIntDType } from '../core/dtype';\n\n/**\n * Square root of each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with sqrt applied\n */\nexport function sqrt(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sqrt, false); // false = promote integers to float64\n}\n\n/**\n * Raise elements to power\n * NumPy behavior: Promotes to float64 for integer types with non-integer exponents\n *\n * @param a - Base array storage\n * @param b - Exponent (array storage or scalar)\n * @returns Result storage with power applied\n */\nexport function power(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return powerScalar(a, b);\n }\n return elementwiseBinaryOp(a, b, Math.pow, 'power');\n}\n\n/**\n * Power with scalar exponent (optimized path)\n * @private\n */\nfunction powerScalar(storage: ArrayStorage, exponent: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: integer ** integer stays integer if exponent >= 0\n // integer ** negative or float exponent promotes to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const needsFloatPromotion = isIntegerType && (exponent < 0 || !Number.isInteger(exponent));\n const resultDtype = needsFloatPromotion ? 'float64' : dtype;\n\n // Create result with appropriate dtype\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n if (isBigIntDType(resultDtype) && Number.isInteger(exponent) && exponent >= 0) {\n // BigInt ** positive integer stays BigInt\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! ** BigInt(exponent);\n }\n } else {\n // BigInt ** negative or float promotes to float64\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.pow(Number(data[i]!), exponent);\n }\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.pow(Number(data[i]!), exponent);\n }\n }\n\n return result;\n}\n", "/**\n * Trigonometric operations\n *\n * Pure functions for element-wise trigonometric operations:\n * sin, cos, tan, arcsin, arccos, arctan, arctan2, hypot, degrees, radians\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp } from '../internal/compute';\nimport { isBigIntDType } from '../core/dtype';\n\n/**\n * Sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with sin applied\n */\nexport function sin(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sin, false);\n}\n\n/**\n * Cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with cos applied\n */\nexport function cos(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.cos, false);\n}\n\n/**\n * Tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with tan applied\n */\nexport function tan(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.tan, false);\n}\n\n/**\n * Inverse sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range [-1, 1])\n * @returns Result storage with arcsin applied (radians)\n */\nexport function arcsin(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.asin, false);\n}\n\n/**\n * Inverse cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range [-1, 1])\n * @returns Result storage with arccos applied (radians)\n */\nexport function arccos(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.acos, false);\n}\n\n/**\n * Inverse tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with arctan applied (radians)\n */\nexport function arctan(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.atan, false);\n}\n\n/**\n * Element-wise arc tangent of x1/x2 choosing the quadrant correctly.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - y-coordinates\n * @param x2 - x-coordinates (array storage or scalar)\n * @returns Angle in radians between -\u03C0 and \u03C0\n */\nexport function arctan2(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return arctan2Scalar(x1, x2);\n }\n return arctan2Array(x1, x2);\n}\n\n/**\n * arctan2 with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction arctan2Array(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const shape = Array.from(x1.shape);\n const size = x1.size;\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for arctan2 (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.data[i]!) : Number(x1.data[i]!);\n const val2 = isBigIntDType(dtype2) ? Number(x2.data[i]!) : Number(x2.data[i]!);\n resultData[i] = Math.atan2(val1, val2);\n }\n\n return result;\n}\n\n/**\n * arctan2 with scalar x2 (optimized path)\n * @private\n */\nfunction arctan2Scalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Always promote to float64 for trig operations\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.atan2(Number(data[i]!), x2);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.atan2(Number(data[i]!), x2);\n }\n }\n\n return result;\n}\n\n/**\n * Given the \"legs\" of a right triangle, return its hypotenuse.\n * Equivalent to sqrt(x1**2 + x2**2), element-wise.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - First leg\n * @param x2 - Second leg (array storage or scalar)\n * @returns Hypotenuse\n */\nexport function hypot(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return hypotScalar(x1, x2);\n }\n return hypotArray(x1, x2);\n}\n\n/**\n * hypot with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction hypotArray(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const shape = Array.from(x1.shape);\n const size = x1.size;\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for hypot (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.data[i]!) : Number(x1.data[i]!);\n const val2 = isBigIntDType(dtype2) ? Number(x2.data[i]!) : Number(x2.data[i]!);\n resultData[i] = Math.hypot(val1, val2);\n }\n\n return result;\n}\n\n/**\n * hypot with scalar x2 (optimized path)\n * @private\n */\nfunction hypotScalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Always promote to float64 for trig operations\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.hypot(Number(data[i]!), x2);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.hypot(Number(data[i]!), x2);\n }\n }\n\n return result;\n}\n\n/**\n * Convert angles from radians to degrees.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Angles in degrees\n */\nexport function degrees(a: ArrayStorage): ArrayStorage {\n const factor = 180 / Math.PI;\n return elementwiseUnaryOp(a, (x) => x * factor, false);\n}\n\n/**\n * Convert angles from degrees to radians.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in degrees)\n * @returns Angles in radians\n */\nexport function radians(a: ArrayStorage): ArrayStorage {\n const factor = Math.PI / 180;\n return elementwiseUnaryOp(a, (x) => x * factor, false);\n}\n\n/**\n * Convert angles from degrees to radians (alias for radians).\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in degrees)\n * @returns Angles in radians\n */\nexport function deg2rad(a: ArrayStorage): ArrayStorage {\n return radians(a);\n}\n\n/**\n * Convert angles from radians to degrees (alias for degrees).\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Angles in degrees\n */\nexport function rad2deg(a: ArrayStorage): ArrayStorage {\n return degrees(a);\n}\n", "/**\n * Hyperbolic operations\n *\n * Pure functions for element-wise hyperbolic operations:\n * sinh, cosh, tanh, arcsinh, arccosh, arctanh\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp } from '../internal/compute';\n\n/**\n * Hyperbolic sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with sinh applied\n */\nexport function sinh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sinh, false);\n}\n\n/**\n * Hyperbolic cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with cosh applied\n */\nexport function cosh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.cosh, false);\n}\n\n/**\n * Hyperbolic tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with tanh applied\n */\nexport function tanh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.tanh, false);\n}\n\n/**\n * Inverse hyperbolic sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with arcsinh applied\n */\nexport function arcsinh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.asinh, false);\n}\n\n/**\n * Inverse hyperbolic cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values >= 1)\n * @returns Result storage with arccosh applied\n */\nexport function arccosh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.acosh, false);\n}\n\n/**\n * Inverse hyperbolic tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range (-1, 1))\n * @returns Result storage with arctanh applied\n */\nexport function arctanh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.atanh, false);\n}\n", "/**\n * Advanced array operations\n *\n * Broadcasting, indexing, and comparison functions.\n * @module ops/advanced\n */\n\nimport { ArrayStorage, computeStrides } from '../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type TypedArray } from '../core/dtype';\nimport { computeBroadcastShape, broadcastTo, broadcastShapes } from '../core/broadcasting';\n\n/**\n * Broadcast an array to a given shape\n * Returns a read-only view on the original array\n */\nexport function broadcast_to(storage: ArrayStorage, targetShape: number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n\n if (targetNdim < ndim) {\n throw new Error(`input operand has more dimensions than allowed by the axis remapping`);\n }\n\n // Validate that broadcasting is possible\n const broadcastedShape = computeBroadcastShape([Array.from(shape), targetShape]);\n if (broadcastedShape === null) {\n throw new Error(\n `operands could not be broadcast together with shape (${shape.join(',')}) (${targetShape.join(',')})`\n );\n }\n\n // Check result matches target\n for (let i = 0; i < targetNdim; i++) {\n if (broadcastedShape[i] !== targetShape[i]) {\n throw new Error(\n `operands could not be broadcast together with shape (${shape.join(',')}) (${targetShape.join(',')})`\n );\n }\n }\n\n return broadcastTo(storage, targetShape);\n}\n\n/**\n * Broadcast multiple arrays to a common shape\n * Returns views on the original arrays\n */\nexport function broadcast_arrays(storages: ArrayStorage[]): ArrayStorage[] {\n if (storages.length === 0) {\n return [];\n }\n\n if (storages.length === 1) {\n return [storages[0]!];\n }\n\n // Compute broadcast shape\n const shapes = storages.map((s) => Array.from(s.shape));\n const targetShape = computeBroadcastShape(shapes);\n\n if (targetShape === null) {\n throw new Error(\n `operands could not be broadcast together with shapes ${shapes.map((s) => `(${s.join(',')})`).join(' ')}`\n );\n }\n\n // Broadcast each array to the target shape\n return storages.map((s) => broadcastTo(s, targetShape));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes\n * Re-export from core/broadcasting for convenience\n */\nexport { broadcastShapes as broadcast_shapes };\n\n/**\n * Take elements from an array along an axis\n */\nexport function take(storage: ArrayStorage, indices: number[], axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n if (axis === undefined) {\n // Flatten and take\n const flatSize = storage.size;\n\n // Validate indices\n for (const idx of indices) {\n const normalizedIdx = idx < 0 ? flatSize + idx : idx;\n if (normalizedIdx < 0 || normalizedIdx >= flatSize) {\n throw new Error(`index ${idx} is out of bounds for axis 0 with size ${flatSize}`);\n }\n }\n\n // Create output array\n const outputSize = indices.length;\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take from array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n for (let i = 0; i < outputSize; i++) {\n let idx = indices[i]!;\n if (idx < 0) idx = flatSize + idx;\n const value = storage.iget(idx);\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, [outputSize], dtype);\n }\n\n // Take along specified axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Validate indices\n for (const idx of indices) {\n const normalizedIdx = idx < 0 ? axisSize + idx : idx;\n if (normalizedIdx < 0 || normalizedIdx >= axisSize) {\n throw new Error(\n `index ${idx} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n }\n\n // Calculate output shape\n const outputShape = Array.from(shape);\n outputShape[normalizedAxis] = indices.length;\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take from array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Iterate through output positions\n const outputIndices = new Array(ndim).fill(0);\n for (let i = 0; i < outputSize; i++) {\n // Compute source index\n const sourceIndices = [...outputIndices];\n let targetIdx = outputIndices[normalizedAxis]!;\n let sourceAxisIdx = indices[targetIdx]!;\n if (sourceAxisIdx < 0) sourceAxisIdx = axisSize + sourceAxisIdx;\n sourceIndices[normalizedAxis] = sourceAxisIdx;\n\n const value = storage.get(...sourceIndices);\n\n // Write to output\n let outIdx = 0;\n for (let d = 0; d < ndim; d++) {\n outIdx += outputIndices[d]! * outputStrides[d]!;\n }\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < outputShape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Put values at specified indices (modifies array in-place)\n */\nexport function put(\n storage: ArrayStorage,\n indices: number[],\n values: ArrayStorage | number | bigint\n): void {\n const flatSize = storage.size;\n const dtype = storage.dtype;\n\n // Get values to put\n let valueArray: (number | bigint)[];\n if (typeof values === 'number' || typeof values === 'bigint') {\n valueArray = new Array(indices.length).fill(values);\n } else {\n // Extract values from storage\n valueArray = [];\n for (let i = 0; i < values.size; i++) {\n valueArray.push(values.iget(i));\n }\n // Broadcast values if needed\n if (valueArray.length === 1) {\n valueArray = new Array(indices.length).fill(valueArray[0]);\n } else if (valueArray.length !== indices.length) {\n // Tile values to match indices length\n const original = [...valueArray];\n valueArray = [];\n for (let i = 0; i < indices.length; i++) {\n valueArray.push(original[i % original.length]!);\n }\n }\n }\n\n // Put values at indices\n for (let i = 0; i < indices.length; i++) {\n let idx = indices[i]!;\n if (idx < 0) idx = flatSize + idx;\n\n if (idx < 0 || idx >= flatSize) {\n throw new Error(`index ${indices[i]} is out of bounds for axis 0 with size ${flatSize}`);\n }\n\n let value = valueArray[i]!;\n\n // Convert value to appropriate type\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(idx, value);\n }\n}\n\n/**\n * Construct array from index array and choices\n */\nexport function choose(indexStorage: ArrayStorage, choices: ArrayStorage[]): ArrayStorage {\n if (choices.length === 0) {\n throw new Error('choices cannot be empty');\n }\n\n const indexShape = indexStorage.shape;\n const numChoices = choices.length;\n const dtype = choices[0]!.dtype;\n\n // Validate that all choices have compatible shapes\n const shapes = choices.map((c) => Array.from(c.shape));\n shapes.unshift(Array.from(indexShape));\n const broadcastedShape = computeBroadcastShape(shapes);\n\n if (broadcastedShape === null) {\n throw new Error('operands could not be broadcast together');\n }\n\n // Broadcast index array and choices to common shape\n const broadcastedIndex = broadcastTo(indexStorage, broadcastedShape);\n const broadcastedChoices = choices.map((c) => broadcastTo(c, broadcastedShape));\n\n // Create output array\n const outputSize = broadcastedShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot choose with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n // Fill output\n for (let i = 0; i < outputSize; i++) {\n const choiceIdx = Number(broadcastedIndex.iget(i));\n\n if (choiceIdx < 0 || choiceIdx >= numChoices) {\n throw new Error(`index ${choiceIdx} is out of bounds for axis 0 with size ${numChoices}`);\n }\n\n const value = broadcastedChoices[choiceIdx]!.iget(i);\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, broadcastedShape, dtype);\n}\n\n/**\n * Check if two arrays are element-wise equal\n */\nexport function array_equal(a: ArrayStorage, b: ArrayStorage, equal_nan: boolean = false): boolean {\n // Check shapes match\n if (a.ndim !== b.ndim) {\n return false;\n }\n\n for (let i = 0; i < a.ndim; i++) {\n if (a.shape[i] !== b.shape[i]) {\n return false;\n }\n }\n\n // Check all elements\n const size = a.size;\n for (let i = 0; i < size; i++) {\n const aVal = a.iget(i);\n const bVal = b.iget(i);\n\n // Handle NaN comparison\n if (equal_nan) {\n const aIsNaN = typeof aVal === 'number' && Number.isNaN(aVal);\n const bIsNaN = typeof bVal === 'number' && Number.isNaN(bVal);\n if (aIsNaN && bIsNaN) {\n continue;\n }\n }\n\n if (aVal !== bVal) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Take values along an axis using 1D index array\n */\nexport function take_along_axis(\n storage: ArrayStorage,\n indices: ArrayStorage,\n axis: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // indices must have same ndim as storage\n const indicesShape = indices.shape;\n if (indicesShape.length !== ndim) {\n throw new Error(\n `indices and arr must have the same number of dimensions, got ${indicesShape.length} vs ${ndim}`\n );\n }\n\n // Check that non-axis dimensions match (or are broadcastable with 1)\n for (let i = 0; i < ndim; i++) {\n if (i !== normalizedAxis) {\n if (indicesShape[i] !== shape[i] && indicesShape[i] !== 1 && shape[i] !== 1) {\n throw new Error(\n `index ${indicesShape[i]} is out of bounds for size ${shape[i]} in dimension ${i}`\n );\n }\n }\n }\n\n // Output shape matches indices shape\n const outputShape = Array.from(indicesShape);\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take_along_axis with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const inputStrides = computeStrides(shape);\n const indicesStrides = computeStrides(indicesShape);\n\n const axisSize = shape[normalizedAxis]!;\n\n // Iterate through output positions\n for (let outIdx = 0; outIdx < outputSize; outIdx++) {\n // Convert outIdx to multi-index in output shape\n const multiIdx = new Array(ndim);\n let remaining = outIdx;\n for (let d = ndim - 1; d >= 0; d--) {\n multiIdx[d] = remaining % outputShape[d]!;\n remaining = Math.floor(remaining / outputShape[d]!);\n }\n\n // Get the index value from indices array\n let indicesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const idx = indicesShape[d] === 1 ? 0 : multiIdx[d]!;\n indicesLinearIdx += idx * indicesStrides[d]!;\n }\n let indexValue = Number(indices.iget(indicesLinearIdx));\n if (indexValue < 0) indexValue = axisSize + indexValue;\n if (indexValue < 0 || indexValue >= axisSize) {\n throw new Error(\n `index ${indexValue} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n\n // Compute source index\n const sourceMultiIdx = [...multiIdx];\n sourceMultiIdx[normalizedAxis] = indexValue;\n let srcLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const idx = shape[d] === 1 ? 0 : sourceMultiIdx[d]!;\n srcLinearIdx += idx * inputStrides[d]!;\n }\n\n const value = storage.iget(srcLinearIdx);\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Put values into array along an axis using 1D index array\n */\nexport function put_along_axis(\n storage: ArrayStorage,\n indices: ArrayStorage,\n values: ArrayStorage,\n axis: number\n): void {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const indicesShape = indices.shape;\n const valuesShape = values.shape;\n\n if (indicesShape.length !== ndim || valuesShape.length !== ndim) {\n throw new Error('indices, arr, and values must have same ndim');\n }\n\n const axisSize = shape[normalizedAxis]!;\n const inputStrides = computeStrides(shape);\n const indicesStrides = computeStrides(indicesShape);\n const valuesStrides = computeStrides(valuesShape);\n\n // Iterate through indices positions\n const indicesSize = indicesShape.reduce((a, b) => a * b, 1);\n for (let idx = 0; idx < indicesSize; idx++) {\n // Convert idx to multi-index\n const multiIdx = new Array(ndim);\n let remaining = idx;\n for (let d = ndim - 1; d >= 0; d--) {\n multiIdx[d] = remaining % indicesShape[d]!;\n remaining = Math.floor(remaining / indicesShape[d]!);\n }\n\n // Get the index value\n let indicesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n indicesLinearIdx += multiIdx[d]! * indicesStrides[d]!;\n }\n let indexValue = Number(indices.iget(indicesLinearIdx));\n if (indexValue < 0) indexValue = axisSize + indexValue;\n if (indexValue < 0 || indexValue >= axisSize) {\n throw new Error(\n `index ${indexValue} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n\n // Get value from values array (broadcast if needed)\n let valuesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const vidx = valuesShape[d] === 1 ? 0 : multiIdx[d]!;\n valuesLinearIdx += vidx * valuesStrides[d]!;\n }\n let value = values.iget(valuesLinearIdx);\n\n // Compute destination index\n const destMultiIdx = [...multiIdx];\n destMultiIdx[normalizedAxis] = indexValue;\n let destLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n destLinearIdx += destMultiIdx[d]! * inputStrides[d]!;\n }\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(destLinearIdx, value);\n }\n}\n\n/**\n * Change elements of array based on conditional mask\n */\nexport function putmask(\n storage: ArrayStorage,\n mask: ArrayStorage,\n values: ArrayStorage | number | bigint\n): void {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Get values array\n let valueArray: (number | bigint)[];\n if (typeof values === 'number' || typeof values === 'bigint') {\n valueArray = [values];\n } else {\n valueArray = [];\n for (let i = 0; i < values.size; i++) {\n valueArray.push(values.iget(i));\n }\n }\n\n // Put values where mask is true\n let valueIdx = 0;\n for (let i = 0; i < size; i++) {\n const maskVal = mask.iget(i);\n if (maskVal) {\n let value = valueArray[valueIdx % valueArray.length]!;\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(i, value);\n valueIdx++;\n }\n }\n}\n\n/**\n * Return selected slices along given axis based on condition\n */\nexport function compress(\n condition: ArrayStorage,\n storage: ArrayStorage,\n axis?: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Get direct access to underlying data for fast reading\n const inputData = storage.data;\n const isBigInt = isBigIntDType(dtype);\n\n if (axis === undefined) {\n // Flatten and select - optimized path\n // First pass: count true values\n let trueCount = 0;\n const maxLen = Math.min(condition.size, storage.size);\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) trueCount++;\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot compress with dtype ${dtype}`);\n }\n const outputData = new Constructor(trueCount);\n\n // Second pass: copy values\n let outIdx = 0;\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = (\n inputData as BigInt64Array | BigUint64Array\n )[i]!;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = (\n inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>\n )[i]!;\n }\n outIdx++;\n }\n }\n\n return ArrayStorage.fromData(outputData, [trueCount], dtype);\n }\n\n // Compress along axis - optimized version\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Build boolean array and axis mapping in one pass\n const axisSize = shape[normalizedAxis]!;\n const maxLen = Math.min(condition.size, axisSize);\n const axisMap: number[] = [];\n\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) {\n axisMap.push(i);\n }\n }\n\n const trueCount = axisMap.length;\n\n // Output shape\n const outputShape = [...shape];\n outputShape[normalizedAxis] = trueCount;\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot compress with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n // Compute strides for efficient indexing\n const inputStrides = computeStrides(shape);\n\n // Special case: axis = 0 (most common, optimize heavily)\n if (normalizedAxis === 0) {\n const strideAlongAxis = inputStrides[0]!;\n const elementsPerSlice = shape.slice(1).reduce((a, b) => a * b, 1);\n\n let outIdx = 0;\n for (let i = 0; i < trueCount; i++) {\n const inputAxisIdx = axisMap[i]!;\n const srcOffset = inputAxisIdx * strideAlongAxis;\n\n // Copy entire slice at once\n if (isBigInt) {\n const src = inputData as BigInt64Array | BigUint64Array;\n const dst = outputData as BigInt64Array | BigUint64Array;\n for (let j = 0; j < elementsPerSlice; j++) {\n dst[outIdx++] = src[srcOffset + j]!;\n }\n } else {\n const src = inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n const dst = outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let j = 0; j < elementsPerSlice; j++) {\n dst[outIdx++] = src[srcOffset + j]!;\n }\n }\n }\n } else {\n // General case for other axes\n // Pre-compute outer and inner iteration counts\n const outerSize = shape.slice(0, normalizedAxis).reduce((a, b) => a * b, 1);\n const innerSize = shape.slice(normalizedAxis + 1).reduce((a, b) => a * b, 1);\n\n let outIdx = 0;\n for (let outer = 0; outer < outerSize; outer++) {\n for (let axisIdx = 0; axisIdx < trueCount; axisIdx++) {\n const inputAxisIdx = axisMap[axisIdx]!;\n\n // Compute base offset for this outer/axis combination\n let baseOffset = 0;\n let rem = outer;\n for (let d = normalizedAxis - 1; d >= 0; d--) {\n const idx = rem % shape[d]!;\n rem = Math.floor(rem / shape[d]!);\n baseOffset += idx * inputStrides[d]!;\n }\n baseOffset += inputAxisIdx * inputStrides[normalizedAxis]!;\n\n // Copy inner elements\n if (isBigInt) {\n const src = inputData as BigInt64Array | BigUint64Array;\n const dst = outputData as BigInt64Array | BigUint64Array;\n for (let inner = 0; inner < innerSize; inner++) {\n dst[outIdx++] = src[baseOffset + inner]!;\n }\n } else {\n const src = inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n const dst = outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let inner = 0; inner < innerSize; inner++) {\n dst[outIdx++] = src[baseOffset + inner]!;\n }\n }\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Return array drawn from elements in choicelist, depending on conditions\n */\nexport function select(\n condlist: ArrayStorage[],\n choicelist: ArrayStorage[],\n defaultValue: number | bigint = 0\n): ArrayStorage {\n if (condlist.length !== choicelist.length) {\n throw new Error('condlist and choicelist must have same length');\n }\n\n if (condlist.length === 0) {\n throw new Error('condlist and choicelist cannot be empty');\n }\n\n // Compute broadcast shape from all conditions and choices\n const allShapes = [\n ...condlist.map((c) => Array.from(c.shape)),\n ...choicelist.map((c) => Array.from(c.shape)),\n ];\n const outputShape = computeBroadcastShape(allShapes);\n if (outputShape === null) {\n throw new Error('condlist and choicelist arrays could not be broadcast together');\n }\n\n const dtype = choicelist[0]!.dtype;\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot select with dtype ${dtype}`);\n }\n\n // Initialize with default value\n let defaultVal: number | bigint = defaultValue;\n if (isBigIntDType(dtype)) {\n defaultVal = typeof defaultValue === 'bigint' ? defaultValue : BigInt(defaultValue);\n } else {\n defaultVal = typeof defaultValue === 'bigint' ? Number(defaultValue) : defaultValue;\n }\n\n const outputData = new Constructor(outputSize);\n for (let i = 0; i < outputSize; i++) {\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = defaultVal as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = defaultVal as number;\n }\n }\n\n // Broadcast all arrays\n const broadcastedConds = condlist.map((c) => broadcastTo(c, outputShape));\n const broadcastedChoices = choicelist.map((c) => broadcastTo(c, outputShape));\n\n // Process conditions in order (first match wins)\n for (let i = 0; i < outputSize; i++) {\n for (let j = 0; j < condlist.length; j++) {\n if (broadcastedConds[j]!.iget(i)) {\n const value = broadcastedChoices[j]!.iget(i);\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n break;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Change elements of array based on conditional and input values\n */\nexport function place(storage: ArrayStorage, mask: ArrayStorage, vals: ArrayStorage): void {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Get values array\n const valueArray: (number | bigint)[] = [];\n for (let i = 0; i < vals.size; i++) {\n valueArray.push(vals.iget(i));\n }\n\n if (valueArray.length === 0) {\n return;\n }\n\n // Place values where mask is true\n let valueIdx = 0;\n for (let i = 0; i < size; i++) {\n const maskVal = mask.iget(i);\n if (maskVal) {\n let value = valueArray[valueIdx % valueArray.length]!;\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(i, value);\n valueIdx++;\n }\n }\n}\n\n/**\n * Return indices to access main diagonal of array\n */\nexport function diag_indices(n: number, ndim: number = 2): ArrayStorage[] {\n if (ndim < 1) {\n throw new Error('ndim must be at least 1');\n }\n\n const indices = new Int32Array(n);\n for (let i = 0; i < n; i++) {\n indices[i] = i;\n }\n\n const result: ArrayStorage[] = [];\n for (let d = 0; d < ndim; d++) {\n result.push(ArrayStorage.fromData(new Int32Array(indices), [n], 'int32'));\n }\n\n return result;\n}\n\n/**\n * Return indices to access main diagonal of array from given array\n */\nexport function diag_indices_from(storage: ArrayStorage): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n if (ndim < 2) {\n throw new Error('array must be at least 2-D');\n }\n\n // Check that all dimensions are equal\n const n = shape[0]!;\n for (let i = 1; i < ndim; i++) {\n if (shape[i] !== n) {\n throw new Error('All dimensions of input must be equal');\n }\n }\n\n return diag_indices(n, ndim);\n}\n\n/**\n * Return indices for lower-triangle of an (n, m) array\n */\nexport function tril_indices(n: number, k: number = 0, m?: number): ArrayStorage[] {\n const cols = m ?? n;\n\n const rows: number[] = [];\n const colIndices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j <= Math.min(i + k, cols - 1); j++) {\n if (j >= 0) {\n rows.push(i);\n colIndices.push(j);\n }\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(colIndices), [colIndices.length], 'int32'),\n ];\n}\n\n/**\n * Return indices for lower-triangle of given array\n */\nexport function tril_indices_from(storage: ArrayStorage, k: number = 0): ArrayStorage[] {\n const shape = storage.shape;\n\n if (shape.length !== 2) {\n throw new Error('array must be 2-D');\n }\n\n return tril_indices(shape[0]!, k, shape[1]);\n}\n\n/**\n * Return indices for upper-triangle of an (n, m) array\n */\nexport function triu_indices(n: number, k: number = 0, m?: number): ArrayStorage[] {\n const cols = m ?? n;\n\n const rows: number[] = [];\n const colIndices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = Math.max(i + k, 0); j < cols; j++) {\n rows.push(i);\n colIndices.push(j);\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(colIndices), [colIndices.length], 'int32'),\n ];\n}\n\n/**\n * Return indices for upper-triangle of given array\n */\nexport function triu_indices_from(storage: ArrayStorage, k: number = 0): ArrayStorage[] {\n const shape = storage.shape;\n\n if (shape.length !== 2) {\n throw new Error('array must be 2-D');\n }\n\n return triu_indices(shape[0]!, k, shape[1]);\n}\n\n/**\n * Return indices to access elements using mask function\n */\nexport function mask_indices(\n n: number,\n mask_func: (n: number, k: number) => ArrayStorage,\n k: number = 0\n): ArrayStorage[] {\n // Generate the mask using the mask function\n const mask = mask_func(n, k);\n const maskShape = mask.shape;\n\n if (maskShape.length !== 2 || maskShape[0] !== n || maskShape[1] !== n) {\n throw new Error('mask_func must return n x n array');\n }\n\n const rows: number[] = [];\n const cols: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (mask.get(i, j)) {\n rows.push(i);\n cols.push(j);\n }\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(cols), [cols.length], 'int32'),\n ];\n}\n\n/**\n * Return array representing indices of a grid\n */\nexport function indices(\n dimensions: number[],\n dtype: 'int32' | 'int64' | 'float64' = 'int32'\n): ArrayStorage {\n const ndim = dimensions.length;\n const outputShape = [ndim, ...dimensions];\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create indices with dtype ${dtype}`);\n }\n\n const outputData = new Constructor(outputSize);\n const gridSize = dimensions.reduce((a, b) => a * b, 1);\n\n // For each dimension, fill the corresponding slice\n for (let d = 0; d < ndim; d++) {\n const sliceOffset = d * gridSize;\n\n // Iterate through grid positions\n for (let gridIdx = 0; gridIdx < gridSize; gridIdx++) {\n // Convert gridIdx to multi-index\n const multiIdx = new Array(ndim);\n let remaining = gridIdx;\n for (let i = ndim - 1; i >= 0; i--) {\n multiIdx[i] = remaining % dimensions[i]!;\n remaining = Math.floor(remaining / dimensions[i]!);\n }\n\n const value = multiIdx[d]!;\n if (dtype === 'int64') {\n (outputData as BigInt64Array)[sliceOffset + gridIdx] = BigInt(value);\n } else {\n (outputData as Float64Array | Int32Array)[sliceOffset + gridIdx] = value;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Construct open mesh from multiple sequences\n */\nexport function ix_(...args: ArrayStorage[]): ArrayStorage[] {\n const ndim = args.length;\n const result: ArrayStorage[] = [];\n\n for (let i = 0; i < ndim; i++) {\n const arr = args[i]!;\n const arrSize = arr.size;\n const dtype = arr.dtype;\n\n // Create shape with 1s except at position i\n const shape = new Array(ndim).fill(1);\n shape[i] = arrSize;\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create ix_ with dtype ${dtype}`);\n }\n\n const data = new Constructor(arrSize);\n for (let j = 0; j < arrSize; j++) {\n const value = arr.iget(j);\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[j] = value as bigint;\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[j] = value as number;\n }\n }\n\n result.push(ArrayStorage.fromData(data, shape, dtype));\n }\n\n return result;\n}\n\n/**\n * Convert multi-dimensional index arrays to flat index array\n */\nexport function ravel_multi_index(\n multi_index: ArrayStorage[],\n dims: number[],\n mode: 'raise' | 'wrap' | 'clip' = 'raise'\n): ArrayStorage {\n if (multi_index.length !== dims.length) {\n throw new Error('multi_index length must equal dims length');\n }\n\n if (multi_index.length === 0) {\n throw new Error('multi_index cannot be empty');\n }\n\n const size = multi_index[0]!.size;\n const ndim = dims.length;\n const outputData = new Int32Array(size);\n\n // Compute strides for row-major (C) order\n const strides = new Array(ndim);\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= dims[i]!;\n }\n\n for (let i = 0; i < size; i++) {\n let flatIdx = 0;\n for (let d = 0; d < ndim; d++) {\n let idx = Number(multi_index[d]!.iget(i));\n const dimSize = dims[d]!;\n\n // Handle mode\n if (mode === 'wrap') {\n idx = ((idx % dimSize) + dimSize) % dimSize;\n } else if (mode === 'clip') {\n idx = Math.max(0, Math.min(idx, dimSize - 1));\n } else if (idx < 0 || idx >= dimSize) {\n throw new Error(`index ${idx} is out of bounds for axis ${d} with size ${dimSize}`);\n }\n\n flatIdx += idx * strides[d]!;\n }\n outputData[i] = flatIdx;\n }\n\n return ArrayStorage.fromData(outputData, [size], 'int32');\n}\n\n/**\n * Convert flat index array to tuple of coordinate arrays\n */\nexport function unravel_index(\n indices: ArrayStorage | number,\n shape: number[],\n order: 'C' | 'F' = 'C'\n): ArrayStorage[] {\n const ndim = shape.length;\n\n // Handle scalar input\n let indicesArray: number[];\n let outputShape: number[];\n if (typeof indices === 'number') {\n indicesArray = [indices];\n outputShape = [];\n } else {\n indicesArray = [];\n for (let i = 0; i < indices.size; i++) {\n indicesArray.push(Number(indices.iget(i)));\n }\n outputShape = Array.from(indices.shape);\n }\n\n const size = indicesArray.length;\n const totalSize = shape.reduce((a, b) => a * b, 1);\n\n // Compute strides\n const strides = new Array(ndim);\n if (order === 'C') {\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n } else {\n let stride = 1;\n for (let i = 0; i < ndim; i++) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n }\n\n // Create output arrays\n const result: ArrayStorage[] = [];\n for (let d = 0; d < ndim; d++) {\n const data = new Int32Array(size);\n result.push(ArrayStorage.fromData(data, outputShape.length ? outputShape : [1], 'int32'));\n }\n\n // Convert each flat index\n for (let i = 0; i < size; i++) {\n let flatIdx = indicesArray[i]!;\n if (flatIdx < 0 || flatIdx >= totalSize) {\n throw new Error(`index ${flatIdx} is out of bounds for array with size ${totalSize}`);\n }\n\n if (order === 'C') {\n for (let d = 0; d < ndim; d++) {\n const coord = Math.floor(flatIdx / strides[d]!);\n flatIdx = flatIdx % strides[d]!;\n (result[d]!.data as Int32Array)[i] = coord % shape[d]!;\n }\n } else {\n for (let d = ndim - 1; d >= 0; d--) {\n const coord = Math.floor(flatIdx / strides[d]!);\n flatIdx = flatIdx % strides[d]!;\n (result[d]!.data as Int32Array)[i] = coord % shape[d]!;\n }\n }\n }\n\n // For scalar input, return scalar-shaped results\n if (typeof indices === 'number') {\n return result.map((arr) => {\n const value = arr.iget(0);\n return ArrayStorage.fromData(new Int32Array([Number(value)]), [], 'int32');\n });\n }\n\n return result;\n}\n", "/**\n * Bitwise operations\n *\n * Pure functions for element-wise bitwise operations:\n * bitwise_and, bitwise_or, bitwise_xor, bitwise_not, invert,\n * left_shift, right_shift, packbits, unpackbits\n *\n * These operations only work on integer types.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, isIntegerDType, promoteDTypes, DType } from '../core/dtype';\nimport { elementwiseBinaryOp } from '../internal/compute';\n\n/**\n * Helper: Validate that dtype is an integer type for bitwise operations\n */\nfunction validateIntegerDType(dtype: DType, opName: string): void {\n if (!isIntegerDType(dtype) && dtype !== 'bool') {\n throw new TypeError(\n `ufunc '${opName}' not supported for the input types, and the inputs could not be safely coerced to any supported types`\n );\n }\n}\n\n/**\n * Helper: Check if two arrays can use the fast path\n * (both C-contiguous with same shape, no broadcasting needed)\n */\nfunction canUseFastPath(a: ArrayStorage, b: ArrayStorage): boolean {\n return (\n a.isCContiguous &&\n b.isCContiguous &&\n a.shape.length === b.shape.length &&\n a.shape.every((dim, i) => dim === b.shape[i])\n );\n}\n\n/**\n * Bitwise AND of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_and(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_and');\n\n if (typeof b === 'number') {\n return bitwiseAndScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_and');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseAndArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x & y, 'bitwise_and');\n}\n\n/**\n * Fast path for bitwise AND of two contiguous arrays\n * @private\n */\nfunction bitwiseAndArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) & (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! & bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) & (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise AND with scalar (optimized path)\n * @private\n */\nfunction bitwiseAndScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! & scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) & scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise OR of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_or(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_or');\n\n if (typeof b === 'number') {\n return bitwiseOrScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_or');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseOrArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x | y, 'bitwise_or');\n}\n\n/**\n * Fast path for bitwise OR of two contiguous arrays\n * @private\n */\nfunction bitwiseOrArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) | (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! | bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) | (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise OR with scalar (optimized path)\n * @private\n */\nfunction bitwiseOrScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! | scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) | scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise XOR of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_xor(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_xor');\n\n if (typeof b === 'number') {\n return bitwiseXorScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_xor');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseXorArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x ^ y, 'bitwise_xor');\n}\n\n/**\n * Fast path for bitwise XOR of two contiguous arrays\n * @private\n */\nfunction bitwiseXorArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) ^ (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! ^ bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) ^ (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise XOR with scalar (optimized path)\n * @private\n */\nfunction bitwiseXorScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! ^ scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) ^ scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise NOT (invert) of each element\n *\n * @param a - Input array storage (must be integer type)\n * @returns Result storage with bitwise NOT values\n */\nexport function bitwise_not(a: ArrayStorage): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_not');\n\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = ~thisTyped[i]!;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = ~(data[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Invert (bitwise NOT) - alias for bitwise_not\n *\n * @param a - Input array storage (must be integer type)\n * @returns Result storage with inverted values\n */\nexport function invert(a: ArrayStorage): ArrayStorage {\n return bitwise_not(a);\n}\n\n/**\n * Left shift of array elements\n *\n * @param a - Input array storage (must be integer type)\n * @param b - Shift amount (array storage or scalar)\n * @returns Result storage with left-shifted values\n */\nexport function left_shift(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'left_shift');\n\n if (typeof b === 'number') {\n return leftShiftScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'left_shift');\n\n // Fast path: single-element array or broadcastable scalar shape treated as scalar\n if (b.size === 1 || (b.ndim === 1 && b.shape[0] === 1)) {\n const shiftVal = isBigIntDType(b.dtype) ? Number(b.data[0] as bigint) : (b.data[0] as number);\n return leftShiftScalar(a, shiftVal);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return leftShiftArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x << y, 'left_shift');\n}\n\n/**\n * Fast path for left shift of two contiguous arrays\n * @private\n */\nfunction leftShiftArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) << (bVal as bigint);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) << (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Left shift with scalar (optimized path)\n * @private\n */\nfunction leftShiftScalar(storage: ArrayStorage, shift: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const shiftBig = BigInt(Math.round(shift));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! << shiftBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) << shift;\n }\n }\n\n return result;\n}\n\n/**\n * Right shift of array elements\n *\n * @param a - Input array storage (must be integer type)\n * @param b - Shift amount (array storage or scalar)\n * @returns Result storage with right-shifted values\n */\nexport function right_shift(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'right_shift');\n\n if (typeof b === 'number') {\n return rightShiftScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'right_shift');\n\n // Fast path: single-element array or broadcastable scalar shape treated as scalar\n if (b.size === 1 || (b.ndim === 1 && b.shape[0] === 1)) {\n const shiftVal = isBigIntDType(b.dtype) ? Number(b.data[0] as bigint) : (b.data[0] as number);\n return rightShiftScalar(a, shiftVal);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return rightShiftArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x >> y, 'right_shift');\n}\n\n/**\n * Fast path for right shift of two contiguous arrays\n * @private\n */\nfunction rightShiftArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) >> (bVal as bigint);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) >> (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Right shift with scalar (optimized path)\n * @private\n */\nfunction rightShiftScalar(storage: ArrayStorage, shift: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const shiftBig = BigInt(Math.round(shift));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! >> shiftBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) >> shift;\n }\n }\n\n return result;\n}\n\n/**\n * Pack binary values into uint8 array\n *\n * Packs the elements of a binary-valued array into bits in a uint8 array.\n * The result has the same shape as the input, except for the specified axis\n * which is divided by 8 (rounded up).\n *\n * @param a - Input array (values are interpreted as binary: 0 or non-zero)\n * @param axis - The dimension over which bit-packing is done (default: -1, meaning the last axis)\n * @param bitorder - The order of bits within each packed byte. 'big' means the most significant bit is first. (default: 'big')\n * @returns Packed uint8 array\n */\nexport function packbits(\n a: ArrayStorage,\n axis: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): ArrayStorage {\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n\n // Handle negative axis\n if (axis < 0) {\n axis = ndim + axis;\n }\n\n if (axis < 0 || axis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Calculate output shape\n const axisSize = shape[axis]!;\n const packedAxisSize = Math.ceil(axisSize / 8);\n const outShape = [...shape];\n outShape[axis] = packedAxisSize;\n\n const result = ArrayStorage.zeros(outShape, 'uint8');\n const resultData = result.data as Uint8Array;\n\n // For 1D arrays, simple case\n if (ndim === 1) {\n for (let i = 0; i < packedAxisSize; i++) {\n let byte = 0;\n for (let bit = 0; bit < 8; bit++) {\n const srcIdx = i * 8 + bit;\n if (srcIdx < axisSize) {\n const val = Number(a.data[srcIdx]!) !== 0 ? 1 : 0;\n if (bitorder === 'big') {\n byte |= val << (7 - bit);\n } else {\n byte |= val << bit;\n }\n }\n }\n resultData[i] = byte;\n }\n return result;\n }\n\n // For N-D arrays, iterate over all combinations except the packed axis\n const preAxisShape = shape.slice(0, axis);\n const postAxisShape = shape.slice(axis + 1);\n\n const preAxisSize = preAxisShape.reduce((acc, dim) => acc * dim, 1);\n const postAxisSize = postAxisShape.reduce((acc, dim) => acc * dim, 1);\n\n // Calculate strides for input and output\n const inputStrides = computeStrides(shape);\n const outputStrides = computeStrides(outShape);\n\n for (let pre = 0; pre < preAxisSize; pre++) {\n for (let post = 0; post < postAxisSize; post++) {\n for (let packedIdx = 0; packedIdx < packedAxisSize; packedIdx++) {\n let byte = 0;\n for (let bit = 0; bit < 8; bit++) {\n const axisIdx = packedIdx * 8 + bit;\n if (axisIdx < axisSize) {\n // Calculate input linear index\n let inputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n inputIdx += axisIdx * inputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n\n const val = Number(a.data[inputIdx]!) !== 0 ? 1 : 0;\n if (bitorder === 'big') {\n byte |= val << (7 - bit);\n } else {\n byte |= val << bit;\n }\n }\n }\n\n // Calculate output linear index\n let outputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n outputIdx += packedIdx * outputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n\n resultData[outputIdx] = byte;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Unpack uint8 array into binary values\n *\n * Unpacks elements of a uint8 array into a binary-valued output array.\n * Each element of the input array is unpacked into 8 binary values.\n *\n * @param a - Input uint8 array\n * @param axis - The dimension over which bit-unpacking is done (default: -1, meaning the last axis)\n * @param count - The number of elements to unpack along axis, or -1 for all (default: -1)\n * @param bitorder - The order of bits within each packed byte. 'big' means the most significant bit is first. (default: 'big')\n * @returns Unpacked uint8 array of 0s and 1s\n */\nexport function unpackbits(\n a: ArrayStorage,\n axis: number = -1,\n count: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): ArrayStorage {\n if (a.dtype !== 'uint8') {\n throw new TypeError('Expected an input array of unsigned byte data type');\n }\n\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n\n // Handle negative axis\n if (axis < 0) {\n axis = ndim + axis;\n }\n\n if (axis < 0 || axis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Calculate output shape\n const packedAxisSize = shape[axis]!;\n let unpackedAxisSize = packedAxisSize * 8;\n\n // Apply count if specified\n if (count >= 0) {\n unpackedAxisSize = count;\n }\n\n const outShape = [...shape];\n outShape[axis] = unpackedAxisSize;\n\n const result = ArrayStorage.zeros(outShape, 'uint8');\n const resultData = result.data as Uint8Array;\n\n // For 1D arrays, simple case\n if (ndim === 1) {\n for (let i = 0; i < packedAxisSize; i++) {\n const byte = Number(a.data[i]!);\n for (let bit = 0; bit < 8; bit++) {\n const outIdx = i * 8 + bit;\n if (outIdx >= unpackedAxisSize) break;\n if (bitorder === 'big') {\n resultData[outIdx] = (byte >> (7 - bit)) & 1;\n } else {\n resultData[outIdx] = (byte >> bit) & 1;\n }\n }\n }\n return result;\n }\n\n // For N-D arrays\n const preAxisShape = shape.slice(0, axis);\n const postAxisShape = shape.slice(axis + 1);\n\n const preAxisSize = preAxisShape.reduce((acc, dim) => acc * dim, 1);\n const postAxisSize = postAxisShape.reduce((acc, dim) => acc * dim, 1);\n\n const inputStrides = computeStrides(shape);\n const outputStrides = computeStrides(outShape);\n\n for (let pre = 0; pre < preAxisSize; pre++) {\n for (let post = 0; post < postAxisSize; post++) {\n for (let packedIdx = 0; packedIdx < packedAxisSize; packedIdx++) {\n // Calculate input linear index\n let inputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n inputIdx += packedIdx * inputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n\n const byte = Number(a.data[inputIdx]!);\n\n for (let bit = 0; bit < 8; bit++) {\n const axisIdx = packedIdx * 8 + bit;\n if (axisIdx >= unpackedAxisSize) break;\n\n // Calculate output linear index\n let outputIdx = 0;\n preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n outputIdx += axisIdx * outputStrides[axis]!;\n postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n\n if (bitorder === 'big') {\n resultData[outputIdx] = (byte >> (7 - bit)) & 1;\n } else {\n resultData[outputIdx] = (byte >> bit) & 1;\n }\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Compute C-contiguous strides for a shape\n * @private\n */\nfunction computeStrides(shape: number[]): number[] {\n const ndim = shape.length;\n const strides = new Array(ndim);\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * Sorting and searching operations\n *\n * Functions for sorting arrays, finding sorted indices, and searching.\n * @module ops/sorting\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, type DType } from '../core/dtype';\nimport { outerIndexToMultiIndex, multiIndexToLinear } from '../internal/indexing';\n\n/**\n * Return a sorted copy of an array\n * @param storage - Input array storage\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\nexport function sort(storage: ArrayStorage, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return storage.copy();\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create output storage\n const result = storage.copy();\n const resultData = result.data;\n\n const axisSize = shape[normalizedAxis]!;\n\n // Compute output shape (same as input)\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Sort along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Sort by value\n values.sort((a, b) => (a.value < b.value ? -1 : a.value > b.value ? 1 : 0));\n\n // Write sorted values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultTyped[linearIdx] = values[axisIdx]!.value;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(data[linearIdx]!));\n }\n\n // Sort (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a) && isNaN(b)) return 0;\n if (isNaN(a)) return 1;\n if (isNaN(b)) return -1;\n return a - b;\n });\n\n // Write sorted values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Returns the indices that would sort an array\n * @param storage - Input array storage\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the input array\n */\nexport function argsort(storage: ArrayStorage, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create output storage with int32 dtype\n const result = ArrayStorage.zeros(Array.from(shape), 'int32');\n const resultData = result.data as Int32Array;\n\n const axisSize = shape[normalizedAxis]!;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Get argsort along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Sort by value\n values.sort((a, b) => (a.value < b.value ? -1 : a.value > b.value ? 1 : 0));\n\n // Write sorted indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: number; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: Number(data[linearIdx]!), idx: axisIdx });\n }\n\n // Sort by value (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a.value) && isNaN(b.value)) return 0;\n if (isNaN(a.value)) return 1;\n if (isNaN(b.value)) return -1;\n return a.value - b.value;\n });\n\n // Write sorted indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Perform an indirect stable sort using a sequence of keys\n * @param keys - Array of ArrayStorage, the last key is the primary sort key\n * @returns Array of indices that would sort the keys\n */\nexport function lexsort(keys: ArrayStorage[]): ArrayStorage {\n if (keys.length === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // All keys must be 1D with the same length\n const firstKey = keys[0]!;\n const n = firstKey.size;\n\n for (const key of keys) {\n if (key.ndim !== 1) {\n throw new Error('keys must be 1D arrays');\n }\n if (key.size !== n) {\n throw new Error('all keys must have the same length');\n }\n }\n\n // Create indices array\n const indices: number[] = [];\n for (let i = 0; i < n; i++) {\n indices.push(i);\n }\n\n // Sort using all keys (last key is primary, first key is secondary)\n indices.sort((a, b) => {\n // Iterate keys in reverse order (last is primary)\n for (let k = keys.length - 1; k >= 0; k--) {\n const key = keys[k]!;\n const data = key.data;\n const va = Number(data[a]);\n const vb = Number(data[b]);\n\n // Handle NaN (put at end)\n if (isNaN(va) && isNaN(vb)) continue;\n if (isNaN(va)) return 1;\n if (isNaN(vb)) return -1;\n\n if (va < vb) return -1;\n if (va > vb) return 1;\n // Equal, continue to next key\n }\n return 0; // Stable sort - preserve original order\n });\n\n // Create result\n const result = ArrayStorage.zeros([n], 'int32');\n const resultData = result.data as Int32Array;\n for (let i = 0; i < n; i++) {\n resultData[i] = indices[i]!;\n }\n\n return result;\n}\n\n/**\n * Quickselect algorithm helper for number arrays\n * Partitions array so element at kth position is in sorted position\n */\nfunction quickselectNumbers(arr: number[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!;\n const b = arr[mid]!;\n const c = arr[right]!;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n const val = arr[j]!;\n // Handle NaN: NaN values go to the end\n const valIsNaN = isNaN(val);\n const pivotIsNaN = isNaN(pivot);\n\n if (!valIsNaN && (pivotIsNaN || val <= pivot)) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect algorithm helper for bigint arrays\n * Partitions array so element at kth position is in sorted position\n */\nfunction quickselectBigInts(arr: bigint[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!;\n const b = arr[mid]!;\n const c = arr[right]!;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! <= pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect for argpartition with number values\n * Partitions array of {value, idx} pairs by value\n */\nfunction quickselectNumberIndices(arr: { value: number; idx: number }[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!.value;\n const b = arr[mid]!.value;\n const c = arr[right]!.value;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!.value;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n const val = arr[j]!.value;\n // Handle NaN: NaN values go to the end\n const valIsNaN = isNaN(val);\n const pivotIsNaN = isNaN(pivot);\n\n if (!valIsNaN && (pivotIsNaN || val <= pivot)) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect for argpartition with bigint values\n * Partitions array of {value, idx} pairs by value\n */\nfunction quickselectBigIntIndices(arr: { value: bigint; idx: number }[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!.value;\n const b = arr[mid]!.value;\n const c = arr[right]!.value;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!.value;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]!.value <= pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Partially sort an array\n * Returns array with element at kth position in sorted position,\n * all smaller elements before it, all larger after it (not fully sorted)\n * @param storage - Input array storage\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\nexport function partition(storage: ArrayStorage, kth: number, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return storage.copy();\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Normalize kth\n let normalizedKth = kth;\n if (normalizedKth < 0) {\n normalizedKth = axisSize + normalizedKth;\n }\n if (normalizedKth < 0 || normalizedKth >= axisSize) {\n throw new Error(`kth(=${kth}) out of bounds (${axisSize})`);\n }\n\n // Create output storage\n const result = storage.copy();\n const resultData = result.data;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Partition along axis using quickselect\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: bigint[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(resultTyped[linearIdx]!);\n }\n\n // Partition using quickselect\n quickselectBigInts(values, normalizedKth);\n\n // Write partitioned values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultTyped[linearIdx] = values[axisIdx]!;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(resultData[linearIdx]!));\n }\n\n // Partition using quickselect\n quickselectNumbers(values, normalizedKth);\n\n // Write partitioned values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Returns indices that would partition an array\n * @param storage - Input array storage\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\nexport function argpartition(storage: ArrayStorage, kth: number, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Normalize kth\n let normalizedKth = kth;\n if (normalizedKth < 0) {\n normalizedKth = axisSize + normalizedKth;\n }\n if (normalizedKth < 0 || normalizedKth >= axisSize) {\n throw new Error(`kth(=${kth}) out of bounds (${axisSize})`);\n }\n\n // Create output storage with int32 dtype\n const result = ArrayStorage.zeros(Array.from(shape), 'int32');\n const resultData = result.data as Int32Array;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Get argpartition along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Partition using quickselect\n quickselectBigIntIndices(values, normalizedKth);\n\n // Write partitioned indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: number; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: Number(data[linearIdx]!), idx: axisIdx });\n }\n\n // Partition using quickselect\n quickselectNumberIndices(values, normalizedKth);\n\n // Write partitioned indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Sort a complex array using the real part first, then the imaginary part\n * For real arrays, this is equivalent to sort\n * @param storage - Input array storage\n * @returns Sorted array\n */\nexport function sort_complex(storage: ArrayStorage): ArrayStorage {\n // For real arrays, just sort normally (1D flattened)\n const dtype = storage.dtype;\n const size = storage.size;\n const data = storage.data;\n\n // Flatten and sort\n const values: number[] = [];\n for (let i = 0; i < size; i++) {\n values.push(Number(data[i]!));\n }\n\n // Sort (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a) && isNaN(b)) return 0;\n if (isNaN(a)) return 1;\n if (isNaN(b)) return -1;\n return a - b;\n });\n\n // Create result (1D sorted array)\n const result = ArrayStorage.zeros([size], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < size; i++) {\n resultData[i] = values[i]!;\n }\n\n return result;\n}\n\n// ============================================================================\n// Searching operations\n// ============================================================================\n\n/**\n * Return the indices of the elements that are non-zero\n * @param storage - Input array storage\n * @returns Tuple of arrays, one for each dimension\n */\nexport function nonzero(storage: ArrayStorage): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n const size = storage.size;\n\n // Find all non-zero indices\n const nonzeroIndices: number[][] = [];\n for (let dim = 0; dim < ndim; dim++) {\n nonzeroIndices.push([]);\n }\n\n // Calculate strides for index conversion\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Find non-zero elements\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n // Convert linear index to multi-index\n let remaining = i;\n for (let dim = 0; dim < ndim; dim++) {\n const idx = Math.floor(remaining / strides[dim]!);\n remaining = remaining % strides[dim]!;\n nonzeroIndices[dim]!.push(idx);\n }\n }\n }\n\n // Create result arrays\n const numNonzero = nonzeroIndices[0]?.length ?? 0;\n const result: ArrayStorage[] = [];\n\n for (let dim = 0; dim < ndim; dim++) {\n const arr = ArrayStorage.zeros([numNonzero], 'int32');\n const arrData = arr.data as Int32Array;\n for (let i = 0; i < numNonzero; i++) {\n arrData[i] = nonzeroIndices[dim]![i]!;\n }\n result.push(arr);\n }\n\n return result;\n}\n\n/**\n * Return indices of non-zero elements in flattened array\n * @param storage - Input array storage\n * @returns Array of indices\n */\nexport function flatnonzero(storage: ArrayStorage): ArrayStorage {\n const data = storage.data;\n const size = storage.size;\n\n // Find all non-zero indices\n const indices: number[] = [];\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n indices.push(i);\n }\n }\n\n // Create result\n const result = ArrayStorage.zeros([indices.length], 'int32');\n const resultData = result.data as Int32Array;\n for (let i = 0; i < indices.length; i++) {\n resultData[i] = indices[i]!;\n }\n\n return result;\n}\n\n/**\n * Return elements from x or y depending on condition\n * @param condition - Boolean array or condition\n * @param x - Values where condition is true\n * @param y - Values where condition is false\n * @returns Array with elements chosen from x or y based on condition\n */\nexport function where(\n condition: ArrayStorage,\n x?: ArrayStorage,\n y?: ArrayStorage\n): ArrayStorage | ArrayStorage[] {\n // If only condition is given, return indices of true elements (like nonzero)\n if (x === undefined && y === undefined) {\n return nonzero(condition);\n }\n\n // Both x and y must be provided\n if (x === undefined || y === undefined) {\n throw new Error('either both or neither of x and y should be given');\n }\n\n const condShape = condition.shape;\n const xShape = x.shape;\n const yShape = y.shape;\n\n // For now, require same shapes (broadcasting could be added later)\n // Find maximum shape for broadcasting\n const maxNdim = Math.max(condShape.length, xShape.length, yShape.length);\n\n // Pad shapes with 1s at the front for broadcasting\n const padShape = (s: readonly number[]) => {\n const padded = Array(maxNdim).fill(1);\n for (let i = 0; i < s.length; i++) {\n padded[maxNdim - s.length + i] = s[i];\n }\n return padded;\n };\n\n const paddedCond = padShape(condShape);\n const paddedX = padShape(xShape);\n const paddedY = padShape(yShape);\n\n // Compute broadcast shape\n const resultShape: number[] = [];\n for (let i = 0; i < maxNdim; i++) {\n const dims = [paddedCond[i]!, paddedX[i]!, paddedY[i]!];\n const maxDim = Math.max(...dims);\n for (const d of dims) {\n if (d !== 1 && d !== maxDim) {\n throw new Error(`operands could not be broadcast together`);\n }\n }\n resultShape.push(maxDim);\n }\n\n // Use float64 for result dtype (could be improved to handle dtype promotion)\n const resultDtype = x.dtype as DType;\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n const resultData = result.data;\n const condData = condition.data;\n const xData = x.data;\n const yData = y.data;\n\n // Calculate strides for broadcasting\n const calcStrides = (shape: readonly number[], padded: number[]) => {\n const strides: number[] = [];\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n // Pad with zeros for dimensions that don't exist\n while (strides.length < padded.length) {\n strides.unshift(0);\n }\n // Set stride to 0 for broadcast dimensions\n for (let i = 0; i < padded.length; i++) {\n if (padded[i] === 1 && resultShape[i] !== 1) {\n strides[i] = 0;\n }\n }\n return strides;\n };\n\n const condStrides = calcStrides(condShape, paddedCond);\n const xStrides = calcStrides(xShape, paddedX);\n const yStrides = calcStrides(yShape, paddedY);\n\n // Calculate result strides\n const resultStrides: number[] = [];\n let stride = 1;\n for (let i = resultShape.length - 1; i >= 0; i--) {\n resultStrides.unshift(stride);\n stride *= resultShape[i]!;\n }\n\n const totalSize = resultShape.reduce((a, b) => a * b, 1);\n\n // Iterate over all elements\n for (let i = 0; i < totalSize; i++) {\n // Convert linear index to multi-index\n let remaining = i;\n let condIdx = 0;\n let xIdx = 0;\n let yIdx = 0;\n\n for (let dim = 0; dim < maxNdim; dim++) {\n const idx = Math.floor(remaining / resultStrides[dim]!);\n remaining = remaining % resultStrides[dim]!;\n\n condIdx += idx * condStrides[dim]!;\n xIdx += idx * xStrides[dim]!;\n yIdx += idx * yStrides[dim]!;\n }\n\n if (condData[condIdx]) {\n resultData[i] = xData[xIdx]!;\n } else {\n resultData[i] = yData[yIdx]!;\n }\n }\n\n return result;\n}\n\n/**\n * Find indices where elements should be inserted to maintain order\n * @param storage - Input array (must be sorted in ascending order)\n * @param values - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\nexport function searchsorted(\n storage: ArrayStorage,\n values: ArrayStorage,\n side: 'left' | 'right' = 'left'\n): ArrayStorage {\n // Input array must be 1D\n if (storage.ndim !== 1) {\n throw new Error('storage must be 1D');\n }\n\n const data = storage.data;\n const n = storage.size;\n const valuesData = values.data;\n const numValues = values.size;\n\n // Create result array\n const result = ArrayStorage.zeros([numValues], 'int32');\n const resultData = result.data as Int32Array;\n\n // Binary search for each value\n for (let i = 0; i < numValues; i++) {\n const v = Number(valuesData[i]);\n let lo = 0;\n let hi = n;\n\n if (side === 'left') {\n // Find leftmost position where v can be inserted\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (Number(data[mid]) < v) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n } else {\n // Find rightmost position where v can be inserted\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (Number(data[mid]) <= v) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n }\n\n resultData[i] = lo;\n }\n\n return result;\n}\n\n/**\n * Return the elements of an array that satisfy some condition\n * @param condition - Boolean array\n * @param storage - Input array storage\n * @returns 1D array of elements where condition is true\n */\nexport function extract(condition: ArrayStorage, storage: ArrayStorage): ArrayStorage {\n const condData = condition.data;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Both arrays should have same size\n const size = Math.min(condition.size, storage.size);\n\n // Count number of true values\n let count = 0;\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n count++;\n }\n }\n\n // Create result array\n const result = ArrayStorage.zeros([count], dtype as DType);\n const resultData = result.data;\n\n // Copy values where condition is true\n let idx = 0;\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n resultTyped[idx++] = typedData[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n resultData[idx++] = data[i]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Count number of non-zero values in the array\n * @param storage - Input array storage\n * @param axis - Axis along which to count (optional)\n * @returns Count of non-zero values\n */\nexport function count_nonzero(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n const size = storage.size;\n\n if (axis === undefined) {\n // Count all non-zero elements\n let count = 0;\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n count++;\n }\n }\n return count;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return count_nonzero(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data as Int32Array;\n\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (data[linearIdx]) {\n count++;\n }\n }\n resultData[outerIdx] = count;\n }\n\n return result;\n}\n", "/**\n * NDArray - NumPy-compatible multidimensional array\n *\n * Core array class providing NumPy-like API\n */\n\nimport { parseSlice, normalizeSlice } from './slicing';\nimport {\n type DType,\n type TypedArray,\n DEFAULT_DTYPE,\n getTypedArrayConstructor,\n isBigIntDType,\n} from './dtype';\nimport { ArrayStorage } from './storage';\nimport * as arithmeticOps from '../ops/arithmetic';\nimport * as comparisonOps from '../ops/comparison';\nimport * as reductionOps from '../ops/reduction';\nimport * as shapeOps from '../ops/shape';\nimport * as linalgOps from '../ops/linalg';\nimport * as exponentialOps from '../ops/exponential';\nimport * as trigOps from '../ops/trig';\nimport * as hyperbolicOps from '../ops/hyperbolic';\nimport * as advancedOps from '../ops/advanced';\nimport * as bitwiseOps from '../ops/bitwise';\nimport * as sortingOps from '../ops/sorting';\n\nexport class NDArray {\n // Internal storage\n private _storage: ArrayStorage;\n // Track if this array is a view of another array\n private _base?: NDArray;\n\n constructor(storage: ArrayStorage, base?: NDArray) {\n this._storage = storage;\n this._base = base;\n }\n\n /**\n * Get internal storage (for ops modules)\n * @internal\n */\n get storage(): ArrayStorage {\n return this._storage;\n }\n\n /**\n * Create NDArray from storage (for ops modules)\n * @internal\n */\n static _fromStorage(storage: ArrayStorage, base?: NDArray): NDArray {\n return new NDArray(storage, base);\n }\n\n // NumPy properties\n get shape(): readonly number[] {\n return this._storage.shape;\n }\n\n get ndim(): number {\n return this._storage.ndim;\n }\n\n get size(): number {\n return this._storage.size;\n }\n\n get dtype(): string {\n return this._storage.dtype;\n }\n\n get data(): TypedArray {\n return this._storage.data;\n }\n\n get strides(): readonly number[] {\n return this._storage.strides;\n }\n\n /**\n * Array flags (similar to NumPy's flags)\n * Provides information about memory layout\n */\n get flags(): {\n C_CONTIGUOUS: boolean;\n F_CONTIGUOUS: boolean;\n OWNDATA: boolean;\n } {\n return {\n C_CONTIGUOUS: this._storage.isCContiguous,\n F_CONTIGUOUS: this._storage.isFContiguous,\n OWNDATA: this._base === undefined, // True if we own data, false if we're a view\n };\n }\n\n /**\n * Base array if this is a view, null if this array owns its data\n * Similar to NumPy's base attribute\n */\n get base(): NDArray | null {\n return this._base ?? null;\n }\n\n /**\n * Get a single element from the array\n * @param indices - Array of indices, one per dimension (e.g., [0, 1] for 2D array)\n * @returns The element value (BigInt for int64/uint64, number otherwise)\n */\n get(indices: number[]): number | bigint {\n // Validate number of indices\n if (indices.length !== this.ndim) {\n throw new Error(\n `Index has ${indices.length} dimensions, but array has ${this.ndim} dimensions`\n );\n }\n\n // Normalize negative indices\n const normalizedIndices = indices.map((idx, dim) => {\n let normalized = idx;\n if (normalized < 0) {\n normalized = this.shape[dim]! + normalized;\n }\n // Validate bounds\n if (normalized < 0 || normalized >= this.shape[dim]!) {\n throw new Error(\n `Index ${idx} is out of bounds for axis ${dim} with size ${this.shape[dim]}`\n );\n }\n return normalized;\n });\n\n return this._storage.get(...normalizedIndices);\n }\n\n /**\n * Set a single element in the array\n * @param indices - Array of indices, one per dimension (e.g., [0, 1] for 2D array)\n * @param value - Value to set (will be converted to array's dtype)\n */\n set(indices: number[], value: number | bigint): void {\n // Validate number of indices\n if (indices.length !== this.ndim) {\n throw new Error(\n `Index has ${indices.length} dimensions, but array has ${this.ndim} dimensions`\n );\n }\n\n // Normalize negative indices\n const normalizedIndices = indices.map((idx, dim) => {\n let normalized = idx;\n if (normalized < 0) {\n normalized = this.shape[dim]! + normalized;\n }\n // Validate bounds\n if (normalized < 0 || normalized >= this.shape[dim]!) {\n throw new Error(\n `Index ${idx} is out of bounds for axis ${dim} with size ${this.shape[dim]}`\n );\n }\n return normalized;\n });\n\n // Convert value to appropriate type based on dtype\n const currentDtype = this.dtype as DType;\n let convertedValue: number | bigint;\n\n if (isBigIntDType(currentDtype)) {\n // Convert to BigInt for BigInt dtypes\n convertedValue = typeof value === 'bigint' ? value : BigInt(Math.round(value));\n } else if (currentDtype === 'bool') {\n // Convert to 0 or 1 for bool dtype\n convertedValue = value ? 1 : 0;\n } else {\n // Convert to number for all other dtypes\n convertedValue = Number(value);\n }\n\n this._storage.set(normalizedIndices, convertedValue);\n }\n\n /**\n * Return a deep copy of the array\n */\n copy(): NDArray {\n return new NDArray(this._storage.copy());\n }\n\n /**\n * Cast array to a different dtype\n * @param dtype - Target dtype\n * @param copy - If false and dtype matches, return self; otherwise create copy (default: true)\n * @returns Array with specified dtype\n */\n astype(dtype: DType, copy: boolean = true): NDArray {\n const currentDtype = this.dtype as DType;\n\n // If dtype matches and copy=false, return self\n if (currentDtype === dtype && !copy) {\n return this;\n }\n\n // If dtype matches and copy=true, create a copy\n if (currentDtype === dtype && copy) {\n return this.copy();\n }\n\n // Need to convert dtype\n const shape = Array.from(this.shape);\n const size = this.size;\n\n // Get TypedArray constructor for conversion\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot convert to dtype ${dtype}`);\n }\n const newData = new Constructor(size);\n const oldData = this.data;\n\n // Handle BigInt to other types\n if (isBigIntDType(currentDtype) && !isBigIntDType(dtype)) {\n const typedOldData = oldData as BigInt64Array | BigUint64Array;\n if (dtype === 'bool') {\n for (let i = 0; i < size; i++) {\n (newData as Uint8Array)[i] = typedOldData[i] !== BigInt(0) ? 1 : 0;\n }\n } else {\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(\n typedOldData[i]\n );\n }\n }\n }\n // Handle other types to BigInt\n else if (!isBigIntDType(currentDtype) && isBigIntDType(dtype)) {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as BigInt64Array | BigUint64Array)[i] = BigInt(\n Math.round(Number(typedOldData[i]))\n );\n }\n }\n // Handle other types to bool\n else if (dtype === 'bool') {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as Uint8Array)[i] = typedOldData[i] !== 0 ? 1 : 0;\n }\n }\n // Handle bool to other types\n else if (currentDtype === 'bool' && !isBigIntDType(dtype)) {\n const typedOldData = oldData as Uint8Array;\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = typedOldData[i]!;\n }\n }\n // Handle regular numeric conversions\n else if (!isBigIntDType(currentDtype) && !isBigIntDType(dtype)) {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = typedOldData[i]!;\n }\n }\n // Handle BigInt to BigInt conversions (int64 <-> uint64)\n else {\n const typedOldData = oldData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n (newData as BigInt64Array | BigUint64Array)[i] = typedOldData[i]!;\n }\n }\n\n const storage = ArrayStorage.fromData(newData, shape, dtype);\n return new NDArray(storage);\n }\n\n // Arithmetic operations\n /**\n * Element-wise addition\n * @param other - Array or scalar to add\n * @returns Result of addition with broadcasting\n */\n add(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.add(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise subtraction\n * @param other - Array or scalar to subtract\n * @returns Result of subtraction with broadcasting\n */\n subtract(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.subtract(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise multiplication\n * @param other - Array or scalar to multiply\n * @returns Result of multiplication with broadcasting\n */\n multiply(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.multiply(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise division\n * @param other - Array or scalar to divide by\n * @returns Result of division with broadcasting\n */\n divide(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.divide(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise modulo operation\n * @param other - Array or scalar divisor\n * @returns Remainder after division\n */\n mod(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.mod(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise floor division\n * @param other - Array or scalar to divide by\n * @returns Floor of the quotient\n */\n floor_divide(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.floorDivide(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Numerical positive (element-wise +x)\n * @returns Copy of the array\n */\n positive(): NDArray {\n const resultStorage = arithmeticOps.positive(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise reciprocal (1/x)\n * @returns New array with reciprocals\n */\n reciprocal(): NDArray {\n const resultStorage = arithmeticOps.reciprocal(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Mathematical operations\n /**\n * Square root of each element\n * Promotes integer types to float64\n * @returns New array with square roots\n */\n sqrt(): NDArray {\n const resultStorage = exponentialOps.sqrt(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Raise elements to power\n * @param exponent - Power to raise to (array or scalar)\n * @returns New array with powered values\n */\n power(exponent: NDArray | number): NDArray {\n const exponentStorage = typeof exponent === 'number' ? exponent : exponent._storage;\n const resultStorage = exponentialOps.power(this._storage, exponentStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Absolute value of each element\n * @returns New array with absolute values\n */\n absolute(): NDArray {\n const resultStorage = arithmeticOps.absolute(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Numerical negative (element-wise negation)\n * @returns New array with negated values\n */\n negative(): NDArray {\n const resultStorage = arithmeticOps.negative(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Sign of each element (-1, 0, or 1)\n * @returns New array with signs\n */\n sign(): NDArray {\n const resultStorage = arithmeticOps.sign(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Trigonometric operations\n /**\n * Sine of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with sine values\n */\n sin(): NDArray {\n const resultStorage = trigOps.sin(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Cosine of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with cosine values\n */\n cos(): NDArray {\n const resultStorage = trigOps.cos(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Tangent of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with tangent values\n */\n tan(): NDArray {\n const resultStorage = trigOps.tan(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse sine of each element\n * Promotes integer types to float64\n * @returns New array with arcsin values (radians)\n */\n arcsin(): NDArray {\n const resultStorage = trigOps.arcsin(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse cosine of each element\n * Promotes integer types to float64\n * @returns New array with arccos values (radians)\n */\n arccos(): NDArray {\n const resultStorage = trigOps.arccos(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse tangent of each element\n * Promotes integer types to float64\n * @returns New array with arctan values (radians)\n */\n arctan(): NDArray {\n const resultStorage = trigOps.arctan(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise arc tangent of this/other choosing the quadrant correctly\n * @param other - x-coordinates (array or scalar)\n * @returns Angle in radians between -\u03C0 and \u03C0\n */\n arctan2(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = trigOps.arctan2(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Given the \"legs\" of a right triangle, return its hypotenuse\n * Equivalent to sqrt(this**2 + other**2), element-wise\n * @param other - Second leg (array or scalar)\n * @returns Hypotenuse values\n */\n hypot(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = trigOps.hypot(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Convert angles from radians to degrees\n * @returns New array with angles in degrees\n */\n degrees(): NDArray {\n const resultStorage = trigOps.degrees(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Convert angles from degrees to radians\n * @returns New array with angles in radians\n */\n radians(): NDArray {\n const resultStorage = trigOps.radians(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Hyperbolic operations\n /**\n * Hyperbolic sine of each element\n * Promotes integer types to float64\n * @returns New array with sinh values\n */\n sinh(): NDArray {\n const resultStorage = hyperbolicOps.sinh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Hyperbolic cosine of each element\n * Promotes integer types to float64\n * @returns New array with cosh values\n */\n cosh(): NDArray {\n const resultStorage = hyperbolicOps.cosh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Hyperbolic tangent of each element\n * Promotes integer types to float64\n * @returns New array with tanh values\n */\n tanh(): NDArray {\n const resultStorage = hyperbolicOps.tanh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic sine of each element\n * Promotes integer types to float64\n * @returns New array with arcsinh values\n */\n arcsinh(): NDArray {\n const resultStorage = hyperbolicOps.arcsinh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic cosine of each element\n * Promotes integer types to float64\n * @returns New array with arccosh values\n */\n arccosh(): NDArray {\n const resultStorage = hyperbolicOps.arccosh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic tangent of each element\n * Promotes integer types to float64\n * @returns New array with arctanh values\n */\n arctanh(): NDArray {\n const resultStorage = hyperbolicOps.arctanh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Comparison operations\n /**\n * Element-wise greater than comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n greater(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.greater(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise greater than or equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n greater_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.greaterEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise less than comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n less(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.less(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise less than or equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n less_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.lessEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise equality comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.equal(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise not equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n not_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.notEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise comparison with tolerance\n * Returns True where |a - b| <= (atol + rtol * |b|)\n * @param other - Value or array to compare with\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n isclose(other: NDArray | number, rtol: number = 1e-5, atol: number = 1e-8): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.isclose(this._storage, otherStorage, rtol, atol);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise comparison with tolerance\n * Returns True where |a - b| <= (atol + rtol * |b|)\n * @param other - Value or array to compare with\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n allclose(other: NDArray | number, rtol: number = 1e-5, atol: number = 1e-8): boolean {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n return comparisonOps.allclose(this._storage, otherStorage, rtol, atol);\n }\n\n // Bitwise operations\n /**\n * Bitwise AND element-wise\n * @param other - Array or scalar for AND operation (must be integer type)\n * @returns Result of bitwise AND\n */\n bitwise_and(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_and(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise OR element-wise\n * @param other - Array or scalar for OR operation (must be integer type)\n * @returns Result of bitwise OR\n */\n bitwise_or(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_or(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise XOR element-wise\n * @param other - Array or scalar for XOR operation (must be integer type)\n * @returns Result of bitwise XOR\n */\n bitwise_xor(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_xor(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise NOT (inversion) element-wise\n * @returns Result of bitwise NOT\n */\n bitwise_not(): NDArray {\n const resultStorage = bitwiseOps.bitwise_not(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Invert (bitwise NOT) element-wise - alias for bitwise_not\n * @returns Result of bitwise inversion\n */\n invert(): NDArray {\n const resultStorage = bitwiseOps.invert(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Left shift elements by positions\n * @param shift - Shift amount (array or scalar)\n * @returns Result of left shift\n */\n left_shift(shift: NDArray | number): NDArray {\n const shiftStorage = typeof shift === 'number' ? shift : shift._storage;\n const resultStorage = bitwiseOps.left_shift(this._storage, shiftStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Right shift elements by positions\n * @param shift - Shift amount (array or scalar)\n * @returns Result of right shift\n */\n right_shift(shift: NDArray | number): NDArray {\n const shiftStorage = typeof shift === 'number' ? shift : shift._storage;\n const resultStorage = bitwiseOps.right_shift(this._storage, shiftStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Reductions\n /**\n * Sum array elements over a given axis\n * @param axis - Axis along which to sum. If undefined, sum all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum of array elements, or array of sums along axis\n */\n sum(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.sum(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the arithmetic mean along the specified axis\n * @param axis - Axis along which to compute mean. If undefined, compute mean of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean of array elements, or array of means along axis\n *\n * Note: mean() returns float64 for integer dtypes, matching NumPy behavior\n */\n mean(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.mean(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the maximum along a given axis\n * @param axis - Axis along which to compute maximum. If undefined, compute maximum of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum of array elements, or array of maximums along axis\n */\n max(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.max(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the minimum along a given axis\n * @param axis - Axis along which to compute minimum. If undefined, compute minimum of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum of array elements, or array of minimums along axis\n */\n min(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.min(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Product of array elements over a given axis\n * @param axis - Axis along which to compute the product. If undefined, product of all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product of array elements, or array of products along axis\n */\n prod(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.prod(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Indices of the minimum values along an axis\n * @param axis - Axis along which to find minimum indices. If undefined, index of global minimum.\n * @returns Indices of minimum values\n */\n argmin(axis?: number): NDArray | number {\n const result = reductionOps.argmin(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Indices of the maximum values along an axis\n * @param axis - Axis along which to find maximum indices. If undefined, index of global maximum.\n * @returns Indices of maximum values\n */\n argmax(axis?: number): NDArray | number {\n const result = reductionOps.argmax(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute variance along the specified axis\n * @param axis - Axis along which to compute variance. If undefined, variance of all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance of array elements\n */\n var(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.variance(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute standard deviation along the specified axis\n * @param axis - Axis along which to compute std. If undefined, std of all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation of array elements\n */\n std(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.std(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Test whether all array elements along a given axis evaluate to True\n * @param axis - Axis along which to perform logical AND. If undefined, test all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Boolean or array of booleans\n */\n all(axis?: number, keepdims: boolean = false): NDArray | boolean {\n const result = reductionOps.all(this._storage, axis, keepdims);\n return typeof result === 'boolean' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Test whether any array elements along a given axis evaluate to True\n * @param axis - Axis along which to perform logical OR. If undefined, test all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Boolean or array of booleans\n */\n any(axis?: number, keepdims: boolean = false): NDArray | boolean {\n const result = reductionOps.any(this._storage, axis, keepdims);\n return typeof result === 'boolean' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the cumulative sum of elements along a given axis\n * @param axis - Axis along which to compute cumsum. If undefined, compute over flattened array.\n * @returns Array with cumulative sums\n */\n cumsum(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumsum(this._storage, axis));\n }\n\n /**\n * Return the cumulative product of elements along a given axis\n * @param axis - Axis along which to compute cumprod. If undefined, compute over flattened array.\n * @returns Array with cumulative products\n */\n cumprod(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumprod(this._storage, axis));\n }\n\n /**\n * Peak to peak (maximum - minimum) value along a given axis\n * @param axis - Axis along which to compute ptp. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Range of values\n */\n ptp(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.ptp(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the median along the specified axis\n * @param axis - Axis along which to compute median. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median of array elements\n */\n median(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.median(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the q-th percentile of the data along the specified axis\n * @param q - Percentile to compute (0-100)\n * @param axis - Axis along which to compute percentile. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Percentile of array elements\n */\n percentile(q: number, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.percentile(this._storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the q-th quantile of the data along the specified axis\n * @param q - Quantile to compute (0-1)\n * @param axis - Axis along which to compute quantile. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Quantile of array elements\n */\n quantile(q: number, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.quantile(this._storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the weighted average along the specified axis\n * @param weights - Array of weights (optional)\n * @param axis - Axis along which to compute average. If undefined, compute over all elements.\n * @returns Weighted average of array elements\n */\n average(weights?: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.average(this._storage, axis, weights?.storage);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the sum of array elements, treating NaNs as zero\n * @param axis - Axis along which to compute sum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum of array elements ignoring NaNs\n */\n nansum(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nansum(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the product of array elements, treating NaNs as ones\n * @param axis - Axis along which to compute product. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product of array elements ignoring NaNs\n */\n nanprod(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanprod(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the arithmetic mean, ignoring NaNs\n * @param axis - Axis along which to compute mean. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean of array elements ignoring NaNs\n */\n nanmean(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmean(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the variance, ignoring NaNs\n * @param axis - Axis along which to compute variance. If undefined, compute over all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance of array elements ignoring NaNs\n */\n nanvar(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanvar(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the standard deviation, ignoring NaNs\n * @param axis - Axis along which to compute std. If undefined, compute over all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation of array elements ignoring NaNs\n */\n nanstd(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanstd(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return minimum of an array or minimum along an axis, ignoring NaNs\n * @param axis - Axis along which to compute minimum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum of array elements ignoring NaNs\n */\n nanmin(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmin(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return maximum of an array or maximum along an axis, ignoring NaNs\n * @param axis - Axis along which to compute maximum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum of array elements ignoring NaNs\n */\n nanmax(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmax(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the indices of the minimum values, ignoring NaNs\n * @param axis - Axis along which to find minimum indices. If undefined, index of global minimum.\n * @returns Indices of minimum values ignoring NaNs\n */\n nanargmin(axis?: number): NDArray | number {\n const result = reductionOps.nanargmin(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the indices of the maximum values, ignoring NaNs\n * @param axis - Axis along which to find maximum indices. If undefined, index of global maximum.\n * @returns Indices of maximum values ignoring NaNs\n */\n nanargmax(axis?: number): NDArray | number {\n const result = reductionOps.nanargmax(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the cumulative sum of elements, treating NaNs as zero\n * @param axis - Axis along which to compute cumsum. If undefined, compute over flattened array.\n * @returns Array with cumulative sums ignoring NaNs\n */\n nancumsum(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumsum(this._storage, axis));\n }\n\n /**\n * Return the cumulative product of elements, treating NaNs as one\n * @param axis - Axis along which to compute cumprod. If undefined, compute over flattened array.\n * @returns Array with cumulative products ignoring NaNs\n */\n nancumprod(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumprod(this._storage, axis));\n }\n\n /**\n * Compute the median, ignoring NaNs\n * @param axis - Axis along which to compute median. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median of array elements ignoring NaNs\n */\n nanmedian(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmedian(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n // ========================================\n // Sorting and Searching\n // ========================================\n\n /**\n * Return a sorted copy of the array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\n sort(axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.sort(this._storage, axis));\n }\n\n /**\n * Returns the indices that would sort this array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the array\n */\n argsort(axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argsort(this._storage, axis));\n }\n\n /**\n * Partially sort the array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\n partition(kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.partition(this._storage, kth, axis));\n }\n\n /**\n * Returns indices that would partition the array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\n argpartition(kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argpartition(this._storage, kth, axis));\n }\n\n /**\n * Return the indices of non-zero elements\n * @returns Tuple of arrays, one for each dimension\n */\n nonzero(): NDArray[] {\n const storages = sortingOps.nonzero(this._storage);\n return storages.map((s) => NDArray._fromStorage(s));\n }\n\n /**\n * Find indices where elements should be inserted to maintain order\n * @param v - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\n searchsorted(v: NDArray, side: 'left' | 'right' = 'left'): NDArray {\n return NDArray._fromStorage(sortingOps.searchsorted(this._storage, v._storage, side));\n }\n\n // Shape manipulation\n /**\n * Reshape array to a new shape\n * Returns a new array with the specified shape\n * @param shape - New shape (must be compatible with current size)\n * @returns Reshaped array\n */\n reshape(...shape: number[]): NDArray {\n const newShape = shape.length === 1 && Array.isArray(shape[0]) ? shape[0] : shape;\n const resultStorage = shapeOps.reshape(this._storage, newShape);\n const isView = resultStorage.data === this.data;\n const base = isView ? (this._base ?? this) : undefined;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Return a flattened copy of the array\n * @returns 1D array containing all elements\n */\n flatten(): NDArray {\n const resultStorage = shapeOps.flatten(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Return a flattened array (view when possible, otherwise copy)\n * @returns 1D array containing all elements\n */\n ravel(): NDArray {\n const resultStorage = shapeOps.ravel(this._storage);\n const isView = resultStorage.data === this.data;\n const base = isView ? (this._base ?? this) : undefined;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Transpose array (permute dimensions)\n * @param axes - Permutation of axes. If undefined, reverse the dimensions\n * @returns Transposed array (always a view)\n */\n transpose(axes?: number[]): NDArray {\n const resultStorage = shapeOps.transpose(this._storage, axes);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Remove axes of length 1\n * @param axis - Axis to squeeze. If undefined, squeeze all axes of length 1\n * @returns Array with specified dimensions removed (always a view)\n */\n squeeze(axis?: number): NDArray {\n const resultStorage = shapeOps.squeeze(this._storage, axis);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Expand the shape by inserting a new axis of length 1\n * @param axis - Position where new axis is placed\n * @returns Array with additional dimension (always a view)\n */\n expand_dims(axis: number): NDArray {\n const resultStorage = shapeOps.expandDims(this._storage, axis);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Swap two axes of an array\n * @param axis1 - First axis\n * @param axis2 - Second axis\n * @returns Array with swapped axes (always a view)\n */\n swapaxes(axis1: number, axis2: number): NDArray {\n const resultStorage = shapeOps.swapaxes(this._storage, axis1, axis2);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Move axes to new positions\n * @param source - Original positions of axes to move\n * @param destination - New positions for axes\n * @returns Array with moved axes (always a view)\n */\n moveaxis(source: number | number[], destination: number | number[]): NDArray {\n const resultStorage = shapeOps.moveaxis(this._storage, source, destination);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Repeat elements of an array\n * @param repeats - Number of repetitions for each element\n * @param axis - Axis along which to repeat (if undefined, flattens first)\n * @returns New array with repeated elements\n */\n repeat(repeats: number | number[], axis?: number): NDArray {\n const resultStorage = shapeOps.repeat(this._storage, repeats, axis);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Take elements from array along an axis\n * @param indices - Indices of elements to take\n * @param axis - Axis along which to take (if undefined, flattens first)\n * @returns New array with selected elements\n */\n take(indices: number[], axis?: number): NDArray {\n const resultStorage = advancedOps.take(this._storage, indices, axis);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Put values at specified indices (modifies array in-place)\n * @param indices - Indices at which to place values\n * @param values - Values to put\n */\n put(indices: number[], values: NDArray | number | bigint): void {\n const valuesStorage = values instanceof NDArray ? values._storage : values;\n advancedOps.put(this._storage, indices, valuesStorage);\n }\n\n // Linear algebra operations\n /**\n * Matrix multiplication\n * @param other - Array to multiply with\n * @returns Result of matrix multiplication\n */\n matmul(other: NDArray): NDArray {\n const resultStorage = linalgOps.matmul(this._storage, other._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Dot product (matching NumPy behavior)\n * @param other - Array to dot with\n * @returns Result of dot product (scalar or array depending on dimensions)\n */\n dot(other: NDArray): NDArray | number | bigint {\n const result = linalgOps.dot(this._storage, other._storage);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n /**\n * Sum of diagonal elements (trace)\n * @returns Sum of diagonal elements\n */\n trace(): number | bigint {\n return linalgOps.trace(this._storage);\n }\n\n /**\n * Inner product (contracts over last axes of both arrays)\n * @param other - Array to compute inner product with\n * @returns Inner product result\n */\n inner(other: NDArray): NDArray | number | bigint {\n const result = linalgOps.inner(this._storage, other._storage);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n /**\n * Outer product (flattens inputs then computes a[i]*b[j])\n * @param other - Array to compute outer product with\n * @returns 2D outer product matrix\n */\n outer(other: NDArray): NDArray {\n const result = linalgOps.outer(this._storage, other._storage);\n return NDArray._fromStorage(result);\n }\n\n /**\n * Tensor dot product along specified axes\n * @param other - Array to contract with\n * @param axes - Axes to contract (integer or [a_axes, b_axes])\n * @returns Tensor dot product result\n */\n tensordot(other: NDArray, axes: number | [number[], number[]] = 2): NDArray | number | bigint {\n const result = linalgOps.tensordot(this._storage, other._storage, axes);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n // Additional arithmetic operations\n\n /**\n * Element-wise cube root\n * Promotes integer types to float64\n * @returns New array with cube root values\n */\n cbrt(): NDArray {\n const resultStorage = arithmeticOps.cbrt(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise absolute value (always returns float)\n * @returns New array with absolute values as float\n */\n fabs(): NDArray {\n const resultStorage = arithmeticOps.fabs(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Returns both quotient and remainder (floor divide and modulo)\n * @param divisor - Array or scalar divisor\n * @returns Tuple of [quotient, remainder] arrays\n */\n divmod(divisor: NDArray | number): [NDArray, NDArray] {\n const divisorStorage = typeof divisor === 'number' ? divisor : divisor._storage;\n const [quotientStorage, remainderStorage] = arithmeticOps.divmod(this._storage, divisorStorage);\n return [NDArray._fromStorage(quotientStorage), NDArray._fromStorage(remainderStorage)];\n }\n\n /**\n * Element-wise square (x**2)\n * @returns New array with squared values\n */\n square(): NDArray {\n const resultStorage = arithmeticOps.square(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise remainder (same as mod)\n * @param divisor - Array or scalar divisor\n * @returns New array with remainder values\n */\n remainder(divisor: NDArray | number): NDArray {\n const divisorStorage = typeof divisor === 'number' ? divisor : divisor._storage;\n const resultStorage = arithmeticOps.remainder(this._storage, divisorStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Heaviside step function\n * @param x2 - Value to use when this array element is 0\n * @returns New array with heaviside values\n */\n heaviside(x2: NDArray | number): NDArray {\n const x2Storage = typeof x2 === 'number' ? x2 : x2._storage;\n const resultStorage = arithmeticOps.heaviside(this._storage, x2Storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Slicing\n /**\n * Slice the array using NumPy-style string syntax\n *\n * @param sliceStrs - Slice specifications, one per dimension\n * @returns Sliced view of the array\n */\n slice(...sliceStrs: string[]): NDArray {\n if (sliceStrs.length === 0) {\n return this;\n }\n\n if (sliceStrs.length > this.ndim) {\n throw new Error(\n `Too many indices for array: array is ${this.ndim}-dimensional, but ${sliceStrs.length} were indexed`\n );\n }\n\n // Parse slice strings and normalize them\n const sliceSpecs = sliceStrs.map((str, i) => {\n const spec = parseSlice(str);\n const normalized = normalizeSlice(spec, this.shape[i]!);\n return normalized;\n });\n\n // Pad with full slices for remaining dimensions\n while (sliceSpecs.length < this.ndim) {\n sliceSpecs.push({\n start: 0,\n stop: this.shape[sliceSpecs.length]!,\n step: 1,\n isIndex: false,\n });\n }\n\n // Calculate new shape and strides\n const newShape: number[] = [];\n const newStrides: number[] = [];\n let newOffset = this._storage.offset;\n\n for (let i = 0; i < sliceSpecs.length; i++) {\n const spec = sliceSpecs[i]!;\n const stride = this._storage.strides[i]!;\n\n // Update offset based on start position\n newOffset += spec.start * stride;\n\n if (!spec.isIndex) {\n // Calculate size of this dimension\n // For positive step: (stop - start) / step\n // For negative step: (start - stop) / |step| (since we go from high to low)\n let dimSize: number;\n if (spec.step > 0) {\n dimSize = Math.max(0, Math.ceil((spec.stop - spec.start) / spec.step));\n } else {\n // Negative step: iterate from start down to (but not including) stop\n dimSize = Math.max(0, Math.ceil((spec.start - spec.stop) / Math.abs(spec.step)));\n }\n newShape.push(dimSize);\n newStrides.push(stride * spec.step);\n }\n // If isIndex is true, this dimension is removed (scalar indexing)\n }\n\n // Create sliced view\n const slicedStorage = ArrayStorage.fromData(\n this._storage.data,\n newShape,\n this._storage.dtype,\n newStrides,\n newOffset\n );\n\n const base = this._base ?? this;\n return new NDArray(slicedStorage, base);\n }\n\n // Convenience methods\n /**\n * Get a single row (convenience method)\n * @param i - Row index\n * @returns Row as 1D or (n-1)D array\n */\n\n row(i: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('row() requires at least 2 dimensions');\n }\n return this.slice(String(i), ':');\n }\n\n /**\n * Get a single column (convenience method)\n * @param j - Column index\n * @returns Column as 1D or (n-1)D array\n */\n col(j: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('col() requires at least 2 dimensions');\n }\n return this.slice(':', String(j));\n }\n\n /**\n * Get a range of rows (convenience method)\n * @param start - Start row index\n * @param stop - Stop row index (exclusive)\n * @returns Rows as array\n */\n rows(start: number, stop: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('rows() requires at least 2 dimensions');\n }\n return this.slice(`${start}:${stop}`, ':');\n }\n\n /**\n * Get a range of columns (convenience method)\n * @param start - Start column index\n * @param stop - Stop column index (exclusive)\n * @returns Columns as array\n */\n cols(start: number, stop: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('cols() requires at least 2 dimensions');\n }\n return this.slice(':', `${start}:${stop}`);\n }\n\n // String representation\n /**\n * String representation of the array\n * @returns String describing the array shape and dtype\n */\n toString(): string {\n return `NDArray(shape=${JSON.stringify(this.shape)}, dtype=${this.dtype})`;\n }\n\n /**\n * Convert to nested JavaScript array\n * @returns Nested JavaScript array representation\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toArray(): any {\n // Handle 0-dimensional arrays (scalars)\n if (this.ndim === 0) {\n return this._storage.iget(0);\n }\n\n const shape = this.shape;\n const ndim = shape.length;\n\n // Recursive function to build nested array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildNestedArray = (indices: number[], dim: number): any => {\n if (dim === ndim) {\n return this._storage.get(...indices);\n }\n\n const arr = [];\n for (let i = 0; i < shape[dim]!; i++) {\n indices[dim] = i;\n arr.push(buildNestedArray(indices, dim + 1));\n }\n return arr;\n };\n\n return buildNestedArray(new Array(ndim), 0);\n }\n}\n\n// Creation functions\n\n/**\n * Create array of zeros\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Array filled with zeros\n */\nexport function zeros(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n const storage = ArrayStorage.zeros(shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array of ones\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Array filled with ones\n */\nexport function ones(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n const storage = ArrayStorage.ones(shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Helper to infer shape from nested arrays\n */\nfunction inferShape(data: unknown): number[] {\n const shape: number[] = [];\n let current = data;\n while (Array.isArray(current)) {\n shape.push(current.length);\n current = current[0];\n }\n return shape;\n}\n\n/**\n * Helper to check if data contains BigInt values\n */\nfunction containsBigInt(data: unknown): boolean {\n if (typeof data === 'bigint') return true;\n if (Array.isArray(data)) {\n return data.some((item) => containsBigInt(item));\n }\n return false;\n}\n\n/**\n * Helper to flatten nested arrays keeping BigInt values\n */\nfunction flattenKeepBigInt(data: unknown): unknown[] {\n const result: unknown[] = [];\n function flatten(arr: unknown): void {\n if (Array.isArray(arr)) {\n arr.forEach((item) => flatten(item));\n } else {\n result.push(arr);\n }\n }\n flatten(data);\n return result;\n}\n\n/**\n * Create array from nested JavaScript arrays\n * @param data - Nested arrays or existing NDArray\n * @param dtype - Data type (optional, will be inferred if not provided)\n * @returns New NDArray\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function array(data: any, dtype?: DType): NDArray {\n // If data is already an NDArray, optionally convert dtype\n if (data instanceof NDArray) {\n if (!dtype || data.dtype === dtype) {\n return data.copy();\n }\n return data.astype(dtype);\n }\n\n const hasBigInt = containsBigInt(data);\n\n // Infer shape from nested arrays\n const shape = inferShape(data);\n const size = shape.reduce((a: number, b: number) => a * b, 1);\n\n // Determine dtype\n let actualDtype = dtype;\n if (!actualDtype) {\n if (hasBigInt) {\n actualDtype = 'int64';\n } else {\n actualDtype = DEFAULT_DTYPE;\n }\n }\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(actualDtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${actualDtype}`);\n }\n\n const typedData = new Constructor(size);\n const flatData = flattenKeepBigInt(data);\n\n // Fill the typed array\n if (isBigIntDType(actualDtype)) {\n const bigintData = typedData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = flatData[i];\n bigintData[i] = typeof val === 'bigint' ? val : BigInt(Math.round(Number(val)));\n }\n } else if (actualDtype === 'bool') {\n const boolData = typedData as Uint8Array;\n for (let i = 0; i < size; i++) {\n boolData[i] = flatData[i] ? 1 : 0;\n }\n } else {\n const numData = typedData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n const val = flatData[i];\n numData[i] = typeof val === 'bigint' ? Number(val) : Number(val);\n }\n }\n\n const storage = ArrayStorage.fromData(typedData, shape, actualDtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with evenly spaced values within a given interval\n * Similar to Python's range() but returns array\n * @param start - Start value (or stop if only one argument)\n * @param stop - Stop value (exclusive)\n * @param step - Step between values (default: 1)\n * @param dtype - Data type (default: float64)\n * @returns Array of evenly spaced values\n */\nexport function arange(\n start: number,\n stop?: number,\n step: number = 1,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n let actualStart = start;\n let actualStop = stop;\n\n if (stop === undefined) {\n actualStart = 0;\n actualStop = start;\n }\n\n if (actualStop === undefined) {\n throw new Error('stop is required');\n }\n\n const length = Math.max(0, Math.ceil((actualStop - actualStart) / step));\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create arange array with dtype ${dtype}`);\n }\n\n const data = new Constructor(length);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < length; i++) {\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(actualStart + i * step));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < length; i++) {\n (data as Uint8Array)[i] = actualStart + i * step !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < length; i++) {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = actualStart + i * step;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [length], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with evenly spaced values over a specified interval\n * @param start - Starting value\n * @param stop - Ending value (inclusive)\n * @param num - Number of samples (default: 50)\n * @param dtype - Data type (default: float64)\n * @returns Array of evenly spaced values\n */\nexport function linspace(\n start: number,\n stop: number,\n num: number = 50,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([start], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create linspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const step = (stop - start) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(start + i * step));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n (data as Uint8Array)[i] = start + i * step !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = start + i * step;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with logarithmically spaced values\n * Returns num samples, equally spaced on a log scale from base^start to base^stop\n * @param start - base^start is the starting value\n * @param stop - base^stop is the ending value\n * @param num - Number of samples (default: 50)\n * @param base - Base of the log space (default: 10.0)\n * @param dtype - Data type (default: float64)\n * @returns Array of logarithmically spaced values\n */\nexport function logspace(\n start: number,\n stop: number,\n num: number = 50,\n base: number = 10.0,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([Math.pow(base, start)], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create logspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const step = (stop - start) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(Math.pow(base, exponent)));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as Uint8Array)[i] = Math.pow(base, exponent) !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Math.pow(base, exponent);\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with geometrically spaced values\n * Returns num samples, equally spaced on a log scale (geometric progression)\n * @param start - Starting value\n * @param stop - Ending value\n * @param num - Number of samples (default: 50)\n * @param dtype - Data type (default: float64)\n * @returns Array of geometrically spaced values\n */\nexport function geomspace(\n start: number,\n stop: number,\n num: number = 50,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (start === 0 || stop === 0) {\n throw new Error('Geometric sequence cannot include zero');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([start], dtype);\n }\n\n const signStart = Math.sign(start);\n const signStop = Math.sign(stop);\n\n if (signStart !== signStop) {\n throw new Error('Geometric sequence cannot contain both positive and negative values');\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create geomspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const logStart = Math.log(Math.abs(start));\n const logStop = Math.log(Math.abs(stop));\n const step = (logStop - logStart) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(value));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as Uint8Array)[i] = value !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create identity matrix\n * @param n - Number of rows\n * @param m - Number of columns (default: n)\n * @param k - Index of diagonal (0 for main diagonal, positive for upper, negative for lower)\n * @param dtype - Data type (default: float64)\n * @returns Identity matrix\n */\nexport function eye(n: number, m?: number, k: number = 0, dtype: DType = DEFAULT_DTYPE): NDArray {\n const cols = m ?? n;\n const result = zeros([n, cols], dtype);\n const data = result.data;\n\n if (isBigIntDType(dtype)) {\n const typedData = data as unknown as BigInt64Array | BigUint64Array;\n for (let i = 0; i < n; i++) {\n const j = i + k;\n if (j >= 0 && j < cols) {\n typedData[i * cols + j] = BigInt(1);\n }\n }\n } else {\n const typedData = data as unknown as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < n; i++) {\n const j = i + k;\n if (j >= 0 && j < cols) {\n typedData[i * cols + j] = 1;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Create an uninitialized array\n * Note: TypedArrays are zero-initialized by default in JavaScript\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Uninitialized array\n */\nexport function empty(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n return zeros(shape, dtype);\n}\n\n/**\n * Create array filled with a constant value\n * @param shape - Shape of the array\n * @param fill_value - Value to fill the array with\n * @param dtype - Data type (optional, inferred from fill_value if not provided)\n * @returns Array filled with the constant value\n */\nexport function full(\n shape: number[],\n fill_value: number | bigint | boolean,\n dtype?: DType\n): NDArray {\n let actualDtype = dtype;\n if (!actualDtype) {\n if (typeof fill_value === 'bigint') {\n actualDtype = 'int64';\n } else if (typeof fill_value === 'boolean') {\n actualDtype = 'bool';\n } else if (Number.isInteger(fill_value)) {\n actualDtype = 'int32';\n } else {\n actualDtype = DEFAULT_DTYPE;\n }\n }\n\n const Constructor = getTypedArrayConstructor(actualDtype);\n if (!Constructor) {\n throw new Error(`Cannot create full array with dtype ${actualDtype}`);\n }\n const size = shape.reduce((a, b) => a * b, 1);\n const data = new Constructor(size);\n\n if (isBigIntDType(actualDtype)) {\n const bigintValue =\n typeof fill_value === 'bigint' ? fill_value : BigInt(Math.round(Number(fill_value)));\n (data as BigInt64Array | BigUint64Array).fill(bigintValue);\n } else if (actualDtype === 'bool') {\n (data as Uint8Array).fill(fill_value ? 1 : 0);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(Number(fill_value));\n }\n\n const storage = ArrayStorage.fromData(data, shape, actualDtype);\n return new NDArray(storage);\n}\n\n/**\n * Create a square identity matrix\n * @param n - Size of the square matrix\n * @param dtype - Data type (default: float64)\n * @returns n\u00D7n identity matrix\n */\nexport function identity(n: number, dtype: DType = DEFAULT_DTYPE): NDArray {\n return eye(n, n, 0, dtype);\n}\n\n/**\n * Convert input to an ndarray\n * @param a - Input data (array-like or NDArray)\n * @param dtype - Data type (optional)\n * @returns NDArray representation of the input\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asarray(a: NDArray | any, dtype?: DType): NDArray {\n if (a instanceof NDArray) {\n if (!dtype || a.dtype === dtype) {\n return a;\n }\n return a.astype(dtype);\n }\n return array(a, dtype);\n}\n\n/**\n * Create a deep copy of an array\n * @param a - Array to copy\n * @returns Deep copy of the array\n */\nexport function copy(a: NDArray): NDArray {\n return a.copy();\n}\n\n/**\n * Create array of zeros with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Array of zeros\n */\nexport function zeros_like(a: NDArray, dtype?: DType): NDArray {\n return zeros(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create array of ones with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Array of ones\n */\nexport function ones_like(a: NDArray, dtype?: DType): NDArray {\n return ones(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create uninitialized array with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Uninitialized array\n */\nexport function empty_like(a: NDArray, dtype?: DType): NDArray {\n return empty(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create array filled with a constant value, same shape as another array\n * @param a - Array to match shape from\n * @param fill_value - Value to fill with\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Filled array\n */\nexport function full_like(\n a: NDArray,\n fill_value: number | bigint | boolean,\n dtype?: DType\n): NDArray {\n return full(Array.from(a.shape), fill_value, dtype ?? (a.dtype as DType));\n}\n\n/**\n * Convert input to an ndarray (alias for asarray for compatibility)\n * In numpy-ts, this behaves the same as asarray since we don't have subclasses\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns NDArray\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asanyarray(a: NDArray | any, dtype?: DType): NDArray {\n return asarray(a, dtype);\n}\n\n/**\n * Return a contiguous array (ndim >= 1) in memory (C order)\n * Since our arrays are already C-contiguous in memory, this either\n * returns the input unchanged or creates a contiguous copy\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns Contiguous array in C order\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ascontiguousarray(a: NDArray | any, dtype?: DType): NDArray {\n const arr = asarray(a, dtype);\n if (arr.flags.C_CONTIGUOUS) {\n return arr;\n }\n return arr.copy();\n}\n\n/**\n * Return an array laid out in Fortran order in memory\n * Note: numpy-ts uses C-order internally, so this creates a copy\n * that is equivalent to the Fortran-ordered layout\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns Array (copy in C order, as Fortran order is not supported)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asfortranarray(a: NDArray | any, dtype?: DType): NDArray {\n const arr = asarray(a, dtype);\n // We always return C-contiguous arrays, so just return a copy\n return arr.copy();\n}\n\n/**\n * Extract a diagonal or construct a diagonal array\n * @param v - Input array (if 2D, extract diagonal; if 1D, construct diagonal matrix)\n * @param k - Diagonal offset (default 0 is main diagonal, positive above, negative below)\n * @returns Diagonal elements as 1D array, or 2D diagonal matrix\n */\nexport function diag(v: NDArray, k: number = 0): NDArray {\n if (v.ndim === 1) {\n // Construct diagonal matrix from 1D array\n const n = v.size;\n const size = n + Math.abs(k);\n const result = zeros([size, size], v.dtype as DType);\n\n for (let i = 0; i < n; i++) {\n const row = k >= 0 ? i : i - k;\n const col = k >= 0 ? i + k : i;\n result.set([row, col], v.get([i]) as number);\n }\n return result;\n } else if (v.ndim === 2) {\n // Extract diagonal from 2D array\n const [rows, cols] = v.shape;\n let startRow: number, startCol: number, diagLength: number;\n\n if (k >= 0) {\n startRow = 0;\n startCol = k;\n diagLength = Math.min(rows!, cols! - k);\n } else {\n startRow = -k;\n startCol = 0;\n diagLength = Math.min(rows! + k, cols!);\n }\n\n if (diagLength <= 0) {\n return zeros([0], v.dtype as DType);\n }\n\n const Constructor = getTypedArrayConstructor(v.dtype as DType);\n const data = new Constructor!(diagLength);\n\n for (let i = 0; i < diagLength; i++) {\n const val = v.get([startRow + i, startCol + i]);\n if (isBigIntDType(v.dtype as DType)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof val === 'bigint' ? val : BigInt(val as number);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = val as number;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [diagLength], v.dtype as DType);\n return new NDArray(storage);\n } else {\n throw new Error('Input must be 1-D or 2-D');\n }\n}\n\n/**\n * Create a 2-D array with the flattened input as a diagonal\n * @param v - Input array (will be flattened)\n * @param k - Diagonal offset (default 0)\n * @returns 2D diagonal matrix\n */\nexport function diagflat(v: NDArray, k: number = 0): NDArray {\n const flat = v.flatten();\n return diag(flat, k);\n}\n\n/**\n * Construct an array by executing a function over each coordinate\n * @param fn - Function that takes coordinate indices and returns value\n * @param shape - Shape of output array\n * @param dtype - Data type (default: float64)\n * @returns Array with values computed from function\n */\nexport function fromfunction(\n fn: (...indices: number[]) => number | bigint | boolean,\n shape: number[],\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n const size = shape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n const data = new Constructor(size);\n const ndim = shape.length;\n const indices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n const value = fn(...indices);\n\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof value === 'bigint' ? value : BigInt(Number(value));\n } else if (dtype === 'bool') {\n (data as Uint8Array)[i] = value ? 1 : 0;\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(value);\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < shape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n\n const storage = ArrayStorage.fromData(data, shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Return coordinate matrices from coordinate vectors\n * @param arrays - 1D coordinate arrays\n * @param indexing - 'xy' (Cartesian, default) or 'ij' (matrix indexing)\n * @returns Array of coordinate grids\n */\nexport function meshgrid(...args: (NDArray | { indexing?: 'xy' | 'ij' })[]): NDArray[] {\n // Parse arguments - last arg might be options\n let arrays: NDArray[] = [];\n let indexing: 'xy' | 'ij' = 'xy';\n\n for (const arg of args) {\n if (arg instanceof NDArray) {\n arrays.push(arg);\n } else if (typeof arg === 'object' && 'indexing' in arg) {\n indexing = arg.indexing || 'xy';\n }\n }\n\n if (arrays.length === 0) {\n return [];\n }\n\n if (arrays.length === 1) {\n return [arrays[0]!.copy()];\n }\n\n // Get sizes\n const sizes = arrays.map((a) => a.size);\n\n // For 'xy' indexing, swap first two dimensions\n if (indexing === 'xy' && arrays.length >= 2) {\n arrays = [arrays[1]!, arrays[0]!, ...arrays.slice(2)];\n [sizes[0], sizes[1]] = [sizes[1]!, sizes[0]!];\n }\n\n // Output shape is the combination of all input sizes\n const outputShape = sizes;\n const ndim = outputShape.length;\n\n const results: NDArray[] = [];\n\n for (let i = 0; i < arrays.length; i++) {\n const inputArr = arrays[i]!;\n const inputSize = inputArr.size;\n\n // Build the shape for broadcasting this array\n const broadcastShape: number[] = new Array(ndim).fill(1);\n broadcastShape[i] = inputSize;\n\n // Reshape and broadcast\n const reshaped = inputArr.reshape(...broadcastShape);\n const resultStorage = advancedOps.broadcast_to(reshaped.storage, outputShape);\n const result = NDArray._fromStorage(resultStorage.copy()); // copy to make contiguous\n results.push(result);\n }\n\n // For 'xy' indexing, swap back the first two results\n if (indexing === 'xy' && results.length >= 2) {\n [results[0], results[1]] = [results[1]!, results[0]!];\n }\n\n return results;\n}\n\n/**\n * An array with ones at and below the given diagonal and zeros elsewhere\n * @param N - Number of rows\n * @param M - Number of columns (default: N)\n * @param k - Diagonal offset (default 0)\n * @param dtype - Data type (default: float64)\n * @returns Triangular array\n */\nexport function tri(N: number, M?: number, k: number = 0, dtype: DType = DEFAULT_DTYPE): NDArray {\n const cols = M ?? N;\n const result = zeros([N, cols], dtype);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j <= i + k && j < cols; j++) {\n if (j >= 0) {\n result.set([i, j], 1);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Lower triangle of an array\n * @param m - Input array\n * @param k - Diagonal above which to zero elements (default 0)\n * @returns Copy with upper triangle zeroed\n */\nexport function tril(m: NDArray, k: number = 0): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must have at least 2 dimensions');\n }\n\n const result = m.copy();\n const shape = result.shape;\n const rows = shape[shape.length - 2]!;\n const cols = shape[shape.length - 1]!;\n\n // Handle multi-dimensional arrays\n const outerSize = shape.slice(0, -2).reduce((a, b) => a * b, 1);\n\n for (let outer = 0; outer < outerSize; outer++) {\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n if (j > i + k) {\n // Build the indices array\n const indices: number[] = [];\n let temp = outer;\n for (let d = shape.length - 3; d >= 0; d--) {\n indices.unshift(temp % shape[d]!);\n temp = Math.floor(temp / shape[d]!);\n }\n indices.push(i, j);\n result.set(indices, 0);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Upper triangle of an array\n * @param m - Input array\n * @param k - Diagonal below which to zero elements (default 0)\n * @returns Copy with lower triangle zeroed\n */\nexport function triu(m: NDArray, k: number = 0): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must have at least 2 dimensions');\n }\n\n const result = m.copy();\n const shape = result.shape;\n const rows = shape[shape.length - 2]!;\n const cols = shape[shape.length - 1]!;\n\n // Handle multi-dimensional arrays\n const outerSize = shape.slice(0, -2).reduce((a, b) => a * b, 1);\n\n for (let outer = 0; outer < outerSize; outer++) {\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n if (j < i + k) {\n // Build the indices array\n const indices: number[] = [];\n let temp = outer;\n for (let d = shape.length - 3; d >= 0; d--) {\n indices.unshift(temp % shape[d]!);\n temp = Math.floor(temp / shape[d]!);\n }\n indices.push(i, j);\n result.set(indices, 0);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Generate a Vandermonde matrix\n * @param x - Input 1D array\n * @param N - Number of columns (default: length of x)\n * @param increasing - Order of powers (default: false, highest powers first)\n * @returns Vandermonde matrix\n */\nexport function vander(x: NDArray, N?: number, increasing: boolean = false): NDArray {\n if (x.ndim !== 1) {\n throw new Error('Input must be 1-D');\n }\n\n const len = x.size;\n const cols = N ?? len;\n\n if (cols < 0) {\n throw new Error('N must be non-negative');\n }\n\n const result = zeros([len, cols], x.dtype as DType);\n\n for (let i = 0; i < len; i++) {\n const val = x.get([i]) as number;\n for (let j = 0; j < cols; j++) {\n const power = increasing ? j : cols - 1 - j;\n result.set([i, j], Math.pow(val, power));\n }\n }\n\n return result;\n}\n\n/**\n * Interpret a buffer as a 1-dimensional array\n * @param buffer - Buffer-like object (ArrayBuffer, TypedArray, or DataView)\n * @param dtype - Data type (default: float64)\n * @param count - Number of items to read (-1 means all)\n * @param offset - Start reading from this byte offset\n * @returns NDArray from buffer data\n */\nexport function frombuffer(\n buffer: ArrayBuffer | ArrayBufferView,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1,\n offset: number = 0\n): NDArray {\n let arrayBuffer: ArrayBufferLike;\n let byteOffset = offset;\n\n if (buffer instanceof ArrayBuffer) {\n arrayBuffer = buffer;\n } else {\n // It's a TypedArray or DataView\n arrayBuffer = buffer.buffer;\n byteOffset += buffer.byteOffset;\n }\n\n const bytesPerElement = getBytesPerElement(dtype);\n const availableBytes = arrayBuffer.byteLength - byteOffset;\n const maxElements = Math.floor(availableBytes / bytesPerElement);\n const numElements = count < 0 ? maxElements : Math.min(count, maxElements);\n\n if (numElements <= 0) {\n return array([], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Unsupported dtype: ${dtype}`);\n }\n\n // Create a view into the buffer\n const data = new Constructor(arrayBuffer as ArrayBuffer, byteOffset, numElements);\n const storage = ArrayStorage.fromData(data as TypedArray, [numElements], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Construct an array by executing a function over each coordinate.\n * Note: This is a JS implementation - fromfile for actual files isn't directly applicable in browser JS.\n * This function creates an array from an iterable or callable.\n * @param file - In JS context, this is an iterable yielding values\n * @param dtype - Data type\n * @param count - Number of items to read (-1 means all)\n * @returns NDArray from the iterable\n */\nexport function fromfile(\n file: Iterable<number | bigint>,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1\n): NDArray {\n // In JavaScript, we interpret this as reading from an iterable\n const values: Array<number | bigint> = [];\n let i = 0;\n\n for (const val of file) {\n if (count >= 0 && i >= count) break;\n values.push(val);\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Create a new 1-dimensional array from an iterable object\n * @param iter - Iterable object\n * @param dtype - Data type\n * @param count - Number of items to read (-1 means all)\n * @returns NDArray from the iterable\n */\nexport function fromiter(\n iter: Iterable<number | bigint>,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1\n): NDArray {\n const values: Array<number | bigint> = [];\n let i = 0;\n\n for (const val of iter) {\n if (count >= 0 && i >= count) break;\n values.push(val);\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Create a new 1-dimensional array from text string\n * @param string - Input string containing numbers separated by whitespace or separator\n * @param dtype - Data type (default: float64)\n * @param count - Number of items to read (-1 means all)\n * @param sep - Separator between values (default: any whitespace)\n * @returns NDArray from parsed string\n */\nexport function fromstring(\n string: string,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1,\n sep: string = ''\n): NDArray {\n // Split the string by separator (or whitespace if sep is empty)\n let parts: string[];\n if (sep === '') {\n parts = string.trim().split(/\\s+/);\n } else {\n parts = string.split(sep);\n }\n\n // Parse values\n const values: Array<number | bigint> = [];\n let i = 0;\n for (const part of parts) {\n if (count >= 0 && i >= count) break;\n const trimmed = part.trim();\n if (trimmed === '') continue;\n\n if (isBigIntDType(dtype)) {\n values.push(BigInt(trimmed));\n } else {\n values.push(parseFloat(trimmed));\n }\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Helper to get bytes per element for a dtype\n */\nfunction getBytesPerElement(dtype: DType): number {\n switch (dtype) {\n case 'int8':\n case 'uint8':\n case 'bool':\n return 1;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return 4;\n case 'int64':\n case 'uint64':\n case 'float64':\n return 8;\n default:\n return 8;\n }\n}\n\n// Mathematical functions (standalone)\n\n/**\n * Element-wise square root\n * @param x - Input array\n * @returns Array of square roots\n */\nexport function sqrt(x: NDArray): NDArray {\n return x.sqrt();\n}\n\n/**\n * Element-wise power\n * @param x - Base array\n * @param exponent - Exponent (array or scalar)\n * @returns Array of x raised to exponent\n */\nexport function power(x: NDArray, exponent: NDArray | number): NDArray {\n return x.power(exponent);\n}\n\n/**\n * Element-wise absolute value\n * @param x - Input array\n * @returns Array of absolute values\n */\nexport function absolute(x: NDArray): NDArray {\n return x.absolute();\n}\n\n/**\n * Element-wise negation\n * @param x - Input array\n * @returns Array of negated values\n */\nexport function negative(x: NDArray): NDArray {\n return x.negative();\n}\n\n/**\n * Element-wise sign (-1, 0, or 1)\n * @param x - Input array\n * @returns Array of signs\n */\nexport function sign(x: NDArray): NDArray {\n return x.sign();\n}\n\n/**\n * Element-wise modulo\n * @param x - Dividend array\n * @param divisor - Divisor (array or scalar)\n * @returns Remainder after division\n */\nexport function mod(x: NDArray, divisor: NDArray | number): NDArray {\n return x.mod(divisor);\n}\n\n/**\n * Element-wise floor division\n * @param x - Dividend array\n * @param divisor - Divisor (array or scalar)\n * @returns Floor of the quotient\n */\nexport function floor_divide(x: NDArray, divisor: NDArray | number): NDArray {\n return x.floor_divide(divisor);\n}\n\n/**\n * Element-wise positive (unary +)\n * @param x - Input array\n * @returns Copy of the array\n */\nexport function positive(x: NDArray): NDArray {\n return x.positive();\n}\n\n/**\n * Element-wise reciprocal (1/x)\n * @param x - Input array\n * @returns Array of reciprocals\n */\nexport function reciprocal(x: NDArray): NDArray {\n return x.reciprocal();\n}\n\n/**\n * Dot product of two arrays\n *\n * Fully NumPy-compatible. Behavior depends on input dimensions:\n * - 0D \u00B7 0D: Multiply scalars \u2192 scalar\n * - 0D \u00B7 ND or ND \u00B7 0D: Element-wise multiply \u2192 ND\n * - 1D \u00B7 1D: Inner product \u2192 scalar\n * - 2D \u00B7 2D: Matrix multiplication \u2192 2D\n * - 2D \u00B7 1D: Matrix-vector product \u2192 1D\n * - 1D \u00B7 2D: Vector-matrix product \u2192 1D\n * - ND \u00B7 1D (N>2): Sum over last axis \u2192 (N-1)D\n * - 1D \u00B7 ND (N>2): Sum over first axis \u2192 (N-1)D\n * - ND \u00B7 MD (N,M\u22652): Tensor contraction \u2192 (N+M-2)D\n *\n * @param a - First array\n * @param b - Second array\n * @returns Result of dot product\n */\nexport function dot(a: NDArray, b: NDArray): NDArray | number | bigint {\n return a.dot(b);\n}\n\n/**\n * Sum of diagonal elements\n *\n * @param a - Input 2D array\n * @returns Sum of diagonal elements\n */\nexport function trace(a: NDArray): number | bigint {\n return a.trace();\n}\n\n/**\n * Extract a diagonal from a matrix or N-D array\n *\n * @param a - Input array (must be at least 2D)\n * @param offset - Offset of the diagonal from the main diagonal (default: 0)\n * @param axis1 - First axis (default: 0)\n * @param axis2 - Second axis (default: 1)\n * @returns Array containing the diagonal elements\n */\nexport function diagonal(\n a: NDArray,\n offset: number = 0,\n axis1: number = 0,\n axis2: number = 1\n): NDArray {\n const resultStorage = linalgOps.diagonal(a.storage, offset, axis1, axis2);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Kronecker product of two arrays\n *\n * @param a - First input array\n * @param b - Second input array\n * @returns Kronecker product of a and b\n */\nexport function kron(a: NDArray, b: NDArray): NDArray {\n const resultStorage = linalgOps.kron(a.storage, b.storage);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Permute array dimensions\n *\n * @param a - Input array\n * @param axes - Optional permutation of axes (defaults to reverse order)\n * @returns Transposed view\n */\nexport function transpose(a: NDArray, axes?: number[]): NDArray {\n return a.transpose(axes);\n}\n\n/**\n * Inner product of two arrays\n *\n * Contracts over last axes of both arrays.\n * Result shape: (*a.shape[:-1], *b.shape[:-1])\n *\n * @param a - First array\n * @param b - Second array\n * @returns Inner product result\n */\nexport function inner(a: NDArray, b: NDArray): NDArray | number | bigint {\n return a.inner(b);\n}\n\n/**\n * Outer product of two arrays\n *\n * Flattens inputs then computes result[i,j] = a[i] * b[j]\n *\n * @param a - First array\n * @param b - Second array\n * @returns 2D outer product matrix\n */\nexport function outer(a: NDArray, b: NDArray): NDArray {\n return a.outer(b);\n}\n\n/**\n * Tensor dot product along specified axes\n *\n * @param a - First array\n * @param b - Second array\n * @param axes - Axes to contract (integer or [a_axes, b_axes])\n * @returns Tensor dot product\n */\nexport function tensordot(\n a: NDArray,\n b: NDArray,\n axes: number | [number[], number[]] = 2\n): NDArray | number | bigint {\n return a.tensordot(b, axes);\n}\n\n// Trigonometric functions (standalone)\n\n/**\n * Element-wise sine\n * @param x - Input array (angles in radians)\n * @returns Array of sine values\n */\nexport function sin(x: NDArray): NDArray {\n return x.sin();\n}\n\n/**\n * Element-wise cosine\n * @param x - Input array (angles in radians)\n * @returns Array of cosine values\n */\nexport function cos(x: NDArray): NDArray {\n return x.cos();\n}\n\n/**\n * Element-wise tangent\n * @param x - Input array (angles in radians)\n * @returns Array of tangent values\n */\nexport function tan(x: NDArray): NDArray {\n return x.tan();\n}\n\n/**\n * Element-wise inverse sine\n * @param x - Input array (values in range [-1, 1])\n * @returns Array of angles in radians\n */\nexport function arcsin(x: NDArray): NDArray {\n return x.arcsin();\n}\n\n/**\n * Element-wise inverse cosine\n * @param x - Input array (values in range [-1, 1])\n * @returns Array of angles in radians\n */\nexport function arccos(x: NDArray): NDArray {\n return x.arccos();\n}\n\n/**\n * Element-wise inverse tangent\n * @param x - Input array\n * @returns Array of angles in radians\n */\nexport function arctan(x: NDArray): NDArray {\n return x.arctan();\n}\n\n/**\n * Element-wise arc tangent of x1/x2 choosing the quadrant correctly\n * @param x1 - y-coordinates\n * @param x2 - x-coordinates (array or scalar)\n * @returns Angles in radians between -\u03C0 and \u03C0\n */\nexport function arctan2(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.arctan2(x2);\n}\n\n/**\n * Given the \"legs\" of a right triangle, return its hypotenuse\n * Equivalent to sqrt(x1**2 + x2**2), element-wise\n * @param x1 - First leg\n * @param x2 - Second leg (array or scalar)\n * @returns Hypotenuse values\n */\nexport function hypot(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.hypot(x2);\n}\n\n/**\n * Convert angles from radians to degrees\n * @param x - Input array (angles in radians)\n * @returns Angles in degrees\n */\nexport function degrees(x: NDArray): NDArray {\n return x.degrees();\n}\n\n/**\n * Convert angles from degrees to radians\n * @param x - Input array (angles in degrees)\n * @returns Angles in radians\n */\nexport function radians(x: NDArray): NDArray {\n return x.radians();\n}\n\n/**\n * Convert angles from degrees to radians (alias for radians)\n * @param x - Input array (angles in degrees)\n * @returns Angles in radians\n */\nexport function deg2rad(x: NDArray): NDArray {\n return x.radians();\n}\n\n/**\n * Convert angles from radians to degrees (alias for degrees)\n * @param x - Input array (angles in radians)\n * @returns Angles in degrees\n */\nexport function rad2deg(x: NDArray): NDArray {\n return x.degrees();\n}\n\n// Hyperbolic functions (standalone)\n\n/**\n * Element-wise hyperbolic sine\n * @param x - Input array\n * @returns Array of sinh values\n */\nexport function sinh(x: NDArray): NDArray {\n return x.sinh();\n}\n\n/**\n * Element-wise hyperbolic cosine\n * @param x - Input array\n * @returns Array of cosh values\n */\nexport function cosh(x: NDArray): NDArray {\n return x.cosh();\n}\n\n/**\n * Element-wise hyperbolic tangent\n * @param x - Input array\n * @returns Array of tanh values\n */\nexport function tanh(x: NDArray): NDArray {\n return x.tanh();\n}\n\n/**\n * Element-wise inverse hyperbolic sine\n * @param x - Input array\n * @returns Array of arcsinh values\n */\nexport function arcsinh(x: NDArray): NDArray {\n return x.arcsinh();\n}\n\n/**\n * Element-wise inverse hyperbolic cosine\n * @param x - Input array (values >= 1)\n * @returns Array of arccosh values\n */\nexport function arccosh(x: NDArray): NDArray {\n return x.arccosh();\n}\n\n/**\n * Element-wise inverse hyperbolic tangent\n * @param x - Input array (values in range (-1, 1))\n * @returns Array of arctanh values\n */\nexport function arctanh(x: NDArray): NDArray {\n return x.arctanh();\n}\n\n// ========================================\n// Array Manipulation Functions\n// ========================================\n\n/**\n * Swap two axes of an array\n *\n * @param a - Input array\n * @param axis1 - First axis\n * @param axis2 - Second axis\n * @returns View with axes swapped\n */\nexport function swapaxes(a: NDArray, axis1: number, axis2: number): NDArray {\n return a.swapaxes(axis1, axis2);\n}\n\n/**\n * Move axes to new positions\n *\n * @param a - Input array\n * @param source - Original positions of axes to move\n * @param destination - New positions for axes\n * @returns View with axes moved\n */\nexport function moveaxis(\n a: NDArray,\n source: number | number[],\n destination: number | number[]\n): NDArray {\n return a.moveaxis(source, destination);\n}\n\n/**\n * Concatenate arrays along an existing axis\n *\n * @param arrays - Arrays to concatenate\n * @param axis - Axis along which to concatenate (default: 0)\n * @returns Concatenated array\n */\nexport function concatenate(arrays: NDArray[], axis: number = 0): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to concatenate');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.concatenate(storages, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays along a new axis\n *\n * @param arrays - Arrays to stack (must have same shape)\n * @param axis - Axis in the result array along which to stack (default: 0)\n * @returns Stacked array\n */\nexport function stack(arrays: NDArray[], axis: number = 0): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.stack(storages, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays vertically (row-wise)\n *\n * @param arrays - Arrays to stack\n * @returns Vertically stacked array\n */\nexport function vstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.vstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays horizontally (column-wise)\n *\n * @param arrays - Arrays to stack\n * @returns Horizontally stacked array\n */\nexport function hstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.hstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays depth-wise (along third axis)\n *\n * @param arrays - Arrays to stack\n * @returns Depth-stacked array\n */\nexport function dstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.dstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Split array into multiple sub-arrays\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of equal sections or indices where to split\n * @param axis - Axis along which to split (default: 0)\n * @returns List of sub-arrays\n */\nexport function split(\n a: NDArray,\n indicesOrSections: number | number[],\n axis: number = 0\n): NDArray[] {\n const storages = shapeOps.split(a.storage, indicesOrSections, axis);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array into multiple sub-arrays (allows unequal splits)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @param axis - Axis along which to split (default: 0)\n * @returns List of sub-arrays\n */\nexport function array_split(\n a: NDArray,\n indicesOrSections: number | number[],\n axis: number = 0\n): NDArray[] {\n const storages = shapeOps.arraySplit(a.storage, indicesOrSections, axis);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array vertically (row-wise)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function vsplit(a: NDArray, indicesOrSections: number | number[]): NDArray[] {\n const storages = shapeOps.vsplit(a.storage, indicesOrSections);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array horizontally (column-wise)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function hsplit(a: NDArray, indicesOrSections: number | number[]): NDArray[] {\n const storages = shapeOps.hsplit(a.storage, indicesOrSections);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Tile array by repeating along each axis\n *\n * @param a - Input array\n * @param reps - Number of repetitions along each axis\n * @returns Tiled array\n */\nexport function tile(a: NDArray, reps: number | number[]): NDArray {\n const resultStorage = shapeOps.tile(a.storage, reps);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Repeat elements of an array\n *\n * @param a - Input array\n * @param repeats - Number of repetitions for each element\n * @param axis - Axis along which to repeat (if undefined, flattens first)\n * @returns Array with repeated elements\n */\nexport function repeat(a: NDArray, repeats: number | number[], axis?: number): NDArray {\n return a.repeat(repeats, axis);\n}\n\n/**\n * Return a contiguous flattened array\n *\n * @param a - Input array\n * @returns Flattened 1-D array (view if possible)\n */\nexport function ravel(a: NDArray): NDArray {\n return a.ravel();\n}\n\n/**\n * Reshape array to new shape\n *\n * @param a - Input array\n * @param newShape - New shape\n * @returns Reshaped array (view if possible)\n */\nexport function reshape(a: NDArray, newShape: number[]): NDArray {\n return a.reshape(...newShape);\n}\n\n/**\n * Remove axes of length 1\n *\n * @param a - Input array\n * @param axis - Axis to squeeze (optional, squeezes all if not specified)\n * @returns Squeezed array (view)\n */\nexport function squeeze(a: NDArray, axis?: number): NDArray {\n return a.squeeze(axis);\n}\n\n/**\n * Expand the shape of an array by inserting a new axis\n *\n * @param a - Input array\n * @param axis - Position where new axis should be inserted\n * @returns Array with expanded shape (view)\n */\nexport function expand_dims(a: NDArray, axis: number): NDArray {\n return a.expand_dims(axis);\n}\n\n/**\n * Reverse the order of elements along the given axis\n *\n * @param m - Input array\n * @param axis - Axis or axes to flip (flips all if undefined)\n * @returns Flipped array\n */\nexport function flip(m: NDArray, axis?: number | number[]): NDArray {\n const resultStorage = shapeOps.flip(m.storage, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Flip array in the left/right direction (reverse along axis 1)\n *\n * @param m - Input array (must be at least 2-D)\n * @returns Flipped array\n */\nexport function fliplr(m: NDArray): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n return flip(m, 1);\n}\n\n/**\n * Flip array in the up/down direction (reverse along axis 0)\n *\n * @param m - Input array (must be at least 2-D)\n * @returns Flipped array\n */\nexport function flipud(m: NDArray): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n return flip(m, 0);\n}\n\n/**\n * Rotate array by 90 degrees\n *\n * @param m - Input array\n * @param k - Number of times to rotate (default 1)\n * @param axes - The axes to rotate in (default [0, 1])\n * @returns Rotated array\n */\nexport function rot90(m: NDArray, k: number = 1, axes: [number, number] = [0, 1]): NDArray {\n const resultStorage = shapeOps.rot90(m.storage, k, axes);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Roll array elements along a given axis\n *\n * @param a - Input array\n * @param shift - Number of positions to shift\n * @param axis - Axis along which to roll (rolls flattened array if undefined)\n * @returns Rolled array\n */\nexport function roll(a: NDArray, shift: number | number[], axis?: number | number[]): NDArray {\n const resultStorage = shapeOps.roll(a.storage, shift, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Roll the specified axis backwards until it lies in a given position\n *\n * @param a - Input array\n * @param axis - The axis to roll backwards\n * @param start - Position to roll to (default 0)\n * @returns Array with rolled axis (view)\n */\nexport function rollaxis(a: NDArray, axis: number, start: number = 0): NDArray {\n const resultStorage = shapeOps.rollaxis(a.storage, axis, start);\n return NDArray._fromStorage(resultStorage, a.base ?? a);\n}\n\n/**\n * Convert inputs to arrays with at least 1 dimension\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 1 dimension\n */\nexport function atleast_1d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast1d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Convert inputs to arrays with at least 2 dimensions\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 2 dimensions\n */\nexport function atleast_2d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast2d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Convert inputs to arrays with at least 3 dimensions\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 3 dimensions\n */\nexport function atleast_3d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast3d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Split array along third axis (depth)\n *\n * @param ary - Input array (must be at least 3-D)\n * @param indices_or_sections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function dsplit(ary: NDArray, indices_or_sections: number | number[]): NDArray[] {\n const storages = shapeOps.dsplit(ary.storage, indices_or_sections);\n return storages.map((s) => NDArray._fromStorage(s, ary.base ?? ary));\n}\n\n/**\n * Stack 1-D arrays as columns into a 2-D array\n *\n * @param arrays - 1-D arrays to stack\n * @returns 2-D array with inputs as columns\n */\nexport function column_stack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.columnStack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays in sequence vertically (alias for vstack)\n *\n * @param arrays - Arrays to stack\n * @returns Vertically stacked array\n */\nexport function row_stack(arrays: NDArray[]): NDArray {\n return vstack(arrays);\n}\n\n/**\n * Return a new array with the given shape (repeating data if needed)\n *\n * @param a - Input array\n * @param new_shape - New shape\n * @returns Resized array\n */\nexport function resize(a: NDArray, new_shape: number[]): NDArray {\n const resultStorage = shapeOps.resize(a.storage, new_shape);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Append values to the end of an array\n *\n * @param arr - Input array\n * @param values - Values to append\n * @param axis - Axis along which to append (flattens if undefined)\n * @returns Array with values appended\n */\nexport function append(\n arr: NDArray,\n values: NDArray | ArrayLike<number | bigint> | number,\n axis?: number\n): NDArray {\n // Convert values to NDArray if needed\n const valArray =\n values instanceof NDArray\n ? values\n : array(values as ArrayLike<number | bigint> | number, arr.dtype as DType);\n\n if (axis === undefined) {\n // Flatten both and concatenate\n const flatArr = arr.flatten();\n const flatValues = valArray.flatten();\n return concatenate([flatArr, flatValues]);\n }\n\n // Concatenate along specified axis\n return concatenate([arr, valArray], axis);\n}\n\n/**\n * Return a new array with sub-arrays along an axis deleted\n *\n * @param arr - Input array\n * @param obj - Indices to delete\n * @param axis - Axis along which to delete (flattens if undefined)\n * @returns Array with elements deleted\n */\n\nexport function delete_(arr: NDArray, obj: number | number[], axis?: number): NDArray {\n const dtype = arr.dtype as DType;\n\n if (axis === undefined) {\n // Delete from flattened array\n const flat = arr.flatten();\n const indices = Array.isArray(obj) ? obj : [obj];\n const normalizedIndices = indices.map((i) => (i < 0 ? flat.size + i : i));\n const keepIndices: number[] = [];\n\n for (let i = 0; i < flat.size; i++) {\n if (!normalizedIndices.includes(i)) {\n keepIndices.push(i);\n }\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n const data = new Constructor!(keepIndices.length);\n\n for (let i = 0; i < keepIndices.length; i++) {\n const val = flat.get([keepIndices[i]!]);\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof val === 'bigint' ? val : BigInt(val as number);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = val as number;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [keepIndices.length], dtype);\n return new NDArray(storage);\n }\n\n // Delete along specified axis\n const shape = arr.shape;\n const ndim = shape.length;\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const indices = Array.isArray(obj) ? obj : [obj];\n const normalizedIndices = new Set(indices.map((i) => (i < 0 ? axisSize + i : i)));\n\n // Build slices to keep\n const keepRanges: [number, number][] = [];\n let start = 0;\n\n for (let i = 0; i <= axisSize; i++) {\n if (normalizedIndices.has(i) || i === axisSize) {\n if (i > start) {\n keepRanges.push([start, i]);\n }\n start = i + 1;\n }\n }\n\n if (keepRanges.length === 0) {\n // Delete all elements along this axis\n const newShape = [...shape];\n newShape[normalizedAxis] = 0;\n return zeros(newShape, dtype);\n }\n\n // Split and concatenate the kept parts\n const parts: NDArray[] = [];\n for (const [rangeStart, rangeEnd] of keepRanges) {\n // Create a slice for this range\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `${rangeStart}:${rangeEnd}`;\n parts.push(arr.slice(...slices));\n }\n\n return concatenate(parts, normalizedAxis);\n}\n\n/**\n * Insert values along the given axis before the given indices\n *\n * @param arr - Input array\n * @param obj - Index before which to insert\n * @param values - Values to insert\n * @param axis - Axis along which to insert (flattens if undefined)\n * @returns Array with values inserted\n */\nexport function insert(\n arr: NDArray,\n obj: number,\n values: NDArray | ArrayLike<number | bigint> | number,\n axis?: number\n): NDArray {\n // Convert values to NDArray if needed\n const valArray =\n values instanceof NDArray\n ? values\n : array(values as ArrayLike<number | bigint> | number, arr.dtype as DType);\n\n if (axis === undefined) {\n // Insert into flattened array\n const flat = arr.flatten();\n const flatValues = valArray.flatten();\n const idx = obj < 0 ? flat.size + obj : obj;\n\n if (idx < 0 || idx > flat.size) {\n throw new Error(`index ${obj} is out of bounds for array of size ${flat.size}`);\n }\n\n const before = idx > 0 ? flat.slice(`0:${idx}`) : null;\n const after = idx < flat.size ? flat.slice(`${idx}:`) : null;\n\n const parts: NDArray[] = [];\n if (before) parts.push(before);\n parts.push(flatValues);\n if (after) parts.push(after);\n\n return concatenate(parts);\n }\n\n // Insert along specified axis\n const shape = arr.shape;\n const ndim = shape.length;\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const idx = obj < 0 ? axisSize + obj : obj;\n\n if (idx < 0 || idx > axisSize) {\n throw new Error(`index ${obj} is out of bounds for axis ${axis} with size ${axisSize}`);\n }\n\n const parts: NDArray[] = [];\n\n if (idx > 0) {\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `0:${idx}`;\n parts.push(arr.slice(...slices));\n }\n\n parts.push(valArray);\n\n if (idx < axisSize) {\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `${idx}:`;\n parts.push(arr.slice(...slices));\n }\n\n return concatenate(parts, normalizedAxis);\n}\n\n/**\n * Pad an array\n *\n * @param array - Input array\n * @param pad_width - Number of values padded to edges of each axis\n * @param mode - Padding mode ('constant', 'edge', 'reflect', 'symmetric', 'wrap')\n * @param constant_values - Value for constant padding (default 0)\n * @returns Padded array\n */\nexport function pad(\n arr: NDArray,\n pad_width: number | [number, number] | Array<[number, number]>,\n mode: 'constant' | 'edge' | 'reflect' | 'symmetric' | 'wrap' = 'constant',\n constant_values: number = 0\n): NDArray {\n const shape = arr.shape;\n const ndim = shape.length;\n const dtype = arr.dtype as DType;\n\n // Normalize pad_width to [[before, after], ...] for each axis\n let padWidths: Array<[number, number]>;\n if (typeof pad_width === 'number') {\n padWidths = shape.map(() => [pad_width, pad_width] as [number, number]);\n } else if (Array.isArray(pad_width) && typeof pad_width[0] === 'number') {\n // Single [before, after] pair for all axes\n padWidths = shape.map(() => pad_width as [number, number]);\n } else {\n padWidths = pad_width as Array<[number, number]>;\n }\n\n if (padWidths.length !== ndim) {\n throw new Error(`pad_width must have ${ndim} elements`);\n }\n\n // Calculate new shape\n const newShape = shape.map((s, i) => s + padWidths[i]![0] + padWidths[i]![1]);\n const newSize = newShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n const outputData = new Constructor!(newSize);\n const isBigInt = isBigIntDType(dtype);\n\n // Initialize with constant value for constant mode\n if (mode === 'constant') {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array).fill(BigInt(constant_values));\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(constant_values);\n }\n }\n\n // Copy original data to center\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < newSize; i++) {\n // Check if this position is in the original data region\n let inOriginal = true;\n const sourceIndices: number[] = [];\n\n for (let d = 0; d < ndim; d++) {\n const [padBefore] = padWidths[d]!;\n const srcIdx = outputIndices[d]! - padBefore;\n if (srcIdx < 0 || srcIdx >= shape[d]!) {\n inOriginal = false;\n break;\n }\n sourceIndices.push(srcIdx);\n }\n\n let value: number | bigint;\n\n if (inOriginal) {\n // Get from original array\n value = arr.get(sourceIndices) as number | bigint;\n } else if (mode === 'constant') {\n // Already filled with constant\n // Increment indices and continue\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < newShape[d]!) break;\n outputIndices[d] = 0;\n }\n continue;\n } else {\n // Calculate source index based on mode\n const mappedIndices: number[] = [];\n for (let d = 0; d < ndim; d++) {\n const [padBefore] = padWidths[d]!;\n let srcIdx = outputIndices[d]! - padBefore;\n const axisSize = shape[d]!;\n\n if (srcIdx < 0) {\n if (mode === 'edge') {\n srcIdx = 0;\n } else if (mode === 'reflect') {\n srcIdx = -srcIdx;\n if (srcIdx >= axisSize) srcIdx = axisSize - 1;\n } else if (mode === 'symmetric') {\n srcIdx = -srcIdx - 1;\n if (srcIdx >= axisSize) srcIdx = axisSize - 1;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'wrap') {\n srcIdx = ((srcIdx % axisSize) + axisSize) % axisSize;\n }\n } else if (srcIdx >= axisSize) {\n if (mode === 'edge') {\n srcIdx = axisSize - 1;\n } else if (mode === 'reflect') {\n srcIdx = 2 * axisSize - srcIdx - 2;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'symmetric') {\n srcIdx = 2 * axisSize - srcIdx - 1;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'wrap') {\n srcIdx = srcIdx % axisSize;\n }\n }\n\n mappedIndices.push(Math.max(0, Math.min(axisSize - 1, srcIdx)));\n }\n value = arr.get(mappedIndices) as number | bigint;\n }\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] =\n typeof value === 'bigint' ? value : BigInt(Number(value));\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(value);\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < newShape[d]!) break;\n outputIndices[d] = 0;\n }\n }\n\n const storage = ArrayStorage.fromData(outputData, newShape, dtype);\n return new NDArray(storage);\n}\n\n// ========================================\n// Advanced Functions\n// ========================================\n\n/**\n * Broadcast an array to a given shape\n *\n * @param a - Input array\n * @param shape - Target shape\n * @returns View broadcast to target shape\n */\nexport function broadcast_to(a: NDArray, shape: number[]): NDArray {\n const resultStorage = advancedOps.broadcast_to(a.storage, shape);\n return NDArray._fromStorage(resultStorage, a.base ?? a);\n}\n\n/**\n * Broadcast arrays to a common shape\n *\n * @param arrays - Arrays to broadcast\n * @returns Arrays broadcast to common shape\n */\nexport function broadcast_arrays(...arrays: NDArray[]): NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = advancedOps.broadcast_arrays(storages);\n return resultStorages.map((s, i) => NDArray._fromStorage(s, arrays[i]!.base ?? arrays[i]!));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes\n *\n * Returns the resulting shape if all shapes are broadcast-compatible.\n * Throws an error if shapes are not broadcast-compatible.\n *\n * @param shapes - Variable number of shapes to broadcast\n * @returns The broadcast output shape\n * @throws Error if shapes are not broadcast-compatible\n */\nexport function broadcast_shapes(...shapes: number[][]): number[] {\n return advancedOps.broadcast_shapes(...shapes);\n}\n\n/**\n * Take elements from an array along an axis\n *\n * @param a - Input array\n * @param indices - Indices of elements to take\n * @param axis - Axis along which to take (if undefined, flattens first)\n * @returns Array with selected elements\n */\nexport function take(a: NDArray, indices: number[], axis?: number): NDArray {\n return a.take(indices, axis);\n}\n\n/**\n * Put values at specified indices (modifies array in-place)\n *\n * @param a - Target array\n * @param indices - Indices at which to place values\n * @param values - Values to put\n */\nexport function put(a: NDArray, indices: number[], values: NDArray | number | bigint): void {\n a.put(indices, values);\n}\n\n/**\n * Construct array from index array and choices\n *\n * @param a - Index array (integer indices into choices)\n * @param choices - Arrays to choose from\n * @returns Array constructed from choices\n */\nexport function choose(a: NDArray, choices: NDArray[]): NDArray {\n const choiceStorages = choices.map((c) => c.storage);\n const resultStorage = advancedOps.choose(a.storage, choiceStorages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Check if two arrays are element-wise equal\n *\n * @param a - First array\n * @param b - Second array\n * @param equal_nan - Whether to consider NaN equal to NaN (default: false)\n * @returns True if arrays are equal element-wise\n */\nexport function array_equal(a: NDArray, b: NDArray, equal_nan: boolean = false): boolean {\n return advancedOps.array_equal(a.storage, b.storage, equal_nan);\n}\n\n/**\n * Returns True if two arrays are element-wise equal within a tolerance.\n * Unlike array_equal, this function broadcasts the arrays before comparison.\n *\n * @param a1 - First input array\n * @param a2 - Second input array\n * @returns True if arrays are equivalent (after broadcasting)\n */\nexport function array_equiv(a1: NDArray, a2: NDArray): boolean {\n return comparisonOps.arrayEquiv(a1.storage, a2.storage);\n}\n\n// ============================================================================\n// Top-level Reduction Functions\n// ============================================================================\n\n/**\n * Return the cumulative sum of the elements along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, flattened array is used.\n * @returns Array with cumulative sums\n */\nexport function cumsum(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumsum(a.storage, axis));\n}\n\n/**\n * Return the cumulative product of the elements along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, flattened array is used.\n * @returns Array with cumulative products\n */\nexport function cumprod(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumprod(a.storage, axis));\n}\n\n/**\n * Peak to peak (maximum - minimum) value along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Peak to peak value(s)\n */\nexport function ptp(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.ptp(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the median along the specified axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median value(s)\n */\nexport function median(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.median(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the q-th percentile of the data along the specified axis.\n * @param a - Input array\n * @param q - Percentile (0-100)\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Percentile value(s)\n */\nexport function percentile(\n a: NDArray,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.percentile(a.storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the q-th quantile of the data along the specified axis.\n * @param a - Input array\n * @param q - Quantile (0-1)\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Quantile value(s)\n */\nexport function quantile(\n a: NDArray,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.quantile(a.storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the weighted average along the specified axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param weights - Array of weights (must be same shape as array along specified axis)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Weighted average value(s)\n */\nexport function average(\n a: NDArray,\n axis?: number,\n weights?: NDArray,\n keepdims: boolean = false\n): NDArray | number {\n const weightsStorage = weights ? weights.storage : undefined;\n const result = reductionOps.average(a.storage, axis, weightsStorage, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n// ============================================================================\n// NaN-aware Reduction Functions\n// ============================================================================\n\n/**\n * Return the sum of array elements over a given axis, treating NaNs as zero.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum value(s)\n */\nexport function nansum(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nansum(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return the product of array elements over a given axis, treating NaNs as one.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product value(s)\n */\nexport function nanprod(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanprod(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the arithmetic mean along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean value(s)\n */\nexport function nanmean(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmean(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the variance along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param ddof - Delta degrees of freedom (default 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance value(s)\n */\nexport function nanvar(\n a: NDArray,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.nanvar(a.storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the standard deviation along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param ddof - Delta degrees of freedom (default 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation value(s)\n */\nexport function nanstd(\n a: NDArray,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.nanstd(a.storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return minimum of an array, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum value(s)\n */\nexport function nanmin(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmin(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return maximum of an array, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum value(s)\n */\nexport function nanmax(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmax(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return indices of the minimum value, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Index/indices of minimum value(s)\n */\nexport function nanargmin(a: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.nanargmin(a.storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return indices of the maximum value, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Index/indices of maximum value(s)\n */\nexport function nanargmax(a: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.nanargmax(a.storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return cumulative sum of elements, treating NaNs as zero.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Array with cumulative sums\n */\nexport function nancumsum(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumsum(a.storage, axis));\n}\n\n/**\n * Return cumulative product of elements, treating NaNs as one.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Array with cumulative products\n */\nexport function nancumprod(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumprod(a.storage, axis));\n}\n\n/**\n * Compute the median, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median value(s)\n */\nexport function nanmedian(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmedian(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n// ========================================\n// Arithmetic Functions (Additional)\n// ========================================\n\n/**\n * Element-wise cube root\n *\n * @param x - Input array\n * @returns Array with cube root of each element\n */\nexport function cbrt(x: NDArray): NDArray {\n return x.cbrt();\n}\n\n/**\n * Element-wise absolute value (always returns float)\n *\n * @param x - Input array\n * @returns Array with absolute values as float\n */\nexport function fabs(x: NDArray): NDArray {\n return x.fabs();\n}\n\n/**\n * Returns both quotient and remainder (floor divide and modulo)\n *\n * @param x - Dividend array\n * @param y - Divisor (array or scalar)\n * @returns Tuple of [quotient, remainder] arrays\n */\nexport function divmod(x: NDArray, y: NDArray | number): [NDArray, NDArray] {\n return x.divmod(y);\n}\n\n/**\n * Element-wise square (x**2)\n *\n * @param x - Input array\n * @returns Array with squared values\n */\nexport function square(x: NDArray): NDArray {\n return x.square();\n}\n\n/**\n * Element-wise remainder (same as mod)\n *\n * @param x - Dividend array\n * @param y - Divisor (array or scalar)\n * @returns Array with remainder values\n */\nexport function remainder(x: NDArray, y: NDArray | number): NDArray {\n return x.remainder(y);\n}\n\n/**\n * Heaviside step function\n *\n * @param x1 - Input array\n * @param x2 - Value to use when x1 is 0\n * @returns Array with heaviside values (0 if x1 < 0, x2 if x1 == 0, 1 if x1 > 0)\n */\nexport function heaviside(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.heaviside(x2);\n}\n\n// ========================================\n// Bitwise Functions\n// ========================================\n\n/**\n * Bitwise AND element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise AND\n */\nexport function bitwise_and(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_and(x2);\n}\n\n/**\n * Bitwise OR element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise OR\n */\nexport function bitwise_or(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_or(x2);\n}\n\n/**\n * Bitwise XOR element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise XOR\n */\nexport function bitwise_xor(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_xor(x2);\n}\n\n/**\n * Bitwise NOT (inversion) element-wise\n *\n * @param x - Input array (must be integer type)\n * @returns Result of bitwise NOT\n */\nexport function bitwise_not(x: NDArray): NDArray {\n return x.bitwise_not();\n}\n\n/**\n * Invert (bitwise NOT) element-wise\n * Alias for bitwise_not\n *\n * @param x - Input array (must be integer type)\n * @returns Result of bitwise inversion\n */\nexport function invert(x: NDArray): NDArray {\n return x.invert();\n}\n\n/**\n * Left shift elements by positions\n *\n * @param x1 - Input array (must be integer type)\n * @param x2 - Shift amount (array or scalar)\n * @returns Result of left shift\n */\nexport function left_shift(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.left_shift(x2);\n}\n\n/**\n * Right shift elements by positions\n *\n * @param x1 - Input array (must be integer type)\n * @param x2 - Shift amount (array or scalar)\n * @returns Result of right shift\n */\nexport function right_shift(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.right_shift(x2);\n}\n\n/**\n * Pack binary values into uint8 array\n *\n * Packs the elements of a binary-valued array into bits in a uint8 array.\n *\n * @param a - Input array (values are interpreted as binary: 0 or non-zero)\n * @param axis - The dimension over which bit-packing is done (default: -1)\n * @param bitorder - Order of bits: 'big' or 'little' (default: 'big')\n * @returns Packed uint8 array\n */\nexport function packbits(\n a: NDArray,\n axis: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): NDArray {\n const resultStorage = bitwiseOps.packbits(a.storage, axis, bitorder);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Unpack uint8 array into binary values\n *\n * Unpacks elements of a uint8 array into a binary-valued output array.\n *\n * @param a - Input uint8 array\n * @param axis - The dimension over which bit-unpacking is done (default: -1)\n * @param count - Number of elements to unpack, or -1 for all (default: -1)\n * @param bitorder - Order of bits: 'big' or 'little' (default: 'big')\n * @returns Unpacked uint8 array of 0s and 1s\n */\nexport function unpackbits(\n a: NDArray,\n axis: number = -1,\n count: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): NDArray {\n const resultStorage = bitwiseOps.unpackbits(a.storage, axis, count, bitorder);\n return NDArray._fromStorage(resultStorage);\n}\n\n// ========================================\n// Linear Algebra Functions (Additional)\n// ========================================\n\n/**\n * Einstein summation convention\n *\n * Performs tensor contractions and reductions using Einstein notation.\n *\n * @param subscripts - Einstein summation subscripts (e.g., 'ij,jk->ik')\n * @param operands - Input arrays\n * @returns Result of the Einstein summation\n *\n * @example\n * // Matrix multiplication\n * einsum('ij,jk->ik', a, b)\n *\n * @example\n * // Inner product\n * einsum('i,i->', a, b)\n *\n * @example\n * // Trace\n * einsum('ii->', a)\n */\nexport function einsum(subscripts: string, ...operands: NDArray[]): NDArray | number | bigint {\n const storages = operands.map((op) => op.storage);\n const result = linalgOps.einsum(subscripts, ...storages);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n}\n\n// ============================================================================\n// Indexing Functions\n// ============================================================================\n\n/**\n * Take values from the input array by matching 1d index and data slices along axis.\n *\n * @param arr - Input array\n * @param indices - Index array with same ndim as arr\n * @param axis - The axis along which to select values\n * @returns Array of values taken along the axis\n */\nexport function take_along_axis(arr: NDArray, indices: NDArray, axis: number): NDArray {\n return NDArray._fromStorage(advancedOps.take_along_axis(arr.storage, indices.storage, axis));\n}\n\n/**\n * Put values into the destination array using 1d index and data slices along axis.\n *\n * @param arr - Destination array (modified in-place)\n * @param indices - Index array with same ndim as arr\n * @param values - Values to put\n * @param axis - The axis along which to put values\n */\nexport function put_along_axis(\n arr: NDArray,\n indices: NDArray,\n values: NDArray,\n axis: number\n): void {\n advancedOps.put_along_axis(arr.storage, indices.storage, values.storage, axis);\n}\n\n/**\n * Change elements of array based on conditional mask.\n *\n * @param a - Array to modify (in-place)\n * @param mask - Boolean mask array\n * @param values - Values to put where mask is True\n */\nexport function putmask(a: NDArray, mask: NDArray, values: NDArray | number | bigint): void {\n const valuesArg = values instanceof NDArray ? values.storage : values;\n advancedOps.putmask(a.storage, mask.storage, valuesArg);\n}\n\n/**\n * Return selected slices of array along given axis.\n *\n * @param condition - Boolean array for selecting\n * @param a - Array from which to select\n * @param axis - Axis along which to select (if undefined, works on flattened array)\n * @returns Compressed array\n */\nexport function compress(condition: NDArray, a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(advancedOps.compress(condition.storage, a.storage, axis));\n}\n\n/**\n * Return an array drawn from elements in choicelist, depending on conditions.\n *\n * @param condlist - List of boolean arrays (conditions)\n * @param choicelist - List of arrays to choose from\n * @param defaultVal - Default value when no condition is met (default 0)\n * @returns Array with selected values\n */\nexport function select(\n condlist: NDArray[],\n choicelist: NDArray[],\n defaultVal: number | bigint = 0\n): NDArray {\n const condStorages = condlist.map((c) => c.storage);\n const choiceStorages = choicelist.map((c) => c.storage);\n return NDArray._fromStorage(advancedOps.select(condStorages, choiceStorages, defaultVal));\n}\n\n/**\n * Change elements of an array based on conditional and input values.\n *\n * @param arr - Array to modify (in-place)\n * @param mask - Boolean mask array\n * @param vals - Values to place where mask is True (cycles if shorter)\n */\nexport function place(arr: NDArray, mask: NDArray, vals: NDArray): void {\n advancedOps.place(arr.storage, mask.storage, vals.storage);\n}\n\n/**\n * Return the indices to access the main diagonal of an array.\n *\n * @param n - Size of arrays for which indices are returned\n * @param ndim - Number of dimensions (default 2)\n * @returns Tuple of index arrays\n */\nexport function diag_indices(n: number, ndim: number = 2): NDArray[] {\n const storages = advancedOps.diag_indices(n, ndim);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices to access the main diagonal of an n-dimensional array.\n *\n * @param arr - Input array (must have all equal dimensions)\n * @returns Tuple of index arrays\n */\nexport function diag_indices_from(arr: NDArray): NDArray[] {\n const storages = advancedOps.diag_indices_from(arr.storage);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the lower-triangle of an (n, m) array.\n *\n * @param n - Number of rows\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @param m - Number of columns (default n)\n * @returns Tuple of row and column index arrays\n */\nexport function tril_indices(n: number, k: number = 0, m?: number): NDArray[] {\n const storages = advancedOps.tril_indices(n, k, m);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the lower-triangle of arr.\n *\n * @param arr - Input 2-D array\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @returns Tuple of row and column index arrays\n */\nexport function tril_indices_from(arr: NDArray, k: number = 0): NDArray[] {\n const storages = advancedOps.tril_indices_from(arr.storage, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the upper-triangle of an (n, m) array.\n *\n * @param n - Number of rows\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @param m - Number of columns (default n)\n * @returns Tuple of row and column index arrays\n */\nexport function triu_indices(n: number, k: number = 0, m?: number): NDArray[] {\n const storages = advancedOps.triu_indices(n, k, m);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the upper-triangle of arr.\n *\n * @param arr - Input 2-D array\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @returns Tuple of row and column index arrays\n */\nexport function triu_indices_from(arr: NDArray, k: number = 0): NDArray[] {\n const storages = advancedOps.triu_indices_from(arr.storage, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices to access (n, n) arrays, given a masking function.\n *\n * @param n - The returned indices will be valid to access arrays of shape (n, n)\n * @param mask_func - A function that generates an (n, n) boolean mask\n * @param k - Optional diagonal offset passed to mask_func\n * @returns Tuple of row and column index arrays\n */\nexport function mask_indices(\n n: number,\n mask_func: (n: number, k: number) => NDArray,\n k: number = 0\n): NDArray[] {\n // Wrap the function to work with storage\n const storageMaskFunc = (n: number, k: number) => mask_func(n, k).storage;\n const storages = advancedOps.mask_indices(n, storageMaskFunc, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return an array representing the indices of a grid.\n *\n * @param dimensions - The shape of the grid\n * @param dtype - Data type of result (default 'int32')\n * @returns Array of shape (len(dimensions), *dimensions)\n */\nexport function indices(\n dimensions: number[],\n dtype: 'int32' | 'int64' | 'float64' = 'int32'\n): NDArray {\n return NDArray._fromStorage(advancedOps.indices(dimensions, dtype));\n}\n\n/**\n * Construct an open mesh from multiple sequences.\n *\n * This function returns a list of arrays with shapes suitable for broadcasting.\n *\n * @param args - 1-D sequences\n * @returns Tuple of arrays for open mesh\n */\nexport function ix_(...args: NDArray[]): NDArray[] {\n const storages = advancedOps.ix_(...args.map((a) => a.storage));\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Convert a tuple of index arrays into an array of flat indices.\n *\n * @param multi_index - Tuple of index arrays\n * @param dims - Shape of array into which indices apply\n * @param mode - How to handle out-of-bounds indices ('raise', 'wrap', 'clip')\n * @returns Flattened indices\n */\nexport function ravel_multi_index(\n multi_index: NDArray[],\n dims: number[],\n mode: 'raise' | 'wrap' | 'clip' = 'raise'\n): NDArray {\n const storages = multi_index.map((a) => a.storage);\n return NDArray._fromStorage(advancedOps.ravel_multi_index(storages, dims, mode));\n}\n\n/**\n * Convert a flat index or array of flat indices into a tuple of coordinate arrays.\n *\n * @param indices - Array of indices or single index\n * @param shape - Shape of the array to index into\n * @param order - Row-major ('C') or column-major ('F') order\n * @returns Tuple of coordinate arrays\n */\nexport function unravel_index(\n indices: NDArray | number,\n shape: number[],\n order: 'C' | 'F' = 'C'\n): NDArray[] {\n const indicesArg = indices instanceof NDArray ? indices.storage : indices;\n const storages = advancedOps.unravel_index(indicesArg, shape, order);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n// ========================================\n// Sorting and Searching Functions\n// ========================================\n\n/**\n * Return a sorted copy of an array\n * @param a - Input array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\nexport function sort(a: NDArray, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.sort(a.storage, axis));\n}\n\n/**\n * Returns the indices that would sort an array\n * @param a - Input array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the input array\n */\nexport function argsort(a: NDArray, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argsort(a.storage, axis));\n}\n\n/**\n * Perform an indirect stable sort using a sequence of keys\n * @param keys - Array of NDArrays, the last key is the primary sort key\n * @returns Array of indices that would sort the keys\n */\nexport function lexsort(keys: NDArray[]): NDArray {\n const storages = keys.map((k) => k.storage);\n return NDArray._fromStorage(sortingOps.lexsort(storages));\n}\n\n/**\n * Partially sort an array\n * @param a - Input array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\nexport function partition(a: NDArray, kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.partition(a.storage, kth, axis));\n}\n\n/**\n * Returns indices that would partition an array\n * @param a - Input array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\nexport function argpartition(a: NDArray, kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argpartition(a.storage, kth, axis));\n}\n\n/**\n * Sort a complex array using the real part first, then the imaginary part\n * For real arrays, returns a sorted 1D array\n * @param a - Input array\n * @returns Sorted 1D array\n */\nexport function sort_complex(a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.sort_complex(a.storage));\n}\n\n/**\n * Return the indices of the elements that are non-zero\n * @param a - Input array\n * @returns Tuple of arrays, one for each dimension\n */\nexport function nonzero(a: NDArray): NDArray[] {\n const storages = sortingOps.nonzero(a.storage);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return indices of non-zero elements in flattened array\n * @param a - Input array\n * @returns Array of indices\n */\nexport function flatnonzero(a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.flatnonzero(a.storage));\n}\n\n/**\n * Return elements from x or y depending on condition\n * If only condition is given, returns indices where condition is true (like nonzero)\n * @param condition - Boolean array or condition\n * @param x - Values where condition is true (optional)\n * @param y - Values where condition is false (optional)\n * @returns Array with elements chosen from x or y, or indices if only condition given\n */\nexport function where(condition: NDArray, x?: NDArray, y?: NDArray): NDArray | NDArray[] {\n const result = sortingOps.where(condition.storage, x?.storage, y?.storage);\n if (Array.isArray(result)) {\n return result.map((s) => NDArray._fromStorage(s));\n }\n return NDArray._fromStorage(result);\n}\n\n/**\n * Find indices where elements should be inserted to maintain order\n * @param a - Input array (must be sorted in ascending order)\n * @param v - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\nexport function searchsorted(a: NDArray, v: NDArray, side: 'left' | 'right' = 'left'): NDArray {\n return NDArray._fromStorage(sortingOps.searchsorted(a.storage, v.storage, side));\n}\n\n/**\n * Return the elements of an array that satisfy some condition\n * @param condition - Boolean array\n * @param a - Input array\n * @returns 1D array of elements where condition is true\n */\nexport function extract(condition: NDArray, a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.extract(condition.storage, a.storage));\n}\n\n/**\n * Count number of non-zero values in the array\n * @param a - Input array\n * @param axis - Axis along which to count (optional)\n * @returns Count of non-zero values\n */\nexport function count_nonzero(a: NDArray, axis?: number): NDArray | number {\n const result = sortingOps.count_nonzero(a.storage, axis);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n}\n", "/**\n * NPY file format constants and type definitions\n *\n * NPY is NumPy's native binary format for storing arrays.\n * Spec: https://numpy.org/doc/stable/reference/generated/numpy.lib.format.html\n */\n\nimport type { DType } from '../../core/dtype';\n\n/**\n * NPY magic number: \\x93NUMPY (6 bytes)\n */\nexport const NPY_MAGIC = new Uint8Array([0x93, 0x4e, 0x55, 0x4d, 0x50, 0x59]);\n\n/**\n * Supported NPY format versions\n * - v1.0: 2-byte header length (max 65535 bytes)\n * - v2.0: 4-byte header length (max 4GB)\n * - v3.0: allows UTF-8 in description (same as v2 otherwise)\n *\n * We read v1, v2, and v3; we write v2 only\n */\nexport interface NpyVersion {\n major: number;\n minor: number;\n}\n\n/**\n * NPY header information\n */\nexport interface NpyHeader {\n /** Data type descriptor (e.g., '<f8', '>i4') */\n descr: string;\n /** Whether array is Fortran-contiguous (column-major) */\n fortran_order: boolean;\n /** Array shape */\n shape: number[];\n}\n\n/**\n * Parsed NPY metadata including version\n */\nexport interface NpyMetadata {\n version: NpyVersion;\n header: NpyHeader;\n /** Byte offset where data starts */\n dataOffset: number;\n}\n\n/**\n * Result of parsing an NPY header descriptor to our DType\n */\nexport interface DTypeParseResult {\n dtype: DType;\n /** Whether the data needs byte swapping (big-endian on little-endian or vice versa) */\n needsByteSwap: boolean;\n /** Element size in bytes */\n itemsize: number;\n}\n\n/**\n * All dtypes we support\n */\nexport const SUPPORTED_DTYPES: DType[] = [\n 'float64',\n 'float32',\n 'int64',\n 'int32',\n 'int16',\n 'int8',\n 'uint64',\n 'uint32',\n 'uint16',\n 'uint8',\n 'bool',\n];\n\n/**\n * Detect system endianness\n */\nexport function isSystemLittleEndian(): boolean {\n const buffer = new ArrayBuffer(2);\n new DataView(buffer).setInt16(0, 256, true);\n return new Int16Array(buffer)[0] === 256;\n}\n\n/**\n * NPY descriptor to DType mapping\n *\n * NumPy descriptors follow the format: <endian><type><size>\n * - Endian: '<' little, '>' big, '=' native, '|' not applicable (1-byte types)\n * - Type: 'f' float, 'i' signed int, 'u' unsigned int, 'b' bool, 'c' complex, etc.\n * - Size: byte size (1, 2, 4, 8)\n */\nconst DESCR_TO_DTYPE: Record<string, DType> = {\n // Float types\n f8: 'float64',\n f4: 'float32',\n // Signed integer types\n i8: 'int64',\n i4: 'int32',\n i2: 'int16',\n i1: 'int8',\n // Unsigned integer types\n u8: 'uint64',\n u4: 'uint32',\n u2: 'uint16',\n u1: 'uint8',\n // Boolean\n b1: 'bool',\n};\n\n/**\n * DType to NPY descriptor mapping (for serialization)\n * We always write little-endian\n */\nexport const DTYPE_TO_DESCR: Record<DType, string> = {\n float64: '<f8',\n float32: '<f4',\n int64: '<i8',\n int32: '<i4',\n int16: '<i2',\n int8: '|i1',\n uint64: '<u8',\n uint32: '<u4',\n uint16: '<u2',\n uint8: '|u1',\n bool: '|b1',\n};\n\n/**\n * Unsupported dtype types (for error messages)\n */\nexport const UNSUPPORTED_DTYPE_PATTERNS: Record<string, string> = {\n c: 'complex numbers',\n S: 'byte strings',\n U: 'Unicode strings',\n O: 'Python objects',\n V: 'structured arrays (void)',\n M: 'datetime64',\n m: 'timedelta64',\n};\n\n/**\n * Parse a NumPy dtype descriptor string to our DType\n *\n * @param descr - NumPy descriptor like '<f8', '>i4', '|b1'\n * @returns Parsed result with dtype and byte order info\n * @throws Error if dtype is not supported\n */\nexport function parseDescriptor(descr: string): DTypeParseResult {\n // Handle structured dtypes (tuples/lists) - not supported\n if (descr.startsWith('[') || descr.startsWith('(')) {\n throw new UnsupportedDTypeError(`Structured/compound dtypes are not supported: ${descr}`);\n }\n\n // Extract endianness, type, and size\n let endian = '';\n let typeAndSize = descr;\n\n // Check for endian prefix\n if (descr[0] === '<' || descr[0] === '>' || descr[0] === '=' || descr[0] === '|') {\n endian = descr[0];\n typeAndSize = descr.slice(1);\n }\n\n // Check for unsupported types\n const typeChar = typeAndSize[0];\n if (typeChar && typeChar in UNSUPPORTED_DTYPE_PATTERNS) {\n throw new UnsupportedDTypeError(\n `Unsupported dtype: ${UNSUPPORTED_DTYPE_PATTERNS[typeChar]} (${descr}). ` +\n `Use the 'force' parameter to skip arrays with unsupported dtypes.`\n );\n }\n\n // Look up in our mapping\n const dtype = DESCR_TO_DTYPE[typeAndSize];\n if (!dtype) {\n throw new UnsupportedDTypeError(\n `Unknown or unsupported dtype descriptor: ${descr}. ` +\n `Supported types: ${SUPPORTED_DTYPES.join(', ')}. ` +\n `Use the 'force' parameter to skip arrays with unsupported dtypes.`\n );\n }\n\n // Determine if byte swapping is needed\n const isLittleEndian = isSystemLittleEndian();\n const dataIsLittleEndian = endian === '<' || endian === '|' || (endian === '=' && isLittleEndian);\n const dataIsBigEndian = endian === '>' || (endian === '=' && !isLittleEndian);\n\n // We need to byte swap if:\n // - Data is big-endian and system is little-endian\n // - Data is little-endian and system is big-endian\n // But only for multi-byte types\n const itemsize = parseInt(typeAndSize.slice(1), 10);\n const needsByteSwap =\n itemsize > 1 &&\n ((dataIsBigEndian && isLittleEndian) || (dataIsLittleEndian && !isLittleEndian));\n\n return {\n dtype,\n needsByteSwap,\n itemsize,\n };\n}\n\n/**\n * Custom error for unsupported dtypes\n */\nexport class UnsupportedDTypeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedDTypeError';\n }\n}\n\n/**\n * Custom error for invalid NPY format\n */\nexport class InvalidNpyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidNpyError';\n }\n}\n", "/**\n * NPY file parser\n *\n * Parses NumPy .npy files (both v1 and v2/v3 formats) into NDArray objects.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { ArrayStorage } from '../../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type DType } from '../../core/dtype';\nimport {\n NPY_MAGIC,\n parseDescriptor,\n InvalidNpyError,\n type NpyHeader,\n type NpyMetadata,\n} from './format';\n\n/**\n * Parse an NPY file from a Uint8Array or ArrayBuffer\n *\n * @param buffer - The NPY file contents\n * @returns An NDArray containing the parsed data\n * @throws InvalidNpyError if the file format is invalid\n * @throws UnsupportedDTypeError if the dtype is not supported\n */\nexport function parseNpy(buffer: ArrayBuffer | Uint8Array): NDArray {\n const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const metadata = parseNpyHeader(bytes);\n return parseNpyData(bytes, metadata);\n}\n\n/**\n * Parse just the NPY header without reading the data\n *\n * @param bytes - The NPY file bytes\n * @returns Parsed metadata including version, header, and data offset\n */\nexport function parseNpyHeader(bytes: Uint8Array): NpyMetadata {\n // Check minimum size\n if (bytes.length < 10) {\n throw new InvalidNpyError('File too small to be a valid NPY file');\n }\n\n // Verify magic number\n for (let i = 0; i < NPY_MAGIC.length; i++) {\n if (bytes[i] !== NPY_MAGIC[i]) {\n throw new InvalidNpyError('Invalid NPY magic number');\n }\n }\n\n // Read version\n const major = bytes[6]!;\n const minor = bytes[7]!;\n\n if (major !== 1 && major !== 2 && major !== 3) {\n throw new InvalidNpyError(`Unsupported NPY version: ${major}.${minor}`);\n }\n\n // Read header length\n let headerLen: number;\n let headerStart: number;\n\n if (major === 1) {\n // v1.0: 2-byte little-endian header length\n headerLen = bytes[8]! | (bytes[9]! << 8);\n headerStart = 10;\n } else {\n // v2.0 and v3.0: 4-byte little-endian header length\n headerLen = bytes[8]! | (bytes[9]! << 8) | (bytes[10]! << 16) | (bytes[11]! << 24);\n headerStart = 12;\n }\n\n // Read header string\n const headerEnd = headerStart + headerLen;\n if (bytes.length < headerEnd) {\n throw new InvalidNpyError('File truncated: header extends beyond file');\n }\n\n const headerBytes = bytes.slice(headerStart, headerEnd);\n const headerStr = new TextDecoder('utf-8').decode(headerBytes).trim();\n\n // Parse header dictionary\n const header = parseHeaderDict(headerStr);\n\n return {\n version: { major, minor },\n header,\n dataOffset: headerEnd,\n };\n}\n\n/**\n * Parse the data section of an NPY file given parsed metadata\n */\nexport function parseNpyData(bytes: Uint8Array, metadata: NpyMetadata): NDArray {\n const { header, dataOffset } = metadata;\n\n // Parse dtype descriptor\n const { dtype, needsByteSwap, itemsize } = parseDescriptor(header.descr);\n\n // Calculate expected data size\n const numElements = header.shape.reduce((a, b) => a * b, 1);\n const expectedBytes = numElements * itemsize;\n const actualBytes = bytes.length - dataOffset;\n\n if (actualBytes < expectedBytes) {\n throw new InvalidNpyError(\n `File truncated: expected ${expectedBytes} bytes of data, got ${actualBytes}`\n );\n }\n\n // Extract data buffer - create a copy to ensure we have a plain ArrayBuffer\n const dataBuffer = new ArrayBuffer(expectedBytes);\n const dataView = new Uint8Array(dataBuffer);\n dataView.set(bytes.subarray(dataOffset, dataOffset + expectedBytes));\n\n // Create typed array from data\n const typedData = createTypedArray(dataBuffer, dtype, numElements, needsByteSwap, itemsize);\n\n // Handle Fortran order (column-major)\n // NumPy stores data in row-major (C order) by default\n // If fortran_order is true, we need to adjust\n let shape = header.shape;\n let storage: ArrayStorage;\n\n if (header.fortran_order && shape.length > 1) {\n // For Fortran order, we can either:\n // 1. Transpose the shape and data (requires copy)\n // 2. Use column-major strides (creates a view)\n // We'll transpose to convert to C-order for consistency\n const reversedShape = [...shape].reverse();\n const tempStorage = ArrayStorage.fromData(typedData, reversedShape, dtype);\n\n // Transpose to get correct C-order layout\n storage = transposeStorage(tempStorage, reversedShape);\n shape = header.shape; // Use original shape after transpose\n } else {\n storage = ArrayStorage.fromData(typedData, [...shape], dtype);\n }\n\n return new NDArray(storage);\n}\n\n/**\n * Parse the Python dictionary header string\n */\nfunction parseHeaderDict(headerStr: string): NpyHeader {\n // Header is a Python dict literal like:\n // {'descr': '<f8', 'fortran_order': False, 'shape': (3, 4), }\n\n // Simple regex-based parser for the specific format\n const descrMatch = headerStr.match(/'descr'\\s*:\\s*'([^']+)'/);\n const fortranMatch = headerStr.match(/'fortran_order'\\s*:\\s*(True|False)/);\n const shapeMatch = headerStr.match(/'shape'\\s*:\\s*\\(([^)]*)\\)/);\n\n if (!descrMatch || !fortranMatch || !shapeMatch) {\n throw new InvalidNpyError(`Failed to parse NPY header: ${headerStr}`);\n }\n\n const descr = descrMatch[1]!;\n const fortran_order = fortranMatch[1] === 'True';\n\n // Parse shape tuple\n const shapeStr = shapeMatch[1]!.trim();\n let shape: number[];\n\n if (shapeStr === '') {\n // Scalar: shape is ()\n shape = [];\n } else {\n // Parse comma-separated integers\n shape = shapeStr\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s !== '')\n .map((s) => {\n const n = parseInt(s, 10);\n if (isNaN(n)) {\n throw new InvalidNpyError(`Invalid shape value: ${s}`);\n }\n return n;\n });\n }\n\n return { descr, fortran_order, shape };\n}\n\n/**\n * Create a typed array from raw bytes with optional byte swapping\n */\nfunction createTypedArray(\n buffer: ArrayBuffer,\n dtype: DType,\n numElements: number,\n needsByteSwap: boolean,\n itemsize: number\n):\n | Float64Array\n | Float32Array\n | BigInt64Array\n | Int32Array\n | Int16Array\n | Int8Array\n | BigUint64Array\n | Uint32Array\n | Uint16Array\n | Uint8Array {\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new InvalidNpyError(`Cannot create array for dtype: ${dtype}`);\n }\n\n if (!needsByteSwap) {\n // Fast path: no byte swapping needed\n return new Constructor(buffer, 0, numElements);\n }\n\n // Slow path: need to byte swap\n const bytes = new Uint8Array(buffer);\n const swapped = new Uint8Array(buffer.byteLength);\n\n for (let i = 0; i < numElements; i++) {\n const start = i * itemsize;\n // Reverse bytes for this element\n for (let j = 0; j < itemsize; j++) {\n swapped[start + j] = bytes[start + itemsize - 1 - j]!;\n }\n }\n\n return new Constructor(swapped.buffer, 0, numElements);\n}\n\n/**\n * Transpose storage to convert from Fortran to C order\n */\nfunction transposeStorage(storage: ArrayStorage, shape: readonly number[]): ArrayStorage {\n const ndim = shape.length;\n const size = storage.size;\n const dtype = storage.dtype;\n const Constructor = getTypedArrayConstructor(dtype);\n\n if (!Constructor) {\n throw new InvalidNpyError(`Cannot create array for dtype: ${dtype}`);\n }\n\n const newData = new Constructor(size);\n const newShape = [...shape].reverse();\n\n // Compute strides for both orderings\n const oldStrides = computeStrides(shape);\n const newStrides = computeStrides(newShape);\n\n // Copy data with transposition\n const indices = new Array(ndim).fill(0);\n\n for (let linearIdx = 0; linearIdx < size; linearIdx++) {\n // Get multi-index in old layout\n let remaining = linearIdx;\n for (let i = 0; i < ndim; i++) {\n const dimSize = oldStrides[i]!;\n indices[i] = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n }\n\n // Compute new linear index (reverse indices for transpose)\n let newLinearIdx = 0;\n for (let i = 0; i < ndim; i++) {\n newLinearIdx += indices[ndim - 1 - i]! * newStrides[i]!;\n }\n\n // Copy value\n if (isBigIntDType(dtype)) {\n (newData as BigInt64Array | BigUint64Array)[newLinearIdx] = storage.iget(linearIdx) as bigint;\n } else {\n (newData as Exclude<typeof newData, BigInt64Array | BigUint64Array>)[newLinearIdx] =\n storage.iget(linearIdx) as number;\n }\n }\n\n return ArrayStorage.fromData(newData, newShape, dtype);\n}\n\n/**\n * Compute C-order strides for a shape\n */\nfunction computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * NPY file serializer\n *\n * Serializes NDArray objects to NumPy .npy format (v3.0).\n * Always writes in little-endian, C-contiguous order.\n *\n * v3.0 is identical to v2.0 but allows UTF-8 in dtype descriptions.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { getDTypeSize, isBigIntDType, type DType } from '../../core/dtype';\nimport { NPY_MAGIC, DTYPE_TO_DESCR, isSystemLittleEndian } from './format';\n\n/**\n * Serialize an NDArray to NPY format (v3.0)\n *\n * @param arr - The NDArray to serialize\n * @returns A Uint8Array containing the NPY file data\n */\nexport function serializeNpy(arr: NDArray): Uint8Array {\n const shape = arr.shape;\n const dtype = arr.dtype as DType;\n\n // Build header dictionary string\n const descr = DTYPE_TO_DESCR[dtype];\n const shapeStr =\n shape.length === 0 ? '()' : shape.length === 1 ? `(${shape[0]},)` : `(${shape.join(', ')})`;\n\n // Python dict format: {'descr': '<f8', 'fortran_order': False, 'shape': (3, 4), }\n let headerDict = `{'descr': '${descr}', 'fortran_order': False, 'shape': ${shapeStr}, }`;\n\n // Header must be padded to 64-byte alignment (including magic, version, header_len)\n // v3.0 uses 4 bytes for header length (same as v2.0)\n // Total prefix is 6 (magic) + 2 (version) + 4 (header_len) = 12 bytes\n // Header string + newline should make total divisible by 64\n const PREFIX_LEN = 12;\n const totalBeforeData = PREFIX_LEN + headerDict.length + 1; // +1 for trailing newline\n const padding = (64 - (totalBeforeData % 64)) % 64;\n headerDict = headerDict + ' '.repeat(padding) + '\\n';\n\n const headerBytes = new TextEncoder().encode(headerDict);\n const headerLen = headerBytes.length;\n\n // Calculate data size\n const numElements = arr.size;\n const itemsize = getDTypeSize(dtype);\n const dataSize = numElements * itemsize;\n\n // Allocate output buffer\n const totalSize = PREFIX_LEN + headerLen + dataSize;\n const output = new Uint8Array(totalSize);\n\n // Write magic number\n output.set(NPY_MAGIC, 0);\n\n // Write version (3.0)\n output[6] = 3;\n output[7] = 0;\n\n // Write header length (4-byte little-endian)\n output[8] = headerLen & 0xff;\n output[9] = (headerLen >> 8) & 0xff;\n output[10] = (headerLen >> 16) & 0xff;\n output[11] = (headerLen >> 24) & 0xff;\n\n // Write header string\n output.set(headerBytes, PREFIX_LEN);\n\n // Write data\n const dataOffset = PREFIX_LEN + headerLen;\n writeArrayData(arr, output.subarray(dataOffset), itemsize);\n\n return output;\n}\n\n/**\n * Write array data to the output buffer\n */\nfunction writeArrayData(arr: NDArray, output: Uint8Array, itemsize: number): void {\n const dtype = arr.dtype as DType;\n const size = arr.size;\n const isLittleEndian = isSystemLittleEndian();\n const isBigInt = isBigIntDType(dtype);\n\n // Get raw data - need to handle non-contiguous arrays\n const storage = arr['_storage']; // Access private member\n const isCContiguous = storage.isCContiguous && storage.offset === 0;\n\n if (isCContiguous && isLittleEndian) {\n // Fast path: just copy the underlying buffer\n const srcData = storage.data;\n const srcBytes = new Uint8Array(srcData.buffer, srcData.byteOffset, size * itemsize);\n output.set(srcBytes);\n } else {\n // Slow path: element by element copy with potential byte swapping\n const dataView = new DataView(output.buffer, output.byteOffset, output.byteLength);\n\n for (let i = 0; i < size; i++) {\n const value = storage.iget(i);\n const offset = i * itemsize;\n\n if (isBigInt) {\n // Write BigInt as little-endian\n writeBigInt64LE(dataView, offset, value as bigint, dtype === 'uint64');\n } else {\n // Write number as little-endian\n writeNumberLE(dataView, offset, value as number, dtype);\n }\n }\n }\n}\n\n/**\n * Write a BigInt as little-endian\n */\nfunction writeBigInt64LE(view: DataView, offset: number, value: bigint, unsigned: boolean): void {\n if (unsigned) {\n view.setBigUint64(offset, value, true);\n } else {\n view.setBigInt64(offset, value, true);\n }\n}\n\n/**\n * Write a number as little-endian\n */\nfunction writeNumberLE(view: DataView, offset: number, value: number, dtype: DType): void {\n switch (dtype) {\n case 'float64':\n view.setFloat64(offset, value, true);\n break;\n case 'float32':\n view.setFloat32(offset, value, true);\n break;\n case 'int32':\n view.setInt32(offset, value, true);\n break;\n case 'int16':\n view.setInt16(offset, value, true);\n break;\n case 'int8':\n view.setInt8(offset, value);\n break;\n case 'uint32':\n view.setUint32(offset, value, true);\n break;\n case 'uint16':\n view.setUint16(offset, value, true);\n break;\n case 'uint8':\n case 'bool':\n view.setUint8(offset, value);\n break;\n default:\n throw new Error(`Unsupported dtype for serialization: ${dtype}`);\n }\n}\n", "/**\n * ZIP file format types and constants\n */\n\n/**\n * ZIP local file header signature\n */\nexport const ZIP_LOCAL_SIGNATURE = 0x04034b50;\n\n/**\n * ZIP central directory header signature\n */\nexport const ZIP_CENTRAL_SIGNATURE = 0x02014b50;\n\n/**\n * ZIP end of central directory signature\n */\nexport const ZIP_END_SIGNATURE = 0x06054b50;\n\n/**\n * Compression methods\n */\nexport const ZIP_STORED = 0; // No compression\nexport const ZIP_DEFLATED = 8; // DEFLATE compression\n\n/**\n * Entry in a ZIP file\n */\nexport interface ZipEntry {\n /** File name */\n name: string;\n /** Uncompressed data */\n data: Uint8Array;\n /** Compression method used */\n compressionMethod: number;\n /** CRC-32 checksum */\n crc32: number;\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n}\n\n/**\n * Raw entry as read from ZIP (before decompression)\n */\nexport interface RawZipEntry {\n /** File name */\n name: string;\n /** Compressed data */\n compressedData: Uint8Array;\n /** Compression method */\n compressionMethod: number;\n /** CRC-32 checksum */\n crc32: number;\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n}\n\n/**\n * CRC-32 lookup table\n */\nconst CRC32_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let j = 0; j < 8; j++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[i] = c;\n }\n return table;\n})();\n\n/**\n * Calculate CRC-32 checksum\n */\nexport function crc32(data: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = CRC32_TABLE[(crc ^ data[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n", "/**\n * Minimal ZIP file reader\n *\n * Reads ZIP files with STORED or DEFLATE compression.\n * Uses the Compression Streams API (built into modern browsers and Node.js 18+).\n */\n\nimport {\n ZIP_LOCAL_SIGNATURE,\n ZIP_END_SIGNATURE,\n ZIP_STORED,\n ZIP_DEFLATED,\n type RawZipEntry,\n} from './types';\n\n/**\n * Read a ZIP file and return its entries\n *\n * @param buffer - ZIP file contents\n * @returns Map of file names to their uncompressed data\n */\nexport async function readZip(buffer: ArrayBuffer | Uint8Array): Promise<Map<string, Uint8Array>> {\n const entries = parseZipEntries(buffer);\n const result = new Map<string, Uint8Array>();\n\n for (const entry of entries) {\n const data = await decompressEntry(entry);\n result.set(entry.name, data);\n }\n\n return result;\n}\n\n/**\n * Synchronously read a ZIP file (only works for STORED entries)\n *\n * @param buffer - ZIP file contents\n * @returns Map of file names to their uncompressed data\n * @throws Error if any entry uses compression\n */\nexport function readZipSync(buffer: ArrayBuffer | Uint8Array): Map<string, Uint8Array> {\n const entries = parseZipEntries(buffer);\n const result = new Map<string, Uint8Array>();\n\n for (const entry of entries) {\n if (entry.compressionMethod !== ZIP_STORED) {\n throw new Error(\n `Cannot read compressed entry synchronously: ${entry.name}. ` +\n `Use readZip() (async) for DEFLATE-compressed files.`\n );\n }\n result.set(entry.name, entry.compressedData);\n }\n\n return result;\n}\n\n/**\n * Central directory entry info\n */\ninterface CentralDirEntry {\n name: string;\n compressionMethod: number;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n}\n\n/**\n * Parse ZIP entries without decompressing\n *\n * Uses central directory for reliable size information, as some ZIP writers\n * (including Python's zipfile module used by NumPy) set local header sizes to\n * 0xFFFFFFFF when streaming.\n */\nfunction parseZipEntries(buffer: ArrayBuffer | Uint8Array): RawZipEntry[] {\n const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: RawZipEntry[] = [];\n\n // Find end of central directory\n let eocdOffset = -1;\n for (let i = bytes.length - 22; i >= 0; i--) {\n if (view.getUint32(i, true) === ZIP_END_SIGNATURE) {\n eocdOffset = i;\n break;\n }\n }\n\n if (eocdOffset === -1) {\n throw new Error('Invalid ZIP file: end of central directory not found');\n }\n\n // Read central directory location\n const centralDirOffset = view.getUint32(eocdOffset + 16, true);\n const numEntries = view.getUint16(eocdOffset + 10, true);\n\n // Parse central directory entries first to get reliable sizes\n const centralEntries: CentralDirEntry[] = [];\n let cdOffset = centralDirOffset;\n\n for (let i = 0; i < numEntries; i++) {\n const signature = view.getUint32(cdOffset, true);\n if (signature !== 0x02014b50) {\n // Central directory signature\n break;\n }\n\n const compressionMethod = view.getUint16(cdOffset + 10, true);\n const crc32 = view.getUint32(cdOffset + 16, true);\n const compressedSize = view.getUint32(cdOffset + 20, true);\n const uncompressedSize = view.getUint32(cdOffset + 24, true);\n const fileNameLength = view.getUint16(cdOffset + 28, true);\n const extraFieldLength = view.getUint16(cdOffset + 30, true);\n const commentLength = view.getUint16(cdOffset + 32, true);\n const localHeaderOffset = view.getUint32(cdOffset + 42, true);\n\n const fileNameBytes = bytes.slice(cdOffset + 46, cdOffset + 46 + fileNameLength);\n const fileName = new TextDecoder('utf-8').decode(fileNameBytes);\n\n centralEntries.push({\n name: fileName,\n compressionMethod,\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n });\n\n cdOffset = cdOffset + 46 + fileNameLength + extraFieldLength + commentLength;\n }\n\n // Now extract data using local headers for data location, but central directory for sizes\n for (const ce of centralEntries) {\n const localOffset = ce.localHeaderOffset;\n const signature = view.getUint32(localOffset, true);\n\n if (signature !== ZIP_LOCAL_SIGNATURE) {\n throw new Error(`Invalid local file header at offset ${localOffset}`);\n }\n\n const fileNameLength = view.getUint16(localOffset + 26, true);\n const extraFieldLength = view.getUint16(localOffset + 28, true);\n\n const dataStart = localOffset + 30 + fileNameLength + extraFieldLength;\n const compressedData = bytes.slice(dataStart, dataStart + ce.compressedSize);\n\n entries.push({\n name: ce.name,\n compressedData,\n compressionMethod: ce.compressionMethod,\n crc32: ce.crc32,\n compressedSize: ce.compressedSize,\n uncompressedSize: ce.uncompressedSize,\n });\n }\n\n return entries;\n}\n\n/**\n * Decompress a single ZIP entry\n */\nasync function decompressEntry(entry: RawZipEntry): Promise<Uint8Array> {\n if (entry.compressionMethod === ZIP_STORED) {\n return entry.compressedData;\n }\n\n if (entry.compressionMethod === ZIP_DEFLATED) {\n return await inflateRaw(entry.compressedData);\n }\n\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n}\n\n/**\n * Decompress raw DEFLATE data using DecompressionStream\n */\nasync function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n // Check if DecompressionStream is available\n if (typeof DecompressionStream === 'undefined') {\n throw new Error(\n 'DecompressionStream is not available. ' +\n 'This environment does not support the Compression Streams API. ' +\n 'Please use a modern browser or Node.js 18+.'\n );\n }\n\n // DEFLATE in ZIP is \"raw\" DEFLATE (no zlib header)\n // DecompressionStream expects the \"deflate-raw\" format\n const ds = new DecompressionStream('deflate-raw');\n\n // Create a copy to ensure we have a clean ArrayBuffer (avoids SharedArrayBuffer issues)\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n\n const writer = ds.writable.getWriter();\n void writer.write(dataCopy);\n void writer.close();\n\n const reader = ds.readable.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n", "/**\n * NPZ file parser\n *\n * NPZ is a ZIP archive containing multiple .npy files.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { parseNpy } from '../npy/parser';\nimport { UnsupportedDTypeError } from '../npy/format';\nimport { readZip, readZipSync } from '../zip/reader';\n\n/**\n * Options for parsing NPZ files\n */\nexport interface NpzParseOptions {\n /**\n * If true, skip arrays with unsupported dtypes instead of throwing an error.\n * Skipped arrays will not be included in the result.\n * Default: false\n */\n force?: boolean;\n}\n\n/**\n * Result of parsing an NPZ file\n */\nexport interface NpzParseResult {\n /** Successfully parsed arrays */\n arrays: Map<string, NDArray>;\n /** Names of arrays that were skipped due to unsupported dtypes (only when force=true) */\n skipped: string[];\n /** Error messages for skipped arrays */\n errors: Map<string, string>;\n}\n\n/**\n * Parse an NPZ file from bytes\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Promise resolving to parsed arrays\n */\nexport async function parseNpz(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Promise<NpzParseResult> {\n const force = options.force ?? false;\n const files = await readZip(buffer);\n return parseNpzFromFiles(files, force);\n}\n\n/**\n * Synchronously parse an NPZ file (only works if not DEFLATE compressed)\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Parsed arrays\n */\nexport function parseNpzSync(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): NpzParseResult {\n const force = options.force ?? false;\n const files = readZipSync(buffer);\n return parseNpzFromFiles(files, force);\n}\n\n/**\n * Parse NPZ from already-extracted files\n */\nfunction parseNpzFromFiles(files: Map<string, Uint8Array>, force: boolean): NpzParseResult {\n const arrays = new Map<string, NDArray>();\n const skipped: string[] = [];\n const errors = new Map<string, string>();\n\n for (const [fileName, data] of files) {\n // NPZ entries should have .npy extension\n if (!fileName.endsWith('.npy')) {\n continue;\n }\n\n // Extract array name (remove .npy extension)\n const name = fileName.slice(0, -4);\n\n try {\n const arr = parseNpy(data);\n arrays.set(name, arr);\n } catch (error) {\n if (error instanceof UnsupportedDTypeError && force) {\n // Skip this array but continue processing others\n skipped.push(name);\n errors.set(name, error.message);\n } else {\n // Re-throw all other errors, or UnsupportedDTypeError if force is false\n throw error;\n }\n }\n }\n\n return { arrays, skipped, errors };\n}\n\n/**\n * Convenience function to get arrays as a plain object\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Promise resolving to object with array names as keys\n */\nexport async function loadNpz(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Promise<Record<string, NDArray>> {\n const result = await parseNpz(buffer, options);\n return Object.fromEntries(result.arrays);\n}\n\n/**\n * Synchronous version of loadNpz\n */\nexport function loadNpzSync(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Record<string, NDArray> {\n const result = parseNpzSync(buffer, options);\n return Object.fromEntries(result.arrays);\n}\n", "/**\n * Minimal ZIP file writer\n *\n * Creates ZIP files with optional DEFLATE compression.\n * Uses the Compression Streams API (built into modern browsers and Node.js 18+).\n */\n\nimport {\n ZIP_LOCAL_SIGNATURE,\n ZIP_CENTRAL_SIGNATURE,\n ZIP_END_SIGNATURE,\n ZIP_STORED,\n ZIP_DEFLATED,\n crc32,\n} from './types';\n\n/**\n * Options for writing a ZIP file\n */\nexport interface ZipWriteOptions {\n /** Whether to compress files (default: false for NPZ compatibility) */\n compress?: boolean;\n}\n\n/**\n * Create a ZIP file from a map of file names to data\n *\n * @param files - Map of file names to their data\n * @param options - Write options\n * @returns ZIP file as Uint8Array\n */\nexport async function writeZip(\n files: Map<string, Uint8Array>,\n options: ZipWriteOptions = {}\n): Promise<Uint8Array> {\n const compress = options.compress ?? false;\n const entries: {\n name: string;\n data: Uint8Array;\n compressedData: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }[] = [];\n\n // Prepare entries\n for (const [name, data] of files) {\n const crc = crc32(data);\n let compressedData: Uint8Array;\n let compressionMethod: number;\n\n if (compress) {\n compressedData = await deflateRaw(data);\n // Only use compression if it actually makes the data smaller\n if (compressedData.length < data.length) {\n compressionMethod = ZIP_DEFLATED;\n } else {\n compressedData = data;\n compressionMethod = ZIP_STORED;\n }\n } else {\n compressedData = data;\n compressionMethod = ZIP_STORED;\n }\n\n entries.push({\n name,\n data,\n compressedData,\n crc,\n compressionMethod,\n offset: 0, // Will be set during writing\n });\n }\n\n // Calculate total size\n let localHeadersSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n localHeadersSize += 30 + nameBytes.length + entry.compressedData.length;\n }\n\n let centralDirSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n centralDirSize += 46 + nameBytes.length;\n }\n\n const eocdSize = 22;\n const totalSize = localHeadersSize + centralDirSize + eocdSize;\n\n // Allocate buffer\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer);\n\n // Write local file headers and data\n let offset = 0;\n for (const entry of entries) {\n entry.offset = offset;\n offset = writeLocalHeader(output, view, offset, entry);\n }\n\n // Write central directory\n const centralDirOffset = offset;\n for (const entry of entries) {\n offset = writeCentralHeader(output, view, offset, entry);\n }\n\n // Write end of central directory\n writeEndOfCentralDirectory(view, offset, entries.length, centralDirSize, centralDirOffset);\n\n return output;\n}\n\n/**\n * Create a ZIP file synchronously (no compression)\n *\n * @param files - Map of file names to their data\n * @returns ZIP file as Uint8Array\n */\nexport function writeZipSync(files: Map<string, Uint8Array>): Uint8Array {\n const entries: {\n name: string;\n data: Uint8Array;\n compressedData: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }[] = [];\n\n // Prepare entries (no compression in sync mode)\n for (const [name, data] of files) {\n const crc = crc32(data);\n entries.push({\n name,\n data,\n compressedData: data,\n crc,\n compressionMethod: ZIP_STORED,\n offset: 0,\n });\n }\n\n // Calculate total size\n let localHeadersSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n localHeadersSize += 30 + nameBytes.length + entry.compressedData.length;\n }\n\n let centralDirSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n centralDirSize += 46 + nameBytes.length;\n }\n\n const eocdSize = 22;\n const totalSize = localHeadersSize + centralDirSize + eocdSize;\n\n // Allocate buffer\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer);\n\n // Write local file headers and data\n let offset = 0;\n for (const entry of entries) {\n entry.offset = offset;\n offset = writeLocalHeader(output, view, offset, entry);\n }\n\n // Write central directory\n const centralDirOffset = offset;\n for (const entry of entries) {\n offset = writeCentralHeader(output, view, offset, entry);\n }\n\n // Write end of central directory\n writeEndOfCentralDirectory(view, offset, entries.length, centralDirSize, centralDirOffset);\n\n return output;\n}\n\n/**\n * Write a local file header and data\n */\nfunction writeLocalHeader(\n output: Uint8Array,\n view: DataView,\n offset: number,\n entry: {\n name: string;\n compressedData: Uint8Array;\n data: Uint8Array;\n crc: number;\n compressionMethod: number;\n }\n): number {\n const nameBytes = new TextEncoder().encode(entry.name);\n\n // Signature\n view.setUint32(offset, ZIP_LOCAL_SIGNATURE, true);\n offset += 4;\n\n // Version needed to extract (2.0 for DEFLATE)\n view.setUint16(offset, entry.compressionMethod === ZIP_DEFLATED ? 20 : 10, true);\n offset += 2;\n\n // General purpose bit flag\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Compression method\n view.setUint16(offset, entry.compressionMethod, true);\n offset += 2;\n\n // Last mod time (use a fixed value)\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Last mod date (use a fixed value)\n view.setUint16(offset, 0x21, true); // Jan 1, 1980\n offset += 2;\n\n // CRC-32\n view.setUint32(offset, entry.crc, true);\n offset += 4;\n\n // Compressed size\n view.setUint32(offset, entry.compressedData.length, true);\n offset += 4;\n\n // Uncompressed size\n view.setUint32(offset, entry.data.length, true);\n offset += 4;\n\n // File name length\n view.setUint16(offset, nameBytes.length, true);\n offset += 2;\n\n // Extra field length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // File name\n output.set(nameBytes, offset);\n offset += nameBytes.length;\n\n // File data\n output.set(entry.compressedData, offset);\n offset += entry.compressedData.length;\n\n return offset;\n}\n\n/**\n * Write a central directory header\n */\nfunction writeCentralHeader(\n output: Uint8Array,\n view: DataView,\n offset: number,\n entry: {\n name: string;\n compressedData: Uint8Array;\n data: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }\n): number {\n const nameBytes = new TextEncoder().encode(entry.name);\n\n // Signature\n view.setUint32(offset, ZIP_CENTRAL_SIGNATURE, true);\n offset += 4;\n\n // Version made by\n view.setUint16(offset, 20, true);\n offset += 2;\n\n // Version needed to extract\n view.setUint16(offset, entry.compressionMethod === ZIP_DEFLATED ? 20 : 10, true);\n offset += 2;\n\n // General purpose bit flag\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Compression method\n view.setUint16(offset, entry.compressionMethod, true);\n offset += 2;\n\n // Last mod time\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Last mod date\n view.setUint16(offset, 0x21, true);\n offset += 2;\n\n // CRC-32\n view.setUint32(offset, entry.crc, true);\n offset += 4;\n\n // Compressed size\n view.setUint32(offset, entry.compressedData.length, true);\n offset += 4;\n\n // Uncompressed size\n view.setUint32(offset, entry.data.length, true);\n offset += 4;\n\n // File name length\n view.setUint16(offset, nameBytes.length, true);\n offset += 2;\n\n // Extra field length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // File comment length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Disk number start\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Internal file attributes\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // External file attributes\n view.setUint32(offset, 0, true);\n offset += 4;\n\n // Relative offset of local header\n view.setUint32(offset, entry.offset, true);\n offset += 4;\n\n // File name\n output.set(nameBytes, offset);\n offset += nameBytes.length;\n\n return offset;\n}\n\n/**\n * Write end of central directory record\n */\nfunction writeEndOfCentralDirectory(\n view: DataView,\n offset: number,\n numEntries: number,\n centralDirSize: number,\n centralDirOffset: number\n): void {\n // Signature\n view.setUint32(offset, ZIP_END_SIGNATURE, true);\n offset += 4;\n\n // Number of this disk\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Disk where central directory starts\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Number of central directory records on this disk\n view.setUint16(offset, numEntries, true);\n offset += 2;\n\n // Total number of central directory records\n view.setUint16(offset, numEntries, true);\n offset += 2;\n\n // Size of central directory\n view.setUint32(offset, centralDirSize, true);\n offset += 4;\n\n // Offset of central directory\n view.setUint32(offset, centralDirOffset, true);\n offset += 4;\n\n // Comment length\n view.setUint16(offset, 0, true);\n}\n\n/**\n * Compress data using raw DEFLATE\n */\nasync function deflateRaw(data: Uint8Array): Promise<Uint8Array> {\n // Check if CompressionStream is available\n if (typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not available. ' +\n 'This environment does not support the Compression Streams API. ' +\n 'Please use a modern browser or Node.js 18+.'\n );\n }\n\n const cs = new CompressionStream('deflate-raw');\n\n // Create a copy to ensure we have a clean ArrayBuffer (avoids SharedArrayBuffer issues)\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n\n const writer = cs.writable.getWriter();\n void writer.write(dataCopy);\n void writer.close();\n\n const reader = cs.readable.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n", "/**\n * NPZ file serializer\n *\n * Serializes multiple NDArrays to NPZ format (ZIP archive of .npy files).\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { serializeNpy } from '../npy/serializer';\nimport { writeZip, writeZipSync } from '../zip/writer';\n\n/**\n * Input type for arrays - supports:\n * - Array of NDArrays (positional, named arr_0, arr_1, etc.)\n * - Map of names to NDArrays\n * - Object with names as keys\n */\nexport type NpzArraysInput = NDArray[] | Map<string, NDArray> | Record<string, NDArray>;\n\n/**\n * Options for serializing NPZ files\n */\nexport interface NpzSerializeOptions {\n /**\n * Whether to compress the NPZ file using DEFLATE.\n * Default: false (matches np.savez behavior; use true for np.savez_compressed behavior)\n */\n compress?: boolean;\n}\n\n/**\n * Serialize multiple arrays to NPZ format\n *\n * @param arrays - Arrays to save. Can be:\n * - An array of NDArrays (named arr_0, arr_1, etc. like np.savez positional args)\n * - A Map of names to NDArrays\n * - An object with names as keys (like np.savez keyword args)\n * @param options - Serialization options\n * @returns Promise resolving to NPZ file as Uint8Array\n *\n * @example\n * // Positional arrays (named arr_0, arr_1)\n * await serializeNpz([arr1, arr2])\n *\n * // Named arrays\n * await serializeNpz({ x: arr1, y: arr2 })\n */\nexport async function serializeNpz(\n arrays: NpzArraysInput,\n options: NpzSerializeOptions = {}\n): Promise<Uint8Array> {\n const files = prepareNpzFiles(arrays);\n return writeZip(files, { compress: options.compress ?? false });\n}\n\n/**\n * Synchronously serialize multiple arrays to NPZ format (no compression)\n *\n * @param arrays - Arrays to save (same input types as serializeNpz)\n * @returns NPZ file as Uint8Array\n */\nexport function serializeNpzSync(arrays: NpzArraysInput): Uint8Array {\n const files = prepareNpzFiles(arrays);\n return writeZipSync(files);\n}\n\n/**\n * Prepare NPY files for ZIP packaging\n */\nfunction prepareNpzFiles(arrays: NpzArraysInput): Map<string, Uint8Array> {\n const files = new Map<string, Uint8Array>();\n\n // Handle array input (positional arrays get named arr_0, arr_1, etc.)\n if (Array.isArray(arrays)) {\n for (let i = 0; i < arrays.length; i++) {\n const arr = arrays[i]!;\n const npyData = serializeNpy(arr);\n files.set(`arr_${i}.npy`, npyData);\n }\n return files;\n }\n\n // Handle both Map and plain object\n const entries = arrays instanceof Map ? arrays.entries() : Object.entries(arrays);\n\n for (const [name, arr] of entries) {\n // Validate array name\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('Array names must be non-empty strings');\n }\n\n // Serialize to NPY format\n const npyData = serializeNpy(arr);\n\n // Add .npy extension\n const fileName = name.endsWith('.npy') ? name : `${name}.npy`;\n files.set(fileName, npyData);\n }\n\n return files;\n}\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "DTYPE_TO_DESCR", "InvalidNpyError", "NDArray", "SUPPORTED_DTYPES", "UnsupportedDTypeError", "__version__", "absolute", "append", "arange", "arccos", "arccosh", "arcsin", "arcsinh", "arctan", "arctan2", "arctanh", "argpartition", "argsort", "array", "array_equal", "array_equiv", "array_split", "asanyarray", "asarray", "ascontiguousarray", "asfortranarray", "atleast_1d", "atleast_2d", "atleast_3d", "average", "bitwise_and", "bitwise_not", "bitwise_or", "bitwise_xor", "broadcast_arrays", "broadcast_shapes", "broadcast_to", "cbrt", "choose", "column_stack", "compress", "concatenate", "copy", "cos", "cosh", "count_nonzero", "cumprod", "cumsum", "deg2rad", "degrees", "delete_", "diag", "diag_indices", "diag_indices_from", "diagflat", "diagonal", "divmod", "dot", "dsplit", "dstack", "einsum", "empty", "empty_like", "expand_dims", "extract", "eye", "fabs", "flatnonzero", "flip", "fliplr", "flipud", "floor_divide", "frombuffer", "fromfile", "fromfunction", "fromiter", "fromstring", "full", "full_like", "geomspace", "heaviside", "hsplit", "hstack", "hypot", "identity", "indices", "inner", "insert", "invert", "ix_", "kron", "left_shift", "lexsort", "linspace", "loadNpz", "loadNpzSync", "logspace", "mask_indices", "median", "meshgrid", "mod", "moveaxis", "nanargmax", "nanargmin", "nancumprod", "nancumsum", "nanmax", "nanmean", "nanmedian", "nanmin", "nanprod", "nanstd", "nansum", "nanvar", "negative", "nonzero", "ones", "ones_like", "outer", "packbits", "pad", "parseNpy", "parseNpyData", "parseNpyHeader", "parseNpz", "parseNpzSync", "partition", "percentile", "place", "positive", "power", "ptp", "put", "put_along_axis", "putmask", "quantile", "rad2deg", "radians", "ravel", "ravel_multi_index", "reciprocal", "remainder", "repeat", "reshape", "resize", "right_shift", "roll", "rollaxis", "rot90", "row_stack", "searchsorted", "select", "serializeNpy", "serializeNpz", "serializeNpzSync", "sign", "sin", "sinh", "sort", "sort_complex", "split", "sqrt", "square", "squeeze", "stack", "swapaxes", "take", "take_along_axis", "tan", "tanh", "tensordot", "tile", "trace", "transpose", "tri", "tril", "tril_indices", "tril_indices_from", "triu", "triu_indices", "triu_indices_from", "unpackbits", "unravel_index", "vander", "vsplit", "vstack", "where", "zeros", "zeros_like", "__toCommonJS", "parseSlice", "sliceStr", "index", "parts", "start", "stop", "step", "normalizeSlice", "spec", "size", "isIndex", "normalizedStart", "DEFAULT_DTYPE", "getTypedArrayConstructor", "dtype", "getDTypeSize", "isIntegerDType", "isFloatDType", "isBigIntDType", "promoteDTypes", "dtype1", "dtype2", "isFloatDType", "intDtype", "isSigned1", "isSigned2", "isUnsigned1", "isUnsigned2", "getSize", "dtype", "size1", "size2", "maxSize", "ArrayStorage", "_ArrayStorage", "data", "shape", "strides", "offset", "dtype", "a", "b", "ndim", "expectedStride", "i", "linearIndex", "remaining", "bufferIndex", "dimSize", "j", "idx", "value", "indices", "size", "Constructor", "getTypedArrayConstructor", "newData", "isBigIntDType", "src", "dst", "finalStrides", "finalOffset", "DEFAULT_DTYPE", "stride", "computeStrides", "broadcastShapes", "shapeA", "shapeB", "ndimA", "ndimB", "ndim", "result", "i", "dimA", "dimB", "broadcastStrides", "shape", "strides", "targetShape", "targetNdim", "targetIdx", "dim", "targetDim", "broadcastTo", "storage", "broadcastedStrides", "ArrayStorage", "elementwiseBinaryOp", "a", "b", "op", "opName", "outputShape", "aBroadcast", "bBroadcast", "resultDtype", "promoteDTypes", "resultData", "size", "isBigIntDType", "resultTyped", "aRaw", "bRaw", "aVal", "bVal", "needsConversion", "elementwiseComparisonOp", "elementwiseUnaryOp", "preserveDtype", "dtype", "inputData", "val", "canUseFastPath", "a", "b", "dim", "i", "add", "addScalar", "addArraysFast", "elementwiseBinaryOp", "x", "y", "dtype", "promoteDTypes", "result", "ArrayStorage", "size", "aData", "bData", "resultData", "isBigIntDType", "resultTyped", "aVal", "bVal", "aTyped", "bTyped", "subtract", "subtractScalar", "subtractArraysFast", "multiply", "multiplyScalar", "multiplyArraysFast", "divide", "divideScalar", "aIsFloat64", "bIsFloat64", "aIsFloat32", "bIsFloat32", "aFloat", "convertToFloatDType", "bFloat", "storage", "targetDtype", "srcData", "dstData", "scalar", "shape", "data", "thisTyped", "scalarBig", "resultDtype", "absolute", "val", "negative", "sign", "mod", "modScalar", "divisor", "divisorBig", "floorDivide", "floorDivideScalar", "positive", "reciprocal", "cbrt", "fabs", "divmod", "quotient", "remainder", "square", "bigData", "bigResultData", "heaviside", "x1", "x2", "x2Data", "x2Shape", "d", "x2Idx", "computeBroadcastShape", "shapes", "maxNdim", "s", "result", "i", "dim", "shape", "shapeIdx", "shapeDim", "broadcastStrides", "shape", "strides", "targetShape", "ndim", "targetNdim", "result", "i", "targetIdx", "dim", "targetDim", "broadcastTo", "storage", "broadcastedStrides", "ArrayStorage", "broadcastShapes", "shapes", "result", "computeBroadcastShape", "shapeStrs", "s", "greater", "a", "b", "greaterScalar", "elementwiseComparisonOp", "x", "y", "greaterEqual", "greaterEqualScalar", "less", "lessScalar", "lessEqual", "lessEqualScalar", "equal", "equalScalar", "notEqual", "notEqualScalar", "isclose", "rtol", "atol", "iscloseScalar", "diff", "threshold", "allclose", "closeResult", "data", "i", "arrayEquiv", "a1", "a2", "shapes", "broadcastShape", "computeBroadcastShape", "b1", "broadcastTo", "b2", "ndim", "size", "acc", "d", "isBigInt1", "isBigIntDType", "isBigInt2", "flatIdx", "temp", "indices", "val1", "val2", "v1", "v2", "storage", "scalar", "thisData", "ArrayStorage", "dtype", "scalarBig", "typedData", "thisTyped", "multiIndexToLinear", "indices", "shape", "linearIdx", "stride", "i", "outerIndexToMultiIndex", "outerIdx", "axis", "axisIdx", "ndim", "outputShape", "_", "remaining", "sum", "storage", "axis", "keepdims", "dtype", "shape", "ndim", "size", "data", "isBigIntDType", "typedData", "total", "i", "normalizedAxis", "outputShape", "_", "result", "ArrayStorage", "resultData", "axisSize", "outerSize", "a", "b", "resultTyped", "outerIdx", "sumVal", "axisIdx", "inputIndices", "outerIndexToMultiIndex", "linearIdx", "multiIndexToLinear", "keepdimsShape", "mean", "sumResult", "divisor", "resultDtype", "sumData", "sumTyped", "max", "maxVal", "firstIndices", "firstIdx", "val", "prod", "product", "prodVal", "min", "minVal", "argmin", "minIdx", "minAxisIdx", "argmax", "maxIdx", "maxAxisIdx", "variance", "ddof", "meanResult", "meanVal", "sumSqDiff", "diff", "meanArray", "meanData", "std", "varResult", "varData", "all", "allTrue", "any", "anyTrue", "cumsum", "strides", "stride", "totalSize", "axisStride", "cumprod", "ptp", "maxResult", "minResult", "maxStorage", "minStorage", "maxData", "minData", "median", "quantile", "percentile", "q", "values", "n", "idx", "lower", "upper", "frac", "average", "weights", "sumWeightedValues", "sumWeights", "weightData", "w", "nansum", "nanprod", "nanmean", "count", "nanvar", "sumSq", "nanstd", "varStorage", "nanmin", "nanmax", "nanargmin", "nanargmax", "nancumsum", "nancumprod", "nanmedian", "mid", "reshape", "storage", "newShape", "size", "dtype", "negIndex", "finalShape", "knownSize", "acc", "dim", "i", "inferredDim", "a", "b", "data", "ArrayStorage", "computeStrides", "flatten", "Constructor", "getTypedArrayConstructor", "newData", "isBigInt", "isBigIntDType", "value", "ravel", "transpose", "axes", "shape", "ndim", "strides", "permutation", "_", "seen", "axis", "normalizedAxis", "ax", "oldStrides", "newStrides", "squeeze", "expandDims", "insertedStride", "swapaxes", "axis1", "axis2", "normalizedAxis1", "normalizedAxis2", "moveaxis", "source", "destination", "sourceArr", "destArr", "normalizedSource", "normalized", "normalizedDest", "order", "dst", "concatenate", "storages", "first", "s", "outputShape", "totalAlongAxis", "outputSize", "outputData", "outputStrides", "offset", "axisSize", "copyToOutput", "_outputShape", "axisOffset", "sourceShape", "sourceSize", "outputOffset", "sourceData", "start", "end", "rows", "cols", "outputCols", "sourceStart", "row", "sourceRowStart", "outputRowStart", "indices", "baseOutputOffset", "outputIdx", "d", "stack", "expanded", "vstack", "prepared", "hstack", "dstack", "split", "indicesOrSections", "splitIndices", "sectionSize", "splitAtIndices", "arraySplit", "numSections", "remainder", "boundaries", "result", "sliceShape", "newOffset", "vsplit", "hsplit", "tile", "reps", "repsArr", "maxDim", "paddedShape", "paddedReps", "expandedStorage", "expandedStrides", "outputIndices", "sourceFlatIdx", "sourceIdx", "repeat", "repeats", "flatSize", "repeatsArr", "outIdx", "rep", "r", "sourceIndices", "axisPositions", "axisIdx", "baseOutIdx", "axisStride", "axisStart", "flip", "axesToFlip", "c", "sourceOffset", "rot90", "k", "axis0", "outIdx0", "outIdx1", "roll", "shift", "flatShift", "flatStorage", "shifts", "normalizedAxes", "j", "sh", "rollaxis", "normalizedStart", "dsplit", "columnStack", "resize", "storage", "newShape", "dtype", "newSize", "a", "b", "oldSize", "Constructor", "getTypedArrayConstructor", "outputData", "isBigInt", "isBigIntDType", "i", "sourceIdx", "value", "ArrayStorage", "atleast1d", "storages", "s", "reshape", "atleast2d", "atleast3d", "dgemm", "layout", "transA", "transB", "M", "N", "K", "alpha", "A", "lda", "B", "ldb", "beta", "C", "ldc", "i", "isRowMajor", "transposeA", "transposeB", "j", "sum", "k", "dot", "a", "b", "aDim", "bDim", "aVal", "bVal", "resultDtype", "promoteDTypes", "result", "ArrayStorage", "bData", "aData", "n", "matmul", "m", "lastDimA", "bSize", "resultShape", "resultSize", "acc", "dim", "temp", "resultIdx", "d", "aIdx", "aSize", "contractAxisB", "contractDimB", "bIdxBefore", "bIdxAfter", "bIdx", "secondLastDimB", "aOuterSize", "bOuterSize", "bLastDim", "contractionDim", "k2", "computeDtype", "aStrideRow", "aStrideCol", "bStrideRow", "bStrideCol", "aIsTransposed", "bIsTransposed", "trace", "rows", "cols", "diagLen", "val", "transpose", "axes", "inner", "aLastDim", "outer", "aFlat", "ravel", "bFlat", "product", "tensordot", "aAxes", "bAxes", "_", "aAxis", "bAxis", "aFreeAxes", "bFreeAxes", "ax", "contractSize", "contractedIdx", "resIdx", "resultIndices", "aFreeIndices", "bFreeIndices", "c", "contractedIndices", "aFullIdx", "bFullIdx", "diagonal", "offset", "axis1", "axis2", "shape", "ndim", "ax1", "ax2", "dim1", "dim2", "outShape", "otherDims", "otherSize", "otherIdx", "otherIndices", "srcIndices", "otherIdx2", "dstIndices", "value", "einsum", "subscripts", "operands", "arrowMatch", "inputSubscripts", "outputSubscript", "inferOutputSubscript", "operandSubscripts", "s", "indexDims", "sub", "op", "idx", "outputIndices", "allInputIndices", "sumIndices", "sub1", "sub2", "op1", "op2", "i1", "j1", "i2", "j2", "o1", "o2", "op1T", "op2T", "computeEinsumScalar", "outputShape", "outputSize", "sumSize", "outIdx", "outMultiIdx", "flatToMulti", "indexValues", "sumIdx", "opIdx", "counts", "count", "flatIdx", "kron", "aShape", "bShape", "aNdim", "bNdim", "aPadded", "bPadded", "aIndices", "aIndicesPadded", "temp2", "bIndices", "bIndicesPadded", "outIndices", "sqrt", "a", "elementwiseUnaryOp", "power", "b", "powerScalar", "elementwiseBinaryOp", "storage", "exponent", "dtype", "shape", "data", "size", "resultDtype", "result", "ArrayStorage", "resultData", "isBigIntDType", "thisTyped", "resultTyped", "i", "sin", "a", "elementwiseUnaryOp", "cos", "tan", "arcsin", "arccos", "arctan", "arctan2", "x1", "x2", "arctan2Scalar", "arctan2Array", "shape", "size", "dtype1", "dtype2", "resultDtype", "result", "ArrayStorage", "resultData", "i", "val1", "isBigIntDType", "val2", "storage", "dtype", "data", "hypot", "hypotScalar", "hypotArray", "degrees", "factor", "x", "radians", "sinh", "a", "elementwiseUnaryOp", "cosh", "tanh", "arcsinh", "arccosh", "arctanh", "broadcast_to", "storage", "targetShape", "shape", "ndim", "targetNdim", "broadcastedShape", "computeBroadcastShape", "i", "broadcastTo", "broadcast_arrays", "storages", "shapes", "s", "take", "storage", "indices", "axis", "shape", "ndim", "dtype", "flatSize", "idx", "normalizedIdx", "outputSize", "Constructor", "getTypedArrayConstructor", "outputData", "i", "value", "isBigIntDType", "ArrayStorage", "normalizedAxis", "axisSize", "outputShape", "a", "b", "outputStrides", "computeStrides", "outputIndices", "sourceIndices", "targetIdx", "sourceAxisIdx", "outIdx", "d", "put", "values", "valueArray", "original", "choose", "indexStorage", "choices", "indexShape", "numChoices", "shapes", "c", "broadcastedShape", "computeBroadcastShape", "broadcastedIndex", "broadcastTo", "broadcastedChoices", "choiceIdx", "array_equal", "equal_nan", "size", "aVal", "bVal", "aIsNaN", "bIsNaN", "take_along_axis", "indicesShape", "inputStrides", "indicesStrides", "multiIdx", "remaining", "indicesLinearIdx", "indexValue", "sourceMultiIdx", "srcLinearIdx", "put_along_axis", "valuesShape", "valuesStrides", "indicesSize", "valuesLinearIdx", "vidx", "destMultiIdx", "destLinearIdx", "putmask", "mask", "valueIdx", "compress", "condition", "inputData", "isBigInt", "trueCount", "maxLen", "axisMap", "strideAlongAxis", "elementsPerSlice", "srcOffset", "src", "dst", "j", "outerSize", "innerSize", "outer", "axisIdx", "inputAxisIdx", "baseOffset", "rem", "inner", "select", "condlist", "choicelist", "defaultValue", "allShapes", "defaultVal", "broadcastedConds", "place", "vals", "diag_indices", "n", "result", "diag_indices_from", "tril_indices", "k", "m", "cols", "rows", "colIndices", "tril_indices_from", "triu_indices", "triu_indices_from", "mask_indices", "mask_func", "maskShape", "dimensions", "gridSize", "sliceOffset", "gridIdx", "ix_", "args", "arr", "arrSize", "data", "ravel_multi_index", "multi_index", "dims", "mode", "strides", "stride", "flatIdx", "dimSize", "unravel_index", "order", "indicesArray", "totalSize", "coord", "validateIntegerDType", "dtype", "opName", "isIntegerDType", "canUseFastPath", "a", "b", "dim", "i", "bitwise_and", "bitwiseAndScalar", "bitwiseAndArraysFast", "elementwiseBinaryOp", "x", "y", "promoteDTypes", "result", "ArrayStorage", "size", "aData", "bData", "resultData", "isBigIntDType", "resultTyped", "aVal", "bVal", "aTyped", "bTyped", "storage", "scalar", "shape", "data", "thisTyped", "scalarBig", "bitwise_or", "bitwiseOrScalar", "bitwiseOrArraysFast", "bitwise_xor", "bitwiseXorScalar", "bitwiseXorArraysFast", "bitwise_not", "invert", "left_shift", "leftShiftScalar", "shiftVal", "leftShiftArraysFast", "shift", "shiftBig", "right_shift", "rightShiftScalar", "rightShiftArraysFast", "packbits", "axis", "bitorder", "ndim", "axisSize", "packedAxisSize", "outShape", "byte", "bit", "srcIdx", "val", "preAxisShape", "postAxisShape", "preAxisSize", "acc", "postAxisSize", "inputStrides", "computeStrides", "outputStrides", "pre", "post", "packedIdx", "axisIdx", "inputIdx", "preRemaining", "d", "dimSize", "coord", "postRemaining", "outputIdx", "unpackbits", "count", "unpackedAxisSize", "outIdx", "strides", "stride", "sort", "storage", "axis", "shape", "ndim", "dtype", "data", "normalizedAxis", "result", "resultData", "axisSize", "outputShape", "_", "i", "outerSize", "a", "b", "isBigIntDType", "typedData", "resultTyped", "outerIdx", "values", "axisIdx", "inputIndices", "outerIndexToMultiIndex", "linearIdx", "multiIndexToLinear", "argsort", "ArrayStorage", "lexsort", "keys", "n", "key", "indices", "k", "va", "vb", "quickselectNumbers", "arr", "kth", "left", "right", "mid", "c", "pivotIdx", "pivot", "j", "val", "valIsNaN", "pivotIsNaN", "quickselectBigInts", "quickselectNumberIndices", "quickselectBigIntIndices", "partition", "normalizedKth", "argpartition", "sort_complex", "size", "nonzero", "nonzeroIndices", "dim", "strides", "stride", "remaining", "idx", "numNonzero", "arrData", "flatnonzero", "where", "condition", "x", "y", "condShape", "xShape", "yShape", "maxNdim", "padShape", "s", "padded", "paddedCond", "paddedX", "paddedY", "resultShape", "dims", "maxDim", "d", "resultDtype", "condData", "xData", "yData", "calcStrides", "condStrides", "xStrides", "yStrides", "resultStrides", "totalSize", "condIdx", "xIdx", "yIdx", "searchsorted", "side", "valuesData", "numValues", "v", "lo", "hi", "extract", "count", "count_nonzero", "NDArray", "_NDArray", "storage", "base", "indices", "normalizedIndices", "idx", "dim", "normalized", "value", "currentDtype", "convertedValue", "isBigIntDType", "dtype", "copy", "shape", "size", "Constructor", "getTypedArrayConstructor", "newData", "oldData", "typedOldData", "i", "ArrayStorage", "other", "otherStorage", "resultStorage", "add", "subtract", "multiply", "divide", "mod", "floorDivide", "positive", "reciprocal", "sqrt", "exponent", "exponentStorage", "power", "absolute", "negative", "sign", "sin", "cos", "tan", "arcsin", "arccos", "arctan", "arctan2", "hypot", "degrees", "radians", "sinh", "cosh", "tanh", "arcsinh", "arccosh", "arctanh", "greater", "greaterEqual", "less", "lessEqual", "equal", "notEqual", "rtol", "atol", "isclose", "allclose", "bitwise_and", "bitwise_or", "bitwise_xor", "bitwise_not", "invert", "shift", "shiftStorage", "left_shift", "right_shift", "axis", "keepdims", "result", "sum", "mean", "max", "min", "prod", "argmin", "argmax", "ddof", "variance", "std", "all", "any", "cumsum", "cumprod", "ptp", "median", "q", "percentile", "quantile", "weights", "average", "nansum", "nanprod", "nanmean", "nanvar", "nanstd", "nanmin", "nanmax", "nanargmin", "nanargmax", "nancumsum", "nancumprod", "nanmedian", "sort", "argsort", "kth", "partition", "argpartition", "nonzero", "s", "v", "side", "searchsorted", "newShape", "reshape", "flatten", "ravel", "axes", "transpose", "squeeze", "expandDims", "axis1", "axis2", "swapaxes", "source", "destination", "moveaxis", "repeats", "repeat", "take", "values", "valuesStorage", "put", "matmul", "dot", "trace", "inner", "outer", "tensordot", "cbrt", "fabs", "divisor", "divisorStorage", "quotientStorage", "remainderStorage", "divmod", "square", "remainder", "x2", "x2Storage", "heaviside", "sliceStrs", "sliceSpecs", "str", "spec", "parseSlice", "normalizeSlice", "newStrides", "newOffset", "stride", "dimSize", "slicedStorage", "j", "start", "stop", "ndim", "buildNestedArray", "arr", "zeros", "DEFAULT_DTYPE", "ones", "inferShape", "data", "current", "containsBigInt", "item", "flattenKeepBigInt", "array", "hasBigInt", "a", "b", "actualDtype", "typedData", "flatData", "bigintData", "val", "boolData", "numData", "arange", "step", "actualStart", "actualStop", "length", "linspace", "num", "logspace", "geomspace", "signStart", "signStop", "logStart", "eye", "n", "m", "k", "cols", "empty", "full", "fill_value", "bigintValue", "identity", "asarray", "zeros_like", "ones_like", "empty_like", "full_like", "asanyarray", "ascontiguousarray", "asfortranarray", "diag", "row", "col", "rows", "startRow", "startCol", "diagLength", "diagflat", "flat", "fromfunction", "fn", "d", "meshgrid", "args", "arrays", "indexing", "arg", "sizes", "outputShape", "results", "inputArr", "inputSize", "broadcastShape", "reshaped", "broadcast_to", "tri", "N", "M", "tril", "outerSize", "temp", "triu", "vander", "x", "increasing", "len", "frombuffer", "buffer", "count", "offset", "arrayBuffer", "byteOffset", "bytesPerElement", "getBytesPerElement", "availableBytes", "maxElements", "numElements", "fromfile", "file", "fromiter", "iter", "fromstring", "string", "sep", "parts", "part", "trimmed", "floor_divide", "diagonal", "kron", "x1", "deg2rad", "rad2deg", "concatenate", "storages", "stack", "vstack", "hstack", "dstack", "split", "indicesOrSections", "array_split", "arraySplit", "vsplit", "hsplit", "tile", "reps", "expand_dims", "flip", "fliplr", "flipud", "rot90", "roll", "rollaxis", "atleast_1d", "atleast1d", "atleast_2d", "atleast2d", "atleast_3d", "atleast3d", "dsplit", "ary", "indices_or_sections", "column_stack", "columnStack", "row_stack", "resize", "new_shape", "append", "valArray", "flatArr", "flatValues", "delete_", "obj", "keepIndices", "normalizedAxis", "axisSize", "keepRanges", "rangeStart", "rangeEnd", "slices", "insert", "before", "after", "pad", "pad_width", "mode", "constant_values", "padWidths", "newSize", "outputData", "isBigInt", "outputIndices", "inOriginal", "sourceIndices", "padBefore", "srcIdx", "mappedIndices", "broadcast_arrays", "broadcast_shapes", "shapes", "broadcastShapes", "choose", "choices", "choiceStorages", "c", "array_equal", "equal_nan", "array_equiv", "a1", "a2", "arrayEquiv", "weightsStorage", "y", "packbits", "bitorder", "unpackbits", "einsum", "subscripts", "operands", "op", "take_along_axis", "put_along_axis", "putmask", "mask", "valuesArg", "compress", "condition", "select", "condlist", "choicelist", "defaultVal", "condStorages", "place", "vals", "diag_indices", "diag_indices_from", "tril_indices", "tril_indices_from", "triu_indices", "triu_indices_from", "mask_indices", "mask_func", "dimensions", "ix_", "ravel_multi_index", "multi_index", "dims", "unravel_index", "order", "indicesArg", "lexsort", "keys", "sort_complex", "flatnonzero", "where", "extract", "count_nonzero", "NPY_MAGIC", "SUPPORTED_DTYPES", "isSystemLittleEndian", "buffer", "DESCR_TO_DTYPE", "DTYPE_TO_DESCR", "UNSUPPORTED_DTYPE_PATTERNS", "parseDescriptor", "descr", "UnsupportedDTypeError", "endian", "typeAndSize", "typeChar", "dtype", "isLittleEndian", "dataIsLittleEndian", "dataIsBigEndian", "itemsize", "needsByteSwap", "message", "InvalidNpyError", "parseNpy", "buffer", "bytes", "metadata", "parseNpyHeader", "parseNpyData", "InvalidNpyError", "i", "NPY_MAGIC", "major", "minor", "headerLen", "headerStart", "headerEnd", "headerBytes", "headerStr", "header", "parseHeaderDict", "dataOffset", "dtype", "needsByteSwap", "itemsize", "parseDescriptor", "numElements", "a", "b", "expectedBytes", "actualBytes", "dataBuffer", "typedData", "createTypedArray", "shape", "storage", "reversedShape", "tempStorage", "ArrayStorage", "transposeStorage", "NDArray", "descrMatch", "fortranMatch", "shapeMatch", "descr", "fortran_order", "shapeStr", "s", "n", "Constructor", "getTypedArrayConstructor", "swapped", "start", "j", "ndim", "size", "newData", "newShape", "oldStrides", "computeStrides", "newStrides", "indices", "linearIdx", "remaining", "dimSize", "newLinearIdx", "isBigIntDType", "strides", "stride", "serializeNpy", "arr", "shape", "dtype", "descr", "DTYPE_TO_DESCR", "shapeStr", "headerDict", "PREFIX_LEN", "padding", "headerBytes", "headerLen", "numElements", "itemsize", "getDTypeSize", "dataSize", "totalSize", "output", "NPY_MAGIC", "dataOffset", "writeArrayData", "size", "isLittleEndian", "isSystemLittleEndian", "isBigInt", "isBigIntDType", "storage", "srcData", "srcBytes", "dataView", "i", "value", "offset", "writeBigInt64LE", "writeNumberLE", "view", "unsigned", "CRC32_TABLE", "table", "i", "c", "j", "crc32", "data", "crc", "readZip", "buffer", "entries", "parseZipEntries", "result", "entry", "data", "decompressEntry", "readZipSync", "bytes", "view", "eocdOffset", "i", "centralDirOffset", "numEntries", "centralEntries", "cdOffset", "compressionMethod", "crc32", "compressedSize", "uncompressedSize", "fileNameLength", "extraFieldLength", "commentLength", "localHeaderOffset", "fileNameBytes", "fileName", "ce", "localOffset", "dataStart", "compressedData", "inflateRaw", "ds", "dataCopy", "writer", "reader", "chunks", "done", "value", "totalLength", "sum", "chunk", "offset", "parseNpz", "buffer", "options", "force", "files", "readZip", "parseNpzFromFiles", "parseNpzSync", "readZipSync", "arrays", "skipped", "errors", "fileName", "data", "name", "arr", "parseNpy", "error", "UnsupportedDTypeError", "loadNpz", "result", "loadNpzSync", "writeZip", "files", "options", "compress", "entries", "name", "data", "crc", "crc32", "compressedData", "compressionMethod", "deflateRaw", "localHeadersSize", "entry", "nameBytes", "centralDirSize", "totalSize", "output", "view", "offset", "writeLocalHeader", "centralDirOffset", "writeCentralHeader", "writeEndOfCentralDirectory", "writeZipSync", "numEntries", "cs", "dataCopy", "writer", "reader", "chunks", "done", "value", "totalLength", "sum", "chunk", "result", "serializeNpz", "arrays", "options", "files", "prepareNpzFiles", "writeZip", "serializeNpzSync", "writeZipSync", "i", "arr", "npyData", "serializeNpy", "entries", "name", "fileName", "__version__"]
3
+ "sources": ["../src/index.ts", "../src/core/slicing.ts", "../src/core/dtype.ts", "../src/core/storage.ts", "../src/internal/compute.ts", "../src/ops/arithmetic.ts", "../src/core/broadcasting.ts", "../src/ops/comparison.ts", "../src/internal/indexing.ts", "../src/ops/reduction.ts", "../src/ops/shape.ts", "../src/ops/linalg.ts", "../src/ops/exponential.ts", "../src/ops/trig.ts", "../src/ops/hyperbolic.ts", "../src/ops/advanced.ts", "../src/ops/bitwise.ts", "../src/ops/sorting.ts", "../src/ops/rounding.ts", "../src/ops/sets.ts", "../src/ops/gradient.ts", "../src/core/ndarray.ts", "../src/io/npy/format.ts", "../src/io/npy/parser.ts", "../src/io/npy/serializer.ts", "../src/io/zip/types.ts", "../src/io/zip/reader.ts", "../src/io/npz/parser.ts", "../src/io/zip/writer.ts", "../src/io/npz/serializer.ts"],
4
+ "sourcesContent": ["/**\n * numpy-ts - Complete NumPy implementation for TypeScript and JavaScript\n *\n * @module numpy-ts\n */\n\n// Core array functions\nexport {\n NDArray,\n zeros,\n ones,\n array,\n arange,\n linspace,\n logspace,\n geomspace,\n eye,\n empty,\n full,\n identity,\n asarray,\n copy,\n zeros_like,\n ones_like,\n empty_like,\n full_like,\n // New array creation functions\n asanyarray,\n ascontiguousarray,\n asfortranarray,\n diag,\n diagflat,\n frombuffer,\n fromfile,\n fromfunction,\n fromiter,\n fromstring,\n meshgrid,\n tri,\n tril,\n triu,\n vander,\n // Math functions\n sqrt,\n power,\n // Exponential functions\n exp,\n exp2,\n expm1,\n log,\n log2,\n log10,\n log1p,\n logaddexp,\n logaddexp2,\n absolute,\n negative,\n sign,\n mod,\n floor_divide,\n positive,\n reciprocal,\n cbrt,\n fabs,\n divmod,\n square,\n remainder,\n heaviside,\n dot,\n trace,\n diagonal,\n kron,\n transpose,\n inner,\n outer,\n tensordot,\n einsum,\n // Linear algebra module (numpy.linalg)\n linalg,\n // Trigonometric functions\n sin,\n cos,\n tan,\n arcsin,\n arccos,\n arctan,\n arctan2,\n hypot,\n degrees,\n radians,\n deg2rad,\n rad2deg,\n // Hyperbolic functions\n sinh,\n cosh,\n tanh,\n arcsinh,\n arccosh,\n arctanh,\n // Array manipulation\n swapaxes,\n moveaxis,\n concatenate,\n stack,\n vstack,\n hstack,\n dstack,\n split,\n array_split,\n vsplit,\n hsplit,\n tile,\n repeat,\n // New array manipulation functions\n ravel,\n reshape,\n squeeze,\n expand_dims,\n flip,\n fliplr,\n flipud,\n rot90,\n roll,\n rollaxis,\n atleast_1d,\n atleast_2d,\n atleast_3d,\n dsplit,\n column_stack,\n row_stack,\n resize,\n append,\n delete_ as delete,\n insert,\n pad,\n // Advanced\n broadcast_to,\n broadcast_arrays,\n broadcast_shapes,\n take,\n put,\n choose,\n array_equal,\n array_equiv,\n // Indexing functions\n take_along_axis,\n put_along_axis,\n putmask,\n compress,\n select,\n place,\n diag_indices,\n diag_indices_from,\n tril_indices,\n tril_indices_from,\n triu_indices,\n triu_indices_from,\n mask_indices,\n indices,\n ix_,\n ravel_multi_index,\n unravel_index,\n // Reduction functions\n cumsum,\n cumprod,\n ptp,\n median,\n percentile,\n quantile,\n average,\n // NaN-aware reduction functions\n nansum,\n nanprod,\n nanmean,\n nanvar,\n nanstd,\n nanmin,\n nanmax,\n nanargmin,\n nanargmax,\n nancumsum,\n nancumprod,\n nanmedian,\n // Bitwise functions\n bitwise_and,\n bitwise_or,\n bitwise_xor,\n bitwise_not,\n invert,\n left_shift,\n right_shift,\n packbits,\n unpackbits,\n // Sorting functions\n sort,\n argsort,\n lexsort,\n partition,\n argpartition,\n sort_complex,\n // Searching functions\n nonzero,\n flatnonzero,\n where,\n searchsorted,\n extract,\n count_nonzero,\n // Rounding functions\n around,\n ceil,\n fix,\n floor,\n rint,\n round,\n trunc,\n // Set operations\n unique,\n in1d,\n intersect1d,\n isin,\n setdiff1d,\n setxor1d,\n union1d,\n // Gradient functions\n diff,\n ediff1d,\n gradient,\n cross,\n} from './core/ndarray';\n\n// IO functions (environment-agnostic parsing/serialization)\n// These work with bytes (ArrayBuffer/Uint8Array), not files\nexport {\n // NPY format\n parseNpy,\n serializeNpy,\n parseNpyHeader,\n parseNpyData,\n UnsupportedDTypeError,\n InvalidNpyError,\n SUPPORTED_DTYPES,\n DTYPE_TO_DESCR,\n type NpyHeader,\n type NpyMetadata,\n type NpyVersion,\n // NPZ format\n parseNpz,\n parseNpzSync,\n loadNpz,\n loadNpzSync,\n serializeNpz,\n serializeNpzSync,\n type NpzParseOptions,\n type NpzParseResult,\n type NpzSerializeOptions,\n} from './io';\n\n// Version (replaced at build time from package.json)\n// In development/tests, use package.json directly; in production, use the replaced value\ndeclare const __VERSION_PLACEHOLDER__: string;\nexport const __version__ =\n typeof __VERSION_PLACEHOLDER__ !== 'undefined' ? __VERSION_PLACEHOLDER__ : '0.9.0'; // Fallback for development/tests\n", "/**\n * Slicing utilities for NumPy-compatible array indexing\n *\n * Supports Python-style slice syntax via strings: \"0:5\", \":\", \"::2\", \"-1\"\n */\n\n/**\n * Represents a parsed slice specification\n */\nexport interface SliceSpec {\n start: number | null;\n stop: number | null;\n step: number;\n isIndex: boolean; // true if this is a single index, not a slice\n}\n\n/**\n * Parse a slice string into a SliceSpec\n *\n * Supports:\n * - Single index: \"5\", \"-1\"\n * - Full slice: \"0:5\", \"2:8\"\n * - With step: \"0:10:2\", \"::2\"\n * - Partial: \"5:\", \":10\", \":\"\n * - Negative: \"-5:\", \":-2\", \"::-1\"\n *\n * @param sliceStr - String representation of slice (e.g., \"0:5\", \":\", \"::2\")\n * @returns Parsed slice specification\n *\n * @example\n * ```typescript\n * parseSlice(\"0:5\") // {start: 0, stop: 5, step: 1, isIndex: false}\n * parseSlice(\":\") // {start: null, stop: null, step: 1, isIndex: false}\n * parseSlice(\"::2\") // {start: null, stop: null, step: 2, isIndex: false}\n * parseSlice(\"-1\") // {start: -1, stop: null, step: 1, isIndex: true}\n * parseSlice(\"5\") // {start: 5, stop: null, step: 1, isIndex: true}\n * ```\n */\nexport function parseSlice(sliceStr: string): SliceSpec {\n // Check if it's a single index (no colons)\n if (!sliceStr.includes(':')) {\n // Reject decimal points - indices must be integers\n if (sliceStr.includes('.')) {\n throw new Error(`Invalid slice index: \"${sliceStr}\" (must be integer)`);\n }\n const index = parseInt(sliceStr, 10);\n if (isNaN(index)) {\n throw new Error(`Invalid slice index: \"${sliceStr}\"`);\n }\n return {\n start: index,\n stop: null,\n step: 1,\n isIndex: true,\n };\n }\n\n // Parse slice notation: start:stop:step\n const parts = sliceStr.split(':');\n\n if (parts.length > 3) {\n throw new Error(`Invalid slice notation: \"${sliceStr}\" (too many colons)`);\n }\n\n const start = parts[0] === '' ? null : parseInt(parts[0]!, 10);\n const stop = parts[1] === '' || parts[1] === undefined ? null : parseInt(parts[1], 10);\n const step = parts[2] === '' || parts[2] === undefined ? 1 : parseInt(parts[2], 10);\n\n // Validate parsed values\n if (start !== null && isNaN(start)) {\n throw new Error(`Invalid start index in slice: \"${sliceStr}\"`);\n }\n if (stop !== null && isNaN(stop)) {\n throw new Error(`Invalid stop index in slice: \"${sliceStr}\"`);\n }\n if (isNaN(step)) {\n throw new Error(`Invalid step in slice: \"${sliceStr}\"`);\n }\n if (step === 0) {\n throw new Error(`Slice step cannot be zero`);\n }\n\n return {\n start,\n stop,\n step,\n isIndex: false,\n };\n}\n\n/**\n * Normalize a slice specification to absolute indices\n *\n * Handles negative indices and defaults:\n * - Negative indices count from the end\n * - null start becomes 0 (or size-1 for negative step)\n * - null stop becomes size (or -1 for negative step)\n *\n * @param spec - Parsed slice specification\n * @param size - Size of the dimension being sliced\n * @returns Normalized slice with absolute start, stop, step\n *\n * @example\n * ```typescript\n * normalizeSlice({start: -1, stop: null, step: 1, isIndex: true}, 10)\n * // {start: 9, stop: 10, step: 1, isIndex: true}\n *\n * normalizeSlice({start: null, stop: -2, step: 1, isIndex: false}, 10)\n * // {start: 0, stop: 8, step: 1, isIndex: false}\n * ```\n */\nexport function normalizeSlice(\n spec: SliceSpec,\n size: number\n): { start: number; stop: number; step: number; isIndex: boolean } {\n let { start, stop } = spec;\n const { step, isIndex } = spec;\n\n // For single index, normalize and return\n if (isIndex) {\n if (start === null) {\n throw new Error('Index cannot be null');\n }\n const normalizedStart = start < 0 ? size + start : start;\n if (normalizedStart < 0 || normalizedStart >= size) {\n throw new Error(`Index ${start} is out of bounds for size ${size}`);\n }\n return {\n start: normalizedStart,\n stop: normalizedStart + 1,\n step: 1,\n isIndex: true,\n };\n }\n\n // Handle slice defaults based on step direction\n if (step > 0) {\n // Forward slice\n if (start === null) start = 0;\n if (stop === null) stop = size;\n } else {\n // Backward slice\n if (start === null) start = size - 1;\n if (stop === null) stop = -size - 1; // Will be normalized to before start\n }\n\n // Normalize negative indices\n if (start < 0) start = size + start;\n if (stop < 0) stop = size + stop;\n\n // Clamp to valid range\n start = Math.max(0, Math.min(start, size));\n stop = Math.max(-1, Math.min(stop, size)); // -1 allowed for backward slices\n\n return {\n start,\n stop,\n step,\n isIndex: false,\n };\n}\n\n/**\n * Compute the length of a slice result\n *\n * @param start - Normalized start index\n * @param stop - Normalized stop index\n * @param step - Step value\n * @returns Number of elements in the slice\n */\nexport function computeSliceLength(start: number, stop: number, step: number): number {\n if (step > 0) {\n if (start >= stop) return 0;\n return Math.ceil((stop - start) / step);\n } else {\n if (start <= stop) return 0;\n return Math.ceil((start - stop) / -step);\n }\n}\n\n/**\n * Parse multiple slice specifications for multi-dimensional indexing\n *\n * @param sliceStrs - Array of slice strings, one per dimension\n * @returns Array of parsed slice specifications\n *\n * @example\n * ```typescript\n * parseSlices([\"0:5\", \":\", \"::2\"])\n * // [\n * // {start: 0, stop: 5, step: 1, isIndex: false},\n * // {start: null, stop: null, step: 1, isIndex: false},\n * // {start: null, stop: null, step: 2, isIndex: false}\n * // ]\n * ```\n */\nexport function parseSlices(sliceStrs: string[]): SliceSpec[] {\n return sliceStrs.map((s) => parseSlice(s));\n}\n", "/**\n * DType (Data Type) system for numpy-ts\n *\n * Supports NumPy numeric types:\n * - Floating point: float32, float64\n * - Signed integers: int8, int16, int32, int64\n * - Unsigned integers: uint8, uint16, uint32, uint64\n * - Boolean: bool\n */\n\n/**\n * All supported dtypes\n */\nexport type DType =\n | 'float64'\n | 'float32'\n | 'int64'\n | 'int32'\n | 'int16'\n | 'int8'\n | 'uint64'\n | 'uint32'\n | 'uint16'\n | 'uint8'\n | 'bool';\n\n/**\n * TypedArray types for each dtype\n */\nexport type TypedArray =\n | Float64Array\n | Float32Array\n | BigInt64Array\n | Int32Array\n | Int16Array\n | Int8Array\n | BigUint64Array\n | Uint32Array\n | Uint16Array\n | Uint8Array;\n\n/**\n * Default dtype (matches NumPy)\n */\nexport const DEFAULT_DTYPE: DType = 'float64';\n\n/**\n * Get the TypedArray constructor for a given dtype\n */\nexport function getTypedArrayConstructor(dtype: DType): TypedArrayConstructor | null {\n switch (dtype) {\n case 'float64':\n return Float64Array;\n case 'float32':\n return Float32Array;\n case 'int64':\n return BigInt64Array;\n case 'int32':\n return Int32Array;\n case 'int16':\n return Int16Array;\n case 'int8':\n return Int8Array;\n case 'uint64':\n return BigUint64Array;\n case 'uint32':\n return Uint32Array;\n case 'uint16':\n return Uint16Array;\n case 'uint8':\n return Uint8Array;\n case 'bool':\n return Uint8Array; // bool is stored as uint8\n default:\n throw new Error(`Unknown dtype: ${dtype}`);\n }\n}\n\ntype TypedArrayConstructor =\n | Float64ArrayConstructor\n | Float32ArrayConstructor\n | BigInt64ArrayConstructor\n | Int32ArrayConstructor\n | Int16ArrayConstructor\n | Int8ArrayConstructor\n | BigUint64ArrayConstructor\n | Uint32ArrayConstructor\n | Uint16ArrayConstructor\n | Uint8ArrayConstructor;\n\n/**\n * Get the element size in bytes for a given dtype\n */\nexport function getDTypeSize(dtype: DType): number {\n switch (dtype) {\n case 'float64':\n case 'int64':\n case 'uint64':\n return 8;\n case 'float32':\n case 'int32':\n case 'uint32':\n return 4;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int8':\n case 'uint8':\n case 'bool':\n return 1;\n default:\n throw new Error(`Unknown dtype: ${dtype}`);\n }\n}\n\n/**\n * Check if dtype is integer\n */\nexport function isIntegerDType(dtype: DType): boolean {\n return (\n dtype === 'int64' ||\n dtype === 'int32' ||\n dtype === 'int16' ||\n dtype === 'int8' ||\n dtype === 'uint64' ||\n dtype === 'uint32' ||\n dtype === 'uint16' ||\n dtype === 'uint8'\n );\n}\n\n/**\n * Check if dtype is floating point\n */\nexport function isFloatDType(dtype: DType): boolean {\n return dtype === 'float64' || dtype === 'float32';\n}\n\n/**\n * Check if dtype uses BigInt\n */\nexport function isBigIntDType(dtype: DType): boolean {\n return dtype === 'int64' || dtype === 'uint64';\n}\n\n/**\n * Infer dtype from JavaScript value\n */\nexport function inferDType(value: unknown): DType {\n if (typeof value === 'bigint') {\n return 'int64';\n } else if (typeof value === 'number') {\n // Check if integer\n if (Number.isInteger(value)) {\n // Choose appropriate integer type based on range\n if (value >= 0 && value <= 255) return 'uint8';\n if (value >= -128 && value <= 127) return 'int8';\n if (value >= 0 && value <= 65535) return 'uint16';\n if (value >= -32768 && value <= 32767) return 'int16';\n if (value >= 0 && value <= 4294967295) return 'uint32';\n if (value >= -2147483648 && value <= 2147483647) return 'int32';\n return 'float64'; // Fallback for large integers\n }\n return 'float64';\n } else if (typeof value === 'boolean') {\n return 'bool';\n }\n return DEFAULT_DTYPE;\n}\n\n/**\n * Promote two dtypes to a common dtype\n * Follows NumPy's type promotion rules\n */\nexport function promoteDTypes(dtype1: DType, dtype2: DType): DType {\n // Same dtype\n if (dtype1 === dtype2) return dtype1;\n\n // Boolean - promote to the other type\n if (dtype1 === 'bool') return dtype2;\n if (dtype2 === 'bool') return dtype1;\n\n // Float types - integer + float always promotes to float\n if (isFloatDType(dtype1) || isFloatDType(dtype2)) {\n // NumPy behavior: Promote to the float type\n // float64 always wins\n if (dtype1 === 'float64' || dtype2 === 'float64') return 'float64';\n\n // float32 with small integers (8, 16 bit) \u2192 float32\n // float32 with large integers (32, 64 bit) \u2192 float64 (precision safety)\n // This is because float32 has 24-bit mantissa, can't hold all int32 values\n if (dtype1 === 'float32') {\n const intDtype = dtype2;\n if (\n intDtype === 'int32' ||\n intDtype === 'int64' ||\n intDtype === 'uint32' ||\n intDtype === 'uint64'\n ) {\n return 'float64';\n }\n return 'float32';\n }\n if (dtype2 === 'float32') {\n const intDtype = dtype1;\n if (\n intDtype === 'int32' ||\n intDtype === 'int64' ||\n intDtype === 'uint32' ||\n intDtype === 'uint64'\n ) {\n return 'float64';\n }\n return 'float32';\n }\n\n // Both are float32\n return 'float32';\n }\n\n // Integer types - complex promotion rules\n const isSigned1 = dtype1.startsWith('int');\n const isSigned2 = dtype2.startsWith('int');\n const isUnsigned1 = dtype1.startsWith('uint');\n const isUnsigned2 = dtype2.startsWith('uint');\n\n // Get bit sizes\n const getSize = (dtype: DType): number => {\n if (dtype.includes('64')) return 64;\n if (dtype.includes('32')) return 32;\n if (dtype.includes('16')) return 16;\n if (dtype.includes('8')) return 8;\n return 0;\n };\n\n const size1 = getSize(dtype1);\n const size2 = getSize(dtype2);\n\n // Special case: int64 + uint64 \u2192 float64 (no larger int type available)\n if ((dtype1 === 'int64' && dtype2 === 'uint64') || (dtype1 === 'uint64' && dtype2 === 'int64')) {\n return 'float64';\n }\n\n // Mixing signed and unsigned of the same size: promote to larger signed type\n if (isSigned1 && isUnsigned2 && size1 === size2) {\n if (size1 === 8) return 'int16';\n if (size1 === 16) return 'int32';\n if (size1 === 32) return 'int64';\n }\n if (isUnsigned1 && isSigned2 && size1 === size2) {\n if (size2 === 8) return 'int16';\n if (size2 === 16) return 'int32';\n if (size2 === 32) return 'int64';\n }\n\n // Same signedness: promote to larger size\n if ((isSigned1 && isSigned2) || (isUnsigned1 && isUnsigned2)) {\n const maxSize = Math.max(size1, size2);\n if (isSigned1) {\n if (maxSize === 64) return 'int64';\n if (maxSize === 32) return 'int32';\n if (maxSize === 16) return 'int16';\n return 'int8';\n } else {\n if (maxSize === 64) return 'uint64';\n if (maxSize === 32) return 'uint32';\n if (maxSize === 16) return 'uint16';\n return 'uint8';\n }\n }\n\n // Different signedness, different sizes: promote to type that can hold both\n // NumPy behavior: If signed type is larger, use it; otherwise promote conservatively\n\n // If signed int is larger than unsigned int, signed int can hold unsigned\n if (isSigned1 && isUnsigned2) {\n if (size1 > size2) {\n // e.g., int16 + uint8 \u2192 int16, int32 + uint16 \u2192 int32\n return dtype1;\n }\n // Otherwise need larger signed type\n // e.g., int8 + uint16 \u2192 int32\n if (size2 === 8) return 'int16';\n if (size2 === 16) return 'int32';\n if (size2 === 32) return 'int64';\n return 'float64'; // uint64 with smaller signed \u2192 float64\n }\n\n if (isUnsigned1 && isSigned2) {\n if (size2 > size1) {\n // e.g., uint8 + int16 \u2192 int16, uint16 + int32 \u2192 int32\n return dtype2;\n }\n // Otherwise need larger signed type\n // e.g., uint16 + int8 \u2192 int32\n if (size1 === 8) return 'int16';\n if (size1 === 16) return 'int32';\n if (size1 === 32) return 'int64';\n return 'float64'; // uint64 with smaller signed \u2192 float64\n }\n\n // Fallback (shouldn't reach here if logic above is complete)\n return 'float64';\n}\n\n/**\n * Validate dtype string\n */\nexport function isValidDType(dtype: string): dtype is DType {\n const validDTypes: DType[] = [\n 'float64',\n 'float32',\n 'int64',\n 'int32',\n 'int16',\n 'int8',\n 'uint64',\n 'uint32',\n 'uint16',\n 'uint8',\n 'bool',\n ];\n return validDTypes.includes(dtype as DType);\n}\n\n/**\n * Convert value to the appropriate type for the given dtype\n */\nexport function castValue(value: number | bigint | boolean, dtype: DType): number | bigint {\n if (isBigIntDType(dtype)) {\n return BigInt(value as number | bigint);\n }\n if (dtype === 'bool') {\n return value ? 1 : 0;\n }\n return Number(value);\n}\n\n/**\n * Map our dtype to @stdlib's supported dtype\n * @stdlib doesn't support int64, uint64 natively, but does support bool\n */\nexport function toStdlibDType(dtype: DType): string {\n // Map int64/uint64 to generic (we manage the BigInt arrays ourselves)\n if (dtype === 'int64' || dtype === 'uint64') {\n return 'generic';\n }\n // All other dtypes (including bool) are supported by stdlib\n return dtype;\n}\n", "/**\n * ArrayStorage - Internal storage abstraction\n *\n * Stores array data directly using TypedArrays without external dependencies.\n *\n * @internal - This is not part of the public API\n */\n\nimport {\n type DType,\n type TypedArray,\n DEFAULT_DTYPE,\n getTypedArrayConstructor,\n isBigIntDType,\n} from './dtype';\n\n/**\n * Internal storage for NDArray data\n * Manages the underlying TypedArray and metadata\n */\nexport class ArrayStorage {\n // Underlying TypedArray data buffer\n private _data: TypedArray;\n // Array shape\n private _shape: readonly number[];\n // Strides for each dimension\n private _strides: readonly number[];\n // Offset into the data buffer\n private _offset: number;\n // Data type\n private _dtype: DType;\n\n constructor(\n data: TypedArray,\n shape: readonly number[],\n strides: readonly number[],\n offset: number,\n dtype: DType\n ) {\n this._data = data;\n this._shape = shape;\n this._strides = strides;\n this._offset = offset;\n this._dtype = dtype;\n }\n\n /**\n * Shape of the array\n */\n get shape(): readonly number[] {\n return this._shape;\n }\n\n /**\n * Number of dimensions\n */\n get ndim(): number {\n return this._shape.length;\n }\n\n /**\n * Total number of elements\n */\n get size(): number {\n return this._shape.reduce((a, b) => a * b, 1);\n }\n\n /**\n * Data type\n */\n get dtype(): DType {\n return this._dtype;\n }\n\n /**\n * Underlying data buffer\n */\n get data(): TypedArray {\n return this._data;\n }\n\n /**\n * Strides (steps in each dimension)\n */\n get strides(): readonly number[] {\n return this._strides;\n }\n\n /**\n * Offset into the data buffer\n */\n get offset(): number {\n return this._offset;\n }\n\n /**\n * Check if array is C-contiguous (row-major, no gaps)\n */\n get isCContiguous(): boolean {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) return true;\n if (ndim === 1) return strides[0] === 1;\n\n // Check if strides match row-major order\n let expectedStride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n if (strides[i] !== expectedStride) return false;\n expectedStride *= shape[i]!;\n }\n return true;\n }\n\n /**\n * Check if array is F-contiguous (column-major, no gaps)\n */\n get isFContiguous(): boolean {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) return true;\n if (ndim === 1) return strides[0] === 1;\n\n // Check if strides match column-major order\n let expectedStride = 1;\n for (let i = 0; i < ndim; i++) {\n if (strides[i] !== expectedStride) return false;\n expectedStride *= shape[i]!;\n }\n return true;\n }\n\n /**\n * Get element at linear index (respects strides and offset)\n */\n iget(linearIndex: number): number | bigint {\n // Convert linear index to multi-index, then to actual buffer position\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) {\n return this._data[this._offset]!;\n }\n\n // Convert linear index to multi-index in row-major order\n let remaining = linearIndex;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < ndim; i++) {\n // Compute size of remaining dimensions\n let dimSize = 1;\n for (let j = i + 1; j < ndim; j++) {\n dimSize *= shape[j]!;\n }\n const idx = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n bufferIndex += idx * strides[i]!;\n }\n\n return this._data[bufferIndex]!;\n }\n\n /**\n * Set element at linear index (respects strides and offset)\n */\n iset(linearIndex: number, value: number | bigint): void {\n const shape = this._shape;\n const strides = this._strides;\n const ndim = shape.length;\n\n if (ndim === 0) {\n (this._data as unknown as (number | bigint)[])[this._offset] = value;\n return;\n }\n\n let remaining = linearIndex;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < ndim; i++) {\n let dimSize = 1;\n for (let j = i + 1; j < ndim; j++) {\n dimSize *= shape[j]!;\n }\n const idx = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n bufferIndex += idx * strides[i]!;\n }\n\n (this._data as unknown as (number | bigint)[])[bufferIndex] = value;\n }\n\n /**\n * Get element at multi-index position\n */\n get(...indices: number[]): number | bigint {\n const strides = this._strides;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < indices.length; i++) {\n bufferIndex += indices[i]! * strides[i]!;\n }\n\n return this._data[bufferIndex]!;\n }\n\n /**\n * Set element at multi-index position\n */\n set(indices: number[], value: number | bigint): void {\n const strides = this._strides;\n let bufferIndex = this._offset;\n\n for (let i = 0; i < indices.length; i++) {\n bufferIndex += indices[i]! * strides[i]!;\n }\n\n (this._data as unknown as (number | bigint)[])[bufferIndex] = value;\n }\n\n /**\n * Create a deep copy of this storage\n */\n copy(): ArrayStorage {\n const shape = Array.from(this._shape);\n const dtype = this._dtype;\n const size = this.size;\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot copy array with dtype ${dtype}`);\n }\n\n // Create new data buffer and copy\n const newData = new Constructor(size);\n\n if (this.isCContiguous && this._offset === 0) {\n // Fast path: direct copy\n if (isBigIntDType(dtype)) {\n const src = this._data as BigInt64Array | BigUint64Array;\n const dst = newData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n dst[i] = src[i]!;\n }\n } else {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>).set(\n this._data as Exclude<TypedArray, BigInt64Array | BigUint64Array>\n );\n }\n } else {\n // Slow path: respect strides\n if (isBigIntDType(dtype)) {\n const dst = newData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n dst[i] = this.iget(i) as bigint;\n }\n } else {\n for (let i = 0; i < size; i++) {\n newData[i] = this.iget(i) as number;\n }\n }\n }\n\n return new ArrayStorage(newData, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Create storage from TypedArray data\n */\n static fromData(\n data: TypedArray,\n shape: number[],\n dtype: DType,\n strides?: number[],\n offset?: number\n ): ArrayStorage {\n const finalStrides = strides ?? ArrayStorage._computeStrides(shape);\n const finalOffset = offset ?? 0;\n return new ArrayStorage(data, shape, finalStrides, finalOffset, dtype);\n }\n\n /**\n * Create storage with zeros\n */\n static zeros(shape: number[], dtype: DType = DEFAULT_DTYPE): ArrayStorage {\n const size = shape.reduce((a, b) => a * b, 1);\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n\n const data = new Constructor(size);\n\n return new ArrayStorage(data, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Create storage with ones\n */\n static ones(shape: number[], dtype: DType = DEFAULT_DTYPE): ArrayStorage {\n const size = shape.reduce((a, b) => a * b, 1);\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n\n const data = new Constructor(size);\n\n // Fill with ones using native fill (much faster than loop)\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array).fill(BigInt(1));\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(1);\n }\n\n return new ArrayStorage(data, shape, ArrayStorage._computeStrides(shape), 0, dtype);\n }\n\n /**\n * Compute strides for row-major (C-order) layout\n * @private\n */\n private static _computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n }\n}\n\n/**\n * Compute strides for a given shape (row-major order)\n * @internal\n */\nexport function computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * Computation backend abstraction\n *\n * Internal module for element-wise and broadcast operations.\n * Provides a swappable backend for different computation strategies.\n *\n * @internal\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { promoteDTypes, isBigIntDType } from '../core/dtype';\n\n/**\n * Compute the broadcast shape of two arrays\n * Returns the shape that results from broadcasting a and b together\n * Throws if shapes are not compatible for broadcasting\n */\nexport function broadcastShapes(shapeA: readonly number[], shapeB: readonly number[]): number[] {\n const ndimA = shapeA.length;\n const ndimB = shapeB.length;\n const ndim = Math.max(ndimA, ndimB);\n const result = new Array(ndim);\n\n for (let i = 0; i < ndim; i++) {\n const dimA = i < ndim - ndimA ? 1 : shapeA[i - (ndim - ndimA)]!;\n const dimB = i < ndim - ndimB ? 1 : shapeB[i - (ndim - ndimB)]!;\n\n if (dimA === dimB) {\n result[i] = dimA;\n } else if (dimA === 1) {\n result[i] = dimB;\n } else if (dimB === 1) {\n result[i] = dimA;\n } else {\n throw new Error(\n `operands could not be broadcast together with shapes ${JSON.stringify(Array.from(shapeA))} ${JSON.stringify(Array.from(shapeB))}`\n );\n }\n }\n\n return result;\n}\n\n/**\n * Compute the strides for broadcasting an array to a target shape\n * Returns strides where dimensions that need broadcasting have stride 0\n */\nfunction broadcastStrides(\n shape: readonly number[],\n strides: readonly number[],\n targetShape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n const result = new Array(targetNdim).fill(0);\n\n // Align dimensions from the right\n for (let i = 0; i < ndim; i++) {\n const targetIdx = targetNdim - ndim + i;\n const dim = shape[i]!;\n const targetDim = targetShape[targetIdx]!;\n\n if (dim === targetDim) {\n // Same size, use original stride\n result[targetIdx] = strides[i]!;\n } else if (dim === 1) {\n // Broadcasting, stride is 0 (repeat along this dimension)\n result[targetIdx] = 0;\n } else {\n // This shouldn't happen if shapes were validated\n throw new Error('Invalid broadcast');\n }\n }\n\n return result;\n}\n\n/**\n * Create a broadcast view of an ArrayStorage\n * The returned storage shares data with the original but has different shape/strides\n */\nfunction broadcastTo(storage: ArrayStorage, targetShape: readonly number[]): ArrayStorage {\n const broadcastedStrides = broadcastStrides(storage.shape, storage.strides, targetShape);\n return ArrayStorage.fromData(\n storage.data,\n Array.from(targetShape),\n storage.dtype,\n broadcastedStrides,\n storage.offset\n );\n}\n\n/**\n * Perform element-wise operation with broadcasting\n *\n * NOTE: This is the slow path for broadcasting/non-contiguous arrays.\n * Fast paths for contiguous arrays are implemented directly in ops/arithmetic.ts\n *\n * @param a - First array storage\n * @param b - Second array storage\n * @param op - Operation to perform (a, b) => result\n * @param opName - Name of operation (for special handling)\n * @returns Result storage\n */\nexport function elementwiseBinaryOp(\n a: ArrayStorage,\n b: ArrayStorage,\n op: (a: number, b: number) => number,\n opName: string\n): ArrayStorage {\n // Compute broadcast shape\n const outputShape = broadcastShapes(a.shape, b.shape);\n\n // Create broadcast views\n const aBroadcast = broadcastTo(a, outputShape);\n const bBroadcast = broadcastTo(b, outputShape);\n\n // Determine output dtype using NumPy promotion rules\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n const resultData = result.data;\n const size = result.size;\n\n if (isBigIntDType(resultDtype)) {\n // BigInt arithmetic - no precision loss\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert to BigInt - handle case where value is already BigInt\n const aVal = typeof aRaw === 'bigint' ? aRaw : BigInt(Math.round(aRaw));\n const bVal = typeof bRaw === 'bigint' ? bRaw : BigInt(Math.round(bRaw));\n\n // Use BigInt operations\n if (opName === 'add') {\n resultTyped[i] = aVal + bVal;\n } else if (opName === 'subtract') {\n resultTyped[i] = aVal - bVal;\n } else if (opName === 'multiply') {\n resultTyped[i] = aVal * bVal;\n } else if (opName === 'divide') {\n resultTyped[i] = aVal / bVal;\n } else {\n resultTyped[i] = BigInt(Math.round(op(Number(aVal), Number(bVal))));\n }\n }\n } else {\n // Regular numeric types (including float dtypes)\n // Need to convert BigInt values to Number if mixing dtypes\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert to Number if needed (handles BigInt \u2192 float promotion)\n const aVal = needsConversion && typeof aRaw === 'bigint' ? Number(aRaw) : Number(aRaw);\n const bVal = needsConversion && typeof bRaw === 'bigint' ? Number(bRaw) : Number(bRaw);\n\n resultData[i] = op(aVal, bVal);\n }\n }\n\n return result;\n}\n\n/**\n * Perform element-wise comparison with broadcasting\n * Returns boolean array (dtype: 'bool', stored as Uint8Array)\n */\nexport function elementwiseComparisonOp(\n a: ArrayStorage,\n b: ArrayStorage,\n op: (a: number, b: number) => boolean\n): ArrayStorage {\n // Compute broadcast shape\n const outputShape = broadcastShapes(a.shape, b.shape);\n\n // Create broadcast views\n const aBroadcast = broadcastTo(a, outputShape);\n const bBroadcast = broadcastTo(b, outputShape);\n\n // Get output shape\n const size = outputShape.reduce((a, b) => a * b, 1);\n\n // Create result array with bool dtype\n const resultData = new Uint8Array(size);\n\n // Check if we need to convert BigInt to Number for comparison\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n // Perform element-wise comparison\n for (let i = 0; i < size; i++) {\n const aRaw = aBroadcast.iget(i);\n const bRaw = bBroadcast.iget(i);\n\n // Convert BigInt to Number if needed\n const aVal = needsConversion && typeof aRaw === 'bigint' ? Number(aRaw) : Number(aRaw);\n const bVal = needsConversion && typeof bRaw === 'bigint' ? Number(bRaw) : Number(bRaw);\n\n resultData[i] = op(aVal, bVal) ? 1 : 0;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'bool');\n}\n\n/**\n * Perform element-wise unary operation\n *\n * @param a - Input array storage\n * @param op - Operation to perform (x) => result\n * @param preserveDtype - If true, preserve input dtype; if false, promote to float64 (default: true)\n * @returns Result storage\n */\nexport function elementwiseUnaryOp(\n a: ArrayStorage,\n op: (x: number) => number,\n preserveDtype = true\n): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const size = a.size;\n\n // Determine output dtype\n // Math operations like sqrt may need float output even for integer input\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = preserveDtype ? dtype : isIntegerType ? 'float64' : dtype;\n\n // Create result storage\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n const inputData = a.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt input - convert to Number for operation, then convert back if preserving dtype\n if (isBigIntDType(resultDtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = Number(inputData[i]!);\n resultTyped[i] = BigInt(Math.round(op(val)));\n }\n } else {\n // BigInt input, float output\n for (let i = 0; i < size; i++) {\n resultData[i] = op(Number(inputData[i]!));\n }\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = op(Number(inputData[i]!));\n }\n }\n\n return result;\n}\n", "/**\n * Arithmetic operations\n *\n * Pure functions for element-wise arithmetic operations:\n * add, subtract, multiply, divide\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, promoteDTypes } from '../core/dtype';\nimport { elementwiseBinaryOp } from '../internal/compute';\n\n/**\n * Helper: Check if two arrays can use the fast path\n * (both C-contiguous with same shape, no broadcasting needed)\n */\nfunction canUseFastPath(a: ArrayStorage, b: ArrayStorage): boolean {\n return (\n a.isCContiguous &&\n b.isCContiguous &&\n a.shape.length === b.shape.length &&\n a.shape.every((dim, i) => dim === b.shape[i])\n );\n}\n\n/**\n * Add two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function add(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return addScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return addArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x + y, 'add');\n}\n\n/**\n * Fast path for adding two contiguous arrays\n * @private\n */\nfunction addArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) + (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! + bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal + bVal;\n }\n } else {\n // Pure numeric operations - fully optimizable\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) + (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Subtract two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function subtract(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return subtractScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return subtractArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x - y, 'subtract');\n}\n\n/**\n * Fast path for subtracting two contiguous arrays\n * @private\n */\nfunction subtractArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) - (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! - bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal - bVal;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) - (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Multiply two arrays or array and scalar\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage\n */\nexport function multiply(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return multiplyScalar(a, b);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return multiplyArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x * y, 'multiply');\n}\n\n/**\n * Fast path for multiplying two contiguous arrays\n * @private\n */\nfunction multiplyArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) * (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! * bTyped[i]!;\n }\n }\n } else {\n const needsConversion = isBigIntDType(a.dtype) || isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? Number(aData[i]) : (aData[i] as number);\n const bVal = typeof bData[i] === 'bigint' ? Number(bData[i]) : (bData[i] as number);\n resultData[i] = aVal * bVal;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) * (bData[i] as number);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Divide two arrays or array and scalar\n *\n * NumPy behavior: Integer division always promotes to float\n * Type promotion rules:\n * - float64 + anything \u2192 float64\n * - float32 + integer \u2192 float32\n * - integer + integer \u2192 float64\n *\n * @param a - First array storage\n * @param b - Second array storage or scalar\n * @returns Result storage with promoted float dtype\n */\nexport function divide(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return divideScalar(a, b);\n }\n\n // Determine result dtype using NumPy promotion rules\n const aIsFloat64 = a.dtype === 'float64';\n const bIsFloat64 = b.dtype === 'float64';\n const aIsFloat32 = a.dtype === 'float32';\n const bIsFloat32 = b.dtype === 'float32';\n\n // If either is float64, result is float64\n if (aIsFloat64 || bIsFloat64) {\n const aFloat = aIsFloat64 ? a : convertToFloatDType(a, 'float64');\n const bFloat = bIsFloat64 ? b : convertToFloatDType(b, 'float64');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n }\n\n // If either is float32, result is float32\n if (aIsFloat32 || bIsFloat32) {\n const aFloat = aIsFloat32 ? a : convertToFloatDType(a, 'float32');\n const bFloat = bIsFloat32 ? b : convertToFloatDType(b, 'float32');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n }\n\n // Both are integers, promote to float64\n const aFloat = convertToFloatDType(a, 'float64');\n const bFloat = convertToFloatDType(b, 'float64');\n return elementwiseBinaryOp(aFloat, bFloat, (x, y) => x / y, 'divide');\n}\n\n/**\n * Convert ArrayStorage to float dtype\n * @private\n */\nfunction convertToFloatDType(\n storage: ArrayStorage,\n targetDtype: 'float32' | 'float64'\n): ArrayStorage {\n const result = ArrayStorage.zeros(Array.from(storage.shape), targetDtype);\n const size = storage.size;\n const srcData = storage.data;\n const dstData = result.data;\n\n for (let i = 0; i < size; i++) {\n dstData[i] = Number(srcData[i]!);\n }\n\n return result;\n}\n\n/**\n * Add scalar to array (optimized path)\n * @private\n */\nfunction addScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! + scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) + scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Subtract scalar from array (optimized path)\n * @private\n */\nfunction subtractScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! - scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) - scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Multiply array by scalar (optimized path)\n * @private\n */\nfunction multiplyScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - no precision loss\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! * scalarBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) * scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Divide array by scalar (optimized path)\n * NumPy behavior: Integer division promotes to float64\n * @private\n */\nfunction divideScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: Integer division always promotes to float64\n // This allows representing inf/nan for division by zero\n // Bool is also promoted to float64 (NumPy behavior)\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n // Create result with promoted dtype\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // Convert BigInt to Number for division (promotes to float64)\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) / scalar;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Number(data[i]!) / scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Absolute value of each element\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with absolute values\n */\nexport function absolute(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n resultTyped[i] = val < 0n ? -val : val;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.abs(Number(data[i]!));\n }\n }\n\n return result;\n}\n\n/**\n * Numerical negative (element-wise negation)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with negated values\n */\nexport function negative(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = -thisTyped[i]!;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = -Number(data[i]!);\n }\n }\n\n return result;\n}\n\n/**\n * Sign of each element (-1, 0, or 1)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage with signs\n */\nexport function sign(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n resultTyped[i] = val > 0n ? 1n : val < 0n ? -1n : 0n;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n resultData[i] = val > 0 ? 1 : val < 0 ? -1 : 0;\n }\n }\n\n return result;\n}\n\n/**\n * Modulo operation (remainder after division)\n * NumPy behavior: Uses floor modulo (sign follows divisor), not JavaScript's truncate modulo\n * Preserves dtype for integer types\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with modulo values\n */\nexport function mod(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return modScalar(a, b);\n }\n // NumPy uses floor modulo: ((x % y) + y) % y for proper sign handling\n return elementwiseBinaryOp(a, b, (x, y) => ((x % y) + y) % y, 'mod');\n}\n\n/**\n * Modulo with scalar divisor (optimized path)\n * NumPy uses floor modulo: result has same sign as divisor\n * @private\n */\nfunction modScalar(storage: ArrayStorage, divisor: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Create result with same dtype\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic - use floor modulo\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const divisorBig = BigInt(Math.round(divisor));\n for (let i = 0; i < size; i++) {\n const val = thisTyped[i]!;\n // Floor modulo for BigInt\n resultTyped[i] = ((val % divisorBig) + divisorBig) % divisorBig;\n }\n } else {\n // Regular numeric types - use floor modulo\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n // Floor modulo: ((x % y) + y) % y\n resultData[i] = ((val % divisor) + divisor) % divisor;\n }\n }\n\n return result;\n}\n\n/**\n * Floor division (division with result rounded down)\n * NumPy behavior: Preserves integer types\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with floor division values\n */\nexport function floorDivide(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return floorDivideScalar(a, b);\n }\n return elementwiseBinaryOp(a, b, (x, y) => Math.floor(x / y), 'floor_divide');\n}\n\n/**\n * Floor division with scalar divisor (optimized path)\n * @private\n */\nfunction floorDivideScalar(storage: ArrayStorage, divisor: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: floor_divide preserves integer types\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt floor division\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const divisorBig = BigInt(Math.round(divisor));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! / divisorBig;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.floor(Number(data[i]!) / divisor);\n }\n }\n\n return result;\n}\n\n/**\n * Unary positive (returns a copy of the array)\n * Preserves dtype\n *\n * @param a - Input array storage\n * @returns Result storage (copy of input)\n */\nexport function positive(a: ArrayStorage): ArrayStorage {\n // Positive is essentially a no-op that returns a copy\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n // Copy data\n for (let i = 0; i < size; i++) {\n resultData[i] = data[i]!;\n }\n\n return result;\n}\n\n/**\n * Reciprocal (1/x) of each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with reciprocal values\n */\nexport function reciprocal(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // NumPy behavior: reciprocal always promotes integers to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt input promotes to float64\n for (let i = 0; i < size; i++) {\n resultData[i] = 1.0 / Number(data[i]!);\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = 1.0 / Number(data[i]!);\n }\n }\n\n return result;\n}\n\n/**\n * Cube root of each element\n * NumPy behavior: Promotes integer types to float64\n *\n * @param a - Input array storage\n * @returns Result storage with cube root values\n */\nexport function cbrt(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // NumPy behavior: cbrt always promotes integers to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const resultDtype = isIntegerType ? 'float64' : dtype;\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n // Handle all types uniformly - convert to number and apply Math.cbrt\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.cbrt(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Absolute value of each element, returning float\n * NumPy behavior: fabs always returns floating point\n *\n * @param a - Input array storage\n * @returns Result storage with absolute values as float\n */\nexport function fabs(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n // fabs always returns float64, except for float32 which stays float32\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n // Handle all types uniformly\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.abs(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Returns both quotient and remainder (floor divide and modulo)\n * NumPy behavior: divmod(a, b) = (floor_divide(a, b), mod(a, b))\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Tuple of [quotient, remainder] storages\n */\nexport function divmod(a: ArrayStorage, b: ArrayStorage | number): [ArrayStorage, ArrayStorage] {\n const quotient = floorDivide(a, b);\n const remainder = mod(a, b);\n return [quotient, remainder];\n}\n\n/**\n * Element-wise square of each element\n * NumPy behavior: x**2\n *\n * @param a - Input array storage\n * @returns Result storage with squared values\n */\nexport function square(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const bigData = data as BigInt64Array | BigUint64Array;\n const bigResultData = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n bigResultData[i] = bigData[i]! * bigData[i]!;\n }\n } else {\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n resultData[i] = val * val;\n }\n }\n\n return result;\n}\n\n/**\n * Remainder of division (same as mod)\n * NumPy behavior: Same as mod, alias for compatibility\n *\n * @param a - Dividend array storage\n * @param b - Divisor (array storage or scalar)\n * @returns Result storage with remainder values\n */\nexport function remainder(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n return mod(a, b);\n}\n\n/**\n * Heaviside step function\n * NumPy behavior:\n * heaviside(x1, x2) = 0 if x1 < 0\n * = x2 if x1 == 0\n * = 1 if x1 > 0\n *\n * @param x1 - Input array storage\n * @param x2 - Value to use when x1 == 0 (array storage or scalar)\n * @returns Result storage with heaviside values\n */\nexport function heaviside(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n const dtype = x1.dtype;\n const shape = Array.from(x1.shape);\n const size = x1.size;\n\n // Result is always float64\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (typeof x2 === 'number') {\n // Scalar x2\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = x2;\n } else {\n resultData[i] = 1;\n }\n }\n } else {\n // Array x2 - needs to broadcast\n const x2Data = x2.data;\n const x2Shape = x2.shape;\n\n // Simple case: same shape\n if (shape.every((d, i) => d === x2Shape[i])) {\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = Number(x2Data[i]!);\n } else {\n resultData[i] = 1;\n }\n }\n } else {\n // Broadcasting case - use elementwiseBinaryOp approach\n for (let i = 0; i < size; i++) {\n const val = Number(x1.data[i]!);\n // Simple broadcast: assume x2 is broadcastable to x1\n const x2Idx = i % x2.size;\n if (val < 0) {\n resultData[i] = 0;\n } else if (val === 0) {\n resultData[i] = Number(x2Data[x2Idx]!);\n } else {\n resultData[i] = 1;\n }\n }\n }\n }\n\n return result;\n}\n", "/**\n * Broadcasting utilities for NumPy-compatible array operations\n *\n * Implements NumPy broadcasting rules without external dependencies\n */\n\nimport { ArrayStorage } from './storage';\n\n/**\n * Check if two or more shapes are broadcast-compatible\n * and compute the resulting output shape\n *\n * @param shapes - Array of shapes to broadcast\n * @returns The broadcast output shape, or null if incompatible\n *\n * @example\n * ```typescript\n * computeBroadcastShape([[3, 4], [4]]); // [3, 4]\n * computeBroadcastShape([[3, 4], [3, 1]]); // [3, 4]\n * computeBroadcastShape([[3, 4], [5]]); // null (incompatible)\n * ```\n */\nexport function computeBroadcastShape(shapes: readonly number[][]): number[] | null {\n if (shapes.length === 0) {\n return [];\n }\n\n if (shapes.length === 1) {\n return Array.from(shapes[0]!);\n }\n\n // Find max number of dimensions\n const maxNdim = Math.max(...shapes.map((s) => s.length));\n const result = new Array(maxNdim);\n\n for (let i = 0; i < maxNdim; i++) {\n let dim = 1;\n for (const shape of shapes) {\n const shapeIdx = shape.length - maxNdim + i;\n const shapeDim = shapeIdx < 0 ? 1 : shape[shapeIdx]!;\n\n if (shapeDim === 1) {\n // Can be broadcast\n continue;\n } else if (dim === 1) {\n // First non-1 dimension\n dim = shapeDim;\n } else if (dim !== shapeDim) {\n // Incompatible\n return null;\n }\n }\n result[i] = dim;\n }\n\n return result;\n}\n\n/**\n * Check if two shapes are broadcast-compatible\n *\n * @param shape1 - First shape\n * @param shape2 - Second shape\n * @returns true if shapes can be broadcast together, false otherwise\n *\n * @example\n * ```typescript\n * areBroadcastable([3, 4], [4]); // true\n * areBroadcastable([3, 4], [3, 1]); // true\n * areBroadcastable([3, 4], [5]); // false\n * ```\n */\nexport function areBroadcastable(shape1: readonly number[], shape2: readonly number[]): boolean {\n return computeBroadcastShape([Array.from(shape1), Array.from(shape2)]) !== null;\n}\n\n/**\n * Compute the strides for broadcasting an array to a target shape\n * Returns strides where dimensions that need broadcasting have stride 0\n */\nfunction broadcastStrides(\n shape: readonly number[],\n strides: readonly number[],\n targetShape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n const result = new Array(targetNdim).fill(0);\n\n // Align dimensions from the right\n for (let i = 0; i < ndim; i++) {\n const targetIdx = targetNdim - ndim + i;\n const dim = shape[i]!;\n const targetDim = targetShape[targetIdx]!;\n\n if (dim === targetDim) {\n // Same size, use original stride\n result[targetIdx] = strides[i]!;\n } else if (dim === 1) {\n // Broadcasting, stride is 0 (repeat along this dimension)\n result[targetIdx] = 0;\n } else {\n // This shouldn't happen if shapes were validated\n throw new Error('Invalid broadcast');\n }\n }\n\n return result;\n}\n\n/**\n * Broadcast an ArrayStorage to a target shape\n * Returns a view with modified strides for broadcasting\n *\n * @param storage - The storage to broadcast\n * @param targetShape - The target shape to broadcast to\n * @returns A new ArrayStorage view with broadcasting strides\n */\nexport function broadcastTo(storage: ArrayStorage, targetShape: readonly number[]): ArrayStorage {\n const broadcastedStrides = broadcastStrides(storage.shape, storage.strides, targetShape);\n return ArrayStorage.fromData(\n storage.data,\n Array.from(targetShape),\n storage.dtype,\n broadcastedStrides,\n storage.offset\n );\n}\n\n/**\n * Broadcast multiple ArrayStorage objects to a common shape\n *\n * Returns views of the input arrays broadcast to the same shape.\n * Views share memory with the original arrays.\n *\n * @param storages - ArrayStorage objects to broadcast\n * @returns Array of broadcast ArrayStorage views\n * @throws Error if arrays have incompatible shapes\n */\nexport function broadcastArrays(storages: ArrayStorage[]): ArrayStorage[] {\n if (storages.length === 0) {\n return [];\n }\n\n if (storages.length === 1) {\n return storages;\n }\n\n // Compute broadcast shape\n const shapes = storages.map((s) => Array.from(s.shape));\n const targetShape = computeBroadcastShape(shapes);\n\n if (targetShape === null) {\n throw new Error(\n `operands could not be broadcast together with shapes ${shapes.map((s) => JSON.stringify(s)).join(' ')}`\n );\n }\n\n // Broadcast each storage to the target shape\n return storages.map((s) => broadcastTo(s, targetShape));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes without creating arrays.\n * Returns the resulting shape if all shapes are broadcast-compatible.\n *\n * This is the NumPy-compatible function for computing broadcast shape.\n *\n * @param shapes - Variable number of shapes to broadcast\n * @returns The broadcast output shape\n * @throws Error if shapes are not broadcast-compatible\n *\n * @example\n * ```typescript\n * broadcastShapes([3, 4], [4]); // [3, 4]\n * broadcastShapes([3, 4], [3, 1]); // [3, 4]\n * broadcastShapes([3, 4], [5]); // Error\n * ```\n */\nexport function broadcastShapes(...shapes: readonly number[][]): number[] {\n const result = computeBroadcastShape(shapes);\n\n if (result === null) {\n const shapeStrs = shapes.map((s) => `(${s.join(',')})`).join(' ');\n throw new Error(\n `shape mismatch: objects cannot be broadcast to a single shape. Mismatch is between ${shapeStrs}`\n );\n }\n\n return result;\n}\n\n/**\n * Generate a descriptive error message for broadcasting failures\n *\n * @param shapes - The incompatible shapes\n * @param operation - The operation being attempted (e.g., 'add', 'multiply')\n * @returns Error message string\n */\nexport function broadcastErrorMessage(shapes: readonly number[][], operation?: string): string {\n const opStr = operation ? ` for ${operation}` : '';\n const shapeStrs = shapes.map((s) => `(${s.join(',')})`).join(' ');\n return `operands could not be broadcast together${opStr} with shapes ${shapeStrs}`;\n}\n", "/**\n * Comparison operations\n *\n * Element-wise comparison operations that return boolean arrays:\n * greater, greater_equal, less, less_equal, equal, not_equal,\n * isclose, allclose\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType } from '../core/dtype';\nimport { elementwiseComparisonOp } from '../internal/compute';\nimport { computeBroadcastShape, broadcastTo } from '../core/broadcasting';\n\n/**\n * Element-wise greater than comparison (a > b)\n */\nexport function greater(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return greaterScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x > y);\n}\n\n/**\n * Element-wise greater than or equal comparison (a >= b)\n */\nexport function greaterEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return greaterEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x >= y);\n}\n\n/**\n * Element-wise less than comparison (a < b)\n */\nexport function less(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return lessScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x < y);\n}\n\n/**\n * Element-wise less than or equal comparison (a <= b)\n */\nexport function lessEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return lessEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x <= y);\n}\n\n/**\n * Element-wise equality comparison (a == b)\n */\nexport function equal(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return equalScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x === y);\n}\n\n/**\n * Element-wise inequality comparison (a != b)\n */\nexport function notEqual(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return notEqualScalar(a, b);\n }\n return elementwiseComparisonOp(a, b, (x, y) => x !== y);\n}\n\n/**\n * Element-wise \"close\" comparison with tolerance\n * Returns true where |a - b| <= atol + rtol * |b|\n */\nexport function isclose(\n a: ArrayStorage,\n b: ArrayStorage | number,\n rtol: number = 1e-5,\n atol: number = 1e-8\n): ArrayStorage {\n if (typeof b === 'number') {\n return iscloseScalar(a, b, rtol, atol);\n }\n return elementwiseComparisonOp(a, b, (x, y) => {\n const diff = Math.abs(x - y);\n const threshold = atol + rtol * Math.abs(y);\n return diff <= threshold;\n });\n}\n\n/**\n * Check if all elements are close (scalar result)\n * Returns true if all elements satisfy isclose condition\n */\nexport function allclose(\n a: ArrayStorage,\n b: ArrayStorage | number,\n rtol: number = 1e-5,\n atol: number = 1e-8\n): boolean {\n const closeResult = isclose(a, b, rtol, atol);\n const data = closeResult.data as Uint8Array;\n\n // Check if all values are 1 (true)\n for (let i = 0; i < closeResult.size; i++) {\n if (data[i] === 0) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Returns True if two arrays are element-wise equal within a tolerance.\n * Unlike array_equal, this function broadcasts the arrays before comparison.\n *\n * NumPy behavior: Broadcasts arrays before comparing, returns True if shapes\n * are broadcast-compatible and all elements are equal.\n *\n * @param a1 - First input array\n * @param a2 - Second input array\n * @returns True if arrays are equivalent (after broadcasting), False otherwise\n */\nexport function arrayEquiv(a1: ArrayStorage, a2: ArrayStorage): boolean {\n // Check if arrays can be broadcast together\n const shapes = [Array.from(a1.shape), Array.from(a2.shape)];\n const broadcastShape = computeBroadcastShape(shapes);\n\n if (broadcastShape === null) {\n // If shapes are incompatible for broadcasting, arrays are not equivalent\n return false;\n }\n\n // Broadcast both arrays to the common shape\n const b1 = broadcastTo(a1, broadcastShape);\n const b2 = broadcastTo(a2, broadcastShape);\n\n // Compare element by element using proper multi-dimensional indexing\n const ndim = broadcastShape.length;\n const size = broadcastShape.reduce((acc, d) => acc * d, 1);\n\n // Handle different dtypes\n const isBigInt1 = isBigIntDType(b1.dtype);\n const isBigInt2 = isBigIntDType(b2.dtype);\n\n // Iterate over all elements using multi-dimensional indices\n for (let flatIdx = 0; flatIdx < size; flatIdx++) {\n // Convert flat index to multi-dimensional indices\n let temp = flatIdx;\n const indices: number[] = new Array(ndim);\n for (let i = ndim - 1; i >= 0; i--) {\n indices[i] = temp % broadcastShape[i]!;\n temp = Math.floor(temp / broadcastShape[i]!);\n }\n\n // Get values using proper indexing\n const val1 = b1.get(...indices);\n const val2 = b2.get(...indices);\n\n // Compare values\n if (isBigInt1 || isBigInt2) {\n const v1 = typeof val1 === 'bigint' ? val1 : BigInt(Number(val1));\n const v2 = typeof val2 === 'bigint' ? val2 : BigInt(Number(val2));\n if (v1 !== v2) {\n return false;\n }\n } else {\n if (val1 !== val2) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n// Scalar comparison optimized paths\n\nfunction greaterScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! > scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction greaterEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! >= scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction lessScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! < scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction lessEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! <= scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction equalScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n const dtype = storage.dtype;\n\n if (isBigIntDType(dtype)) {\n // BigInt comparison: convert scalar to BigInt\n const scalarBig = BigInt(Math.round(scalar));\n const typedData = thisData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < storage.size; i++) {\n data[i] = typedData[i]! === scalarBig ? 1 : 0;\n }\n } else {\n // Regular comparison\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! === scalar ? 1 : 0;\n }\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction notEqualScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n\n for (let i = 0; i < storage.size; i++) {\n data[i] = thisData[i]! !== scalar ? 1 : 0;\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n\nfunction iscloseScalar(\n storage: ArrayStorage,\n scalar: number,\n rtol: number,\n atol: number\n): ArrayStorage {\n const data = new Uint8Array(storage.size);\n const thisData = storage.data;\n const dtype = storage.dtype;\n\n if (isBigIntDType(dtype)) {\n // For BigInt, convert to Number for comparison\n const thisTyped = thisData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < storage.size; i++) {\n const a = Number(thisTyped[i]!);\n const diff = Math.abs(a - scalar);\n const threshold = atol + rtol * Math.abs(scalar);\n data[i] = diff <= threshold ? 1 : 0;\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < storage.size; i++) {\n const a = Number(thisData[i]!);\n const diff = Math.abs(a - scalar);\n const threshold = atol + rtol * Math.abs(scalar);\n data[i] = diff <= threshold ? 1 : 0;\n }\n }\n\n return ArrayStorage.fromData(data, Array.from(storage.shape), 'bool');\n}\n", "/**\n * Indexing utilities for array operations\n * @internal\n */\n\n/**\n * Compute row-major strides for a given shape\n */\nexport function computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n\n/**\n * Convert multi-index to linear index in row-major order\n */\nexport function multiIndexToLinear(indices: number[], shape: readonly number[]): number {\n let linearIdx = 0;\n let stride = 1;\n for (let i = indices.length - 1; i >= 0; i--) {\n linearIdx += indices[i]! * stride;\n stride *= shape[i]!;\n }\n return linearIdx;\n}\n\n/**\n * Convert outer index and axis index to full multi-index\n * Used in reductions along a specific axis\n *\n * @param outerIdx - Linear index in the reduced (output) array\n * @param axis - The axis being reduced\n * @param axisIdx - Position along the reduction axis\n * @param shape - Original array shape\n * @returns Full multi-index in the original array\n */\nexport function outerIndexToMultiIndex(\n outerIdx: number,\n axis: number,\n axisIdx: number,\n shape: readonly number[]\n): number[] {\n const ndim = shape.length;\n const indices = new Array(ndim);\n const outputShape = Array.from(shape).filter((_, i) => i !== axis);\n\n // Convert outerIdx to multi-index in the output shape\n let remaining = outerIdx;\n for (let i = outputShape.length - 1; i >= 0; i--) {\n indices[i >= axis ? i + 1 : i] = remaining % outputShape[i]!;\n remaining = Math.floor(remaining / outputShape[i]!);\n }\n\n // Insert the axis index\n indices[axis] = axisIdx;\n return indices;\n}\n", "/**\n * Reduction operations (sum, mean, max, min)\n *\n * Pure functions for reducing arrays along axes.\n * @module ops/reduction\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType } from '../core/dtype';\nimport { outerIndexToMultiIndex, multiIndexToLinear } from '../internal/indexing';\n\n/**\n * Sum array elements over a given axis\n */\nexport function sum(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Sum all elements - return scalar\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n let total = BigInt(0);\n for (let i = 0; i < size; i++) {\n total += typedData[i]!;\n }\n return Number(total);\n } else {\n let total = 0;\n for (let i = 0; i < size; i++) {\n total += Number(data[i]!);\n }\n return total;\n }\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar - reuse scalar sum logic\n return sum(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumVal = BigInt(0);\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n sumVal += typedData[linearIdx]!;\n }\n resultTyped[outerIdx] = sumVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumVal = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n sumVal += Number(data[linearIdx]!);\n }\n resultData[outerIdx] = sumVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Compute the arithmetic mean along the specified axis\n * Note: mean() returns float64 for integer dtypes, matching NumPy behavior\n */\nexport function mean(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n\n if (axis === undefined) {\n return (sum(storage) as number) / storage.size;\n }\n\n // Normalize negative axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = shape.length + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= shape.length) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${shape.length}`);\n }\n\n const sumResult = sum(storage, axis, keepdims);\n if (typeof sumResult === 'number') {\n return sumResult / shape[normalizedAxis]!;\n }\n\n // Divide by the size of the reduced axis\n const divisor = shape[normalizedAxis]!;\n\n // For integer dtypes, mean returns float64 (matching NumPy behavior)\n let resultDtype = dtype;\n if (isBigIntDType(dtype) || dtype.startsWith('int') || dtype.startsWith('uint')) {\n resultDtype = 'float64';\n }\n\n const result = ArrayStorage.zeros(Array.from(sumResult.shape), resultDtype);\n const resultData = result.data;\n const sumData = sumResult.data;\n\n if (isBigIntDType(dtype)) {\n // Convert BigInt sum results to float for mean\n const sumTyped = sumData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < resultData.length; i++) {\n resultData[i] = Number(sumTyped[i]!) / divisor;\n }\n } else {\n for (let i = 0; i < resultData.length; i++) {\n resultData[i] = Number(sumData[i]!) / divisor;\n }\n }\n\n return result;\n}\n\n/**\n * Return the maximum along a given axis\n */\nexport function max(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Max of all elements - return scalar\n if (size === 0) {\n throw new Error('max of empty array');\n }\n\n let maxVal = data[0]!;\n for (let i = 1; i < size; i++) {\n if (data[i]! > maxVal) {\n maxVal = data[i]!;\n }\n }\n return Number(maxVal);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return max(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let maxVal = typedData[firstIdx]!;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val > maxVal) {\n maxVal = val;\n }\n }\n resultTyped[outerIdx] = maxVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val > maxVal) {\n maxVal = val;\n }\n }\n resultData[outerIdx] = maxVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Product array elements over a given axis\n */\nexport function prod(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Product of all elements - return scalar\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n let product = BigInt(1);\n for (let i = 0; i < size; i++) {\n product *= typedData[i]!;\n }\n return Number(product);\n } else {\n let product = 1;\n for (let i = 0; i < size; i++) {\n product *= Number(data[i]!);\n }\n return product;\n }\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar - reuse scalar prod logic\n return prod(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let prodVal = BigInt(1);\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n prodVal *= typedData[linearIdx]!;\n }\n resultTyped[outerIdx] = prodVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let prodVal = 1;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n prodVal *= Number(data[linearIdx]!);\n }\n resultData[outerIdx] = prodVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Return the minimum along a given axis\n */\nexport function min(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Min of all elements - return scalar\n if (size === 0) {\n throw new Error('min of empty array');\n }\n\n let minVal = data[0]!;\n for (let i = 1; i < size; i++) {\n if (data[i]! < minVal) {\n minVal = data[i]!;\n }\n }\n return Number(minVal);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return min(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, dtype);\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let minVal = typedData[firstIdx]!;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val < minVal) {\n minVal = val;\n }\n }\n resultTyped[outerIdx] = minVal;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val < minVal) {\n minVal = val;\n }\n }\n resultData[outerIdx] = minVal;\n }\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, dtype);\n }\n\n return result;\n}\n\n/**\n * Return the indices of the minimum values along a given axis\n */\nexport function argmin(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Argmin of all elements - return scalar index\n if (size === 0) {\n throw new Error('argmin of empty array');\n }\n\n let minVal = data[0]!;\n let minIdx = 0;\n for (let i = 1; i < size; i++) {\n if (data[i]! < minVal) {\n minVal = data[i]!;\n minIdx = i;\n }\n }\n return minIdx;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return argmin(storage);\n }\n\n // Create result storage with int32 dtype (indices are always integers)\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let minVal = typedData[firstIdx]!;\n let minAxisIdx = 0;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val < minVal) {\n minVal = val;\n minAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minAxisIdx;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n let minAxisIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val < minVal) {\n minVal = val;\n minAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minAxisIdx;\n }\n }\n\n return result;\n}\n\n/**\n * Return the indices of the maximum values along a given axis\n */\nexport function argmax(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const dtype = storage.dtype;\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Argmax of all elements - return scalar index\n if (size === 0) {\n throw new Error('argmax of empty array');\n }\n\n let maxVal = data[0]!;\n let maxIdx = 0;\n for (let i = 1; i < size; i++) {\n if (data[i]! > maxVal) {\n maxVal = data[i]!;\n maxIdx = i;\n }\n }\n return maxIdx;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return argmax(storage);\n }\n\n // Create result storage with int32 dtype (indices are always integers)\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Initialize with first value along axis\n const firstIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, 0, shape);\n const firstIdx = multiIndexToLinear(firstIndices, shape);\n let maxVal = typedData[firstIdx]!;\n let maxAxisIdx = 0;\n\n for (let axisIdx = 1; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = typedData[linearIdx]!;\n if (val > maxVal) {\n maxVal = val;\n maxAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxAxisIdx;\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n let maxAxisIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]!);\n if (val > maxVal) {\n maxVal = val;\n maxAxisIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxAxisIdx;\n }\n }\n\n return result;\n}\n\n/**\n * Compute the variance along the specified axis\n * @param storage - Input array storage\n * @param axis - Axis along which to compute variance\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - Keep dimensions (default: false)\n */\nexport function variance(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n // Compute mean\n const meanResult = mean(storage, axis, keepdims);\n\n if (axis === undefined) {\n // Variance of all elements - return scalar\n const meanVal = meanResult as number;\n let sumSqDiff = 0;\n\n for (let i = 0; i < size; i++) {\n const diff = Number(data[i]!) - meanVal;\n sumSqDiff += diff * diff;\n }\n\n return sumSqDiff / (size - ddof);\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const meanArray = meanResult as ArrayStorage;\n const meanData = meanArray.data;\n\n // Compute output shape (same as mean's output shape)\n const outputShape = keepdims\n ? meanArray.shape\n : Array.from(shape).filter((_, i) => i !== normalizedAxis);\n\n // Result is always float64 for variance\n const result = ArrayStorage.zeros(Array.from(outputShape), 'float64');\n const resultData = result.data;\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n // Compute variance for each position\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumSqDiff = 0;\n const meanVal = Number(meanData[outerIdx]!);\n\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const diff = Number(data[linearIdx]!) - meanVal;\n sumSqDiff += diff * diff;\n }\n\n resultData[outerIdx] = sumSqDiff / (axisSize - ddof);\n }\n\n return result;\n}\n\n/**\n * Compute the standard deviation along the specified axis\n * @param storage - Input array storage\n * @param axis - Axis along which to compute std\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - Keep dimensions (default: false)\n */\nexport function std(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const varResult = variance(storage, axis, ddof, keepdims);\n\n if (typeof varResult === 'number') {\n return Math.sqrt(varResult);\n }\n\n // Apply sqrt element-wise\n const result = ArrayStorage.zeros(Array.from(varResult.shape), 'float64');\n const varData = varResult.data;\n const resultData = result.data;\n\n for (let i = 0; i < varData.length; i++) {\n resultData[i] = Math.sqrt(Number(varData[i]!));\n }\n\n return result;\n}\n\n/**\n * Test whether all array elements along a given axis evaluate to True\n */\nexport function all(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | boolean {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Test all elements\n for (let i = 0; i < size; i++) {\n if (!data[i]) {\n return false;\n }\n }\n return true;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return all(storage);\n }\n\n // Create result storage with bool dtype\n const result = ArrayStorage.zeros(outputShape, 'bool');\n const resultData = result.data as Uint8Array;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let allTrue = true;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (!data[linearIdx]) {\n allTrue = false;\n break;\n }\n }\n resultData[outerIdx] = allTrue ? 1 : 0;\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'bool');\n }\n\n return result;\n}\n\n/**\n * Test whether any array elements along a given axis evaluate to True\n */\nexport function any(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | boolean {\n const shape = storage.shape;\n const ndim = shape.length;\n const size = storage.size;\n const data = storage.data;\n\n if (axis === undefined) {\n // Test all elements\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n return true;\n }\n }\n return false;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n // Result is scalar\n return any(storage);\n }\n\n // Create result storage with bool dtype\n const result = ArrayStorage.zeros(outputShape, 'bool');\n const resultData = result.data as Uint8Array;\n\n // Perform reduction along axis\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let anyTrue = false;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (data[linearIdx]) {\n anyTrue = true;\n break;\n }\n }\n resultData[outerIdx] = anyTrue ? 1 : 0;\n }\n\n // Handle keepdims\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'bool');\n }\n\n return result;\n}\n\n/**\n * Return cumulative sum of elements along a given axis\n */\nexport function cumsum(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumsum\n const size = storage.size;\n const resultData = new Float64Array(size);\n let sum = 0;\n for (let i = 0; i < size; i++) {\n sum += Number(data[i]);\n resultData[i] = sum;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumsum along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n // Determine position along axis\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = Number(data[i]);\n } else {\n // Add previous element along axis\n resultData[i] = resultData[i - axisStride]! + Number(data[i]);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Return cumulative product of elements along a given axis\n */\nexport function cumprod(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumprod\n const size = storage.size;\n const resultData = new Float64Array(size);\n let prod = 1;\n for (let i = 0; i < size; i++) {\n prod *= Number(data[i]);\n resultData[i] = prod;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumprod along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n // Determine position along axis\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = Number(data[i]);\n } else {\n // Multiply by previous element along axis\n resultData[i] = resultData[i - axisStride]! * Number(data[i]);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Peak to peak (maximum - minimum) value along a given axis\n */\nexport function ptp(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const maxResult = max(storage, axis, keepdims);\n const minResult = min(storage, axis, keepdims);\n\n if (typeof maxResult === 'number' && typeof minResult === 'number') {\n return maxResult - minResult;\n }\n\n // Both are arrays, subtract element-wise\n const maxStorage = maxResult as ArrayStorage;\n const minStorage = minResult as ArrayStorage;\n const maxData = maxStorage.data;\n const minData = minStorage.data;\n const resultData = new Float64Array(maxStorage.size);\n\n for (let i = 0; i < maxStorage.size; i++) {\n resultData[i] = Number(maxData[i]) - Number(minData[i]);\n }\n\n return ArrayStorage.fromData(resultData, [...maxStorage.shape], 'float64');\n}\n\n/**\n * Compute the median along the specified axis\n */\nexport function median(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n return quantile(storage, 0.5, axis, keepdims);\n}\n\n/**\n * Compute the q-th percentile of data along specified axis\n */\nexport function percentile(\n storage: ArrayStorage,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n return quantile(storage, q / 100, axis, keepdims);\n}\n\n/**\n * Compute the q-th quantile of data along specified axis\n */\nexport function quantile(\n storage: ArrayStorage,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n if (q < 0 || q > 1) {\n throw new Error('Quantile must be between 0 and 1');\n }\n\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Compute quantile over all elements\n const values: number[] = [];\n for (let i = 0; i < storage.size; i++) {\n values.push(Number(data[i]));\n }\n values.sort((a, b) => a - b);\n\n const n = values.length;\n const idx = q * (n - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n\n if (lower === upper) {\n return values[lower]!;\n }\n\n // Linear interpolation\n const frac = idx - lower;\n return values[lower]! * (1 - frac) + values[upper]! * frac;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return quantile(storage, q);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(data[linearIdx]));\n }\n values.sort((a, b) => a - b);\n\n const n = values.length;\n const idx = q * (n - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n\n if (lower === upper) {\n resultData[outerIdx] = values[lower]!;\n } else {\n // Linear interpolation\n const frac = idx - lower;\n resultData[outerIdx] = values[lower]! * (1 - frac) + values[upper]! * frac;\n }\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute the weighted average along the specified axis\n */\nexport function average(\n storage: ArrayStorage,\n axis?: number,\n weights?: ArrayStorage,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (weights === undefined) {\n // Unweighted average is just mean\n return mean(storage, axis, keepdims);\n }\n\n if (axis === undefined) {\n // Compute weighted average over all elements\n let sumWeightedValues = 0;\n let sumWeights = 0;\n const weightData = weights.data;\n\n for (let i = 0; i < storage.size; i++) {\n const w = Number(weightData[i % weights.size]);\n sumWeightedValues += Number(data[i]) * w;\n sumWeights += w;\n }\n\n return sumWeights === 0 ? NaN : sumWeightedValues / sumWeights;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return average(storage, undefined, weights);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const weightData = weights.data;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let sumWeightedValues = 0;\n let sumWeights = 0;\n\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const w = Number(weightData[axisIdx % weights.size]);\n sumWeightedValues += Number(data[linearIdx]) * w;\n sumWeights += w;\n }\n\n resultData[outerIdx] = sumWeights === 0 ? NaN : sumWeightedValues / sumWeights;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n// ============================================================================\n// NaN-aware reduction functions\n// ============================================================================\n\n/**\n * Return sum of elements, treating NaNs as zero\n */\nexport function nansum(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n }\n }\n return total;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nansum(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n }\n }\n resultData[outerIdx] = total;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return product of elements, treating NaNs as one\n */\nexport function nanprod(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total *= val;\n }\n }\n return total;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanprod(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 1;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total *= val;\n }\n }\n resultData[outerIdx] = total;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute mean ignoring NaN values\n */\nexport function nanmean(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let total = 0;\n let count = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n return count === 0 ? NaN : total / count;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmean(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let total = 0;\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n resultData[outerIdx] = count === 0 ? NaN : total / count;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute variance ignoring NaN values\n */\nexport function nanvar(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // First pass: compute mean\n let total = 0;\n let count = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n if (count - ddof <= 0) return NaN;\n const meanVal = total / count;\n\n // Second pass: compute sum of squared deviations\n let sumSq = 0;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n sumSq += (val - meanVal) ** 2;\n }\n }\n return sumSq / (count - ddof);\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanvar(storage, undefined, ddof);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // First pass: compute mean\n let total = 0;\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n total += val;\n count++;\n }\n }\n\n if (count - ddof <= 0) {\n resultData[outerIdx] = NaN;\n continue;\n }\n\n const meanVal = total / count;\n\n // Second pass: compute sum of squared deviations\n let sumSq = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n sumSq += (val - meanVal) ** 2;\n }\n }\n resultData[outerIdx] = sumSq / (count - ddof);\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Compute standard deviation ignoring NaN values\n */\nexport function nanstd(\n storage: ArrayStorage,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): ArrayStorage | number {\n const varResult = nanvar(storage, axis, ddof, keepdims);\n if (typeof varResult === 'number') {\n return Math.sqrt(varResult);\n }\n const varStorage = varResult as ArrayStorage;\n const resultData = new Float64Array(varStorage.size);\n for (let i = 0; i < varStorage.size; i++) {\n resultData[i] = Math.sqrt(Number(varStorage.data[i]));\n }\n return ArrayStorage.fromData(resultData, [...varStorage.shape], 'float64');\n}\n\n/**\n * Return minimum ignoring NaN values\n */\nexport function nanmin(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let minVal = Infinity;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n }\n }\n return minVal === Infinity ? NaN : minVal;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmin(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n }\n }\n resultData[outerIdx] = minVal === Infinity ? NaN : minVal;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return maximum ignoring NaN values\n */\nexport function nanmax(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let maxVal = -Infinity;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n }\n }\n return maxVal === -Infinity ? NaN : maxVal;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmax(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n }\n }\n resultData[outerIdx] = maxVal === -Infinity ? NaN : maxVal;\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n\n/**\n * Return indices of minimum value, ignoring NaNs\n */\nexport function nanargmin(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let minVal = Infinity;\n let minIdx = -1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n minIdx = i;\n }\n }\n return minIdx;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanargmin(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Int32Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let minVal = Infinity;\n let minIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val < minVal) {\n minVal = val;\n minIdx = axisIdx;\n }\n }\n resultData[outerIdx] = minIdx;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'int32');\n}\n\n/**\n * Return indices of maximum value, ignoring NaNs\n */\nexport function nanargmax(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n let maxVal = -Infinity;\n let maxIdx = -1;\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n maxIdx = i;\n }\n }\n return maxIdx;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanargmax(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Int32Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let maxVal = -Infinity;\n let maxIdx = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val) && val > maxVal) {\n maxVal = val;\n maxIdx = axisIdx;\n }\n }\n resultData[outerIdx] = maxIdx;\n }\n\n return ArrayStorage.fromData(resultData, outputShape, 'int32');\n}\n\n/**\n * Return cumulative sum, treating NaNs as zero\n */\nexport function nancumsum(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumsum\n const size = storage.size;\n const resultData = new Float64Array(size);\n let sum = 0;\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n sum += val;\n }\n resultData[i] = sum;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumsum along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n const val = Number(data[i]);\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = isNaN(val) ? 0 : val;\n } else {\n resultData[i] = resultData[i - axisStride]! + (isNaN(val) ? 0 : val);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Return cumulative product, treating NaNs as one\n */\nexport function nancumprod(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Flatten and cumprod\n const size = storage.size;\n const resultData = new Float64Array(size);\n let prod = 1;\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n prod *= val;\n }\n resultData[i] = prod;\n }\n return ArrayStorage.fromData(resultData, [size], 'float64');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create result with same shape\n const resultData = new Float64Array(storage.size);\n const axisSize = shape[normalizedAxis]!;\n\n // Calculate strides\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Perform cumprod along axis\n const totalSize = storage.size;\n const axisStride = strides[normalizedAxis]!;\n\n for (let i = 0; i < totalSize; i++) {\n const val = Number(data[i]);\n const axisPos = Math.floor(i / axisStride) % axisSize;\n\n if (axisPos === 0) {\n resultData[i] = isNaN(val) ? 1 : val;\n } else {\n resultData[i] = resultData[i - axisStride]! * (isNaN(val) ? 1 : val);\n }\n }\n\n return ArrayStorage.fromData(resultData, [...shape], 'float64');\n}\n\n/**\n * Compute median ignoring NaN values\n */\nexport function nanmedian(\n storage: ArrayStorage,\n axis?: number,\n keepdims: boolean = false\n): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n\n if (axis === undefined) {\n // Collect non-NaN values\n const values: number[] = [];\n for (let i = 0; i < storage.size; i++) {\n const val = Number(data[i]);\n if (!isNaN(val)) {\n values.push(val);\n }\n }\n\n if (values.length === 0) return NaN;\n\n values.sort((a, b) => a - b);\n const n = values.length;\n const mid = Math.floor(n / 2);\n\n if (n % 2 === 0) {\n return (values[mid - 1]! + values[mid]!) / 2;\n }\n return values[mid]!;\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return nanmedian(storage);\n }\n\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n const axisSize = shape[normalizedAxis]!;\n const resultData = new Float64Array(outerSize);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect non-NaN values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n const val = Number(data[linearIdx]);\n if (!isNaN(val)) {\n values.push(val);\n }\n }\n\n if (values.length === 0) {\n resultData[outerIdx] = NaN;\n continue;\n }\n\n values.sort((a, b) => a - b);\n const n = values.length;\n const mid = Math.floor(n / 2);\n\n if (n % 2 === 0) {\n resultData[outerIdx] = (values[mid - 1]! + values[mid]!) / 2;\n } else {\n resultData[outerIdx] = values[mid]!;\n }\n }\n\n const result = ArrayStorage.fromData(resultData, outputShape, 'float64');\n\n if (keepdims) {\n const keepdimsShape = [...shape];\n keepdimsShape[normalizedAxis] = 1;\n return ArrayStorage.fromData(resultData, keepdimsShape, 'float64');\n }\n\n return result;\n}\n", "/**\n * Shape manipulation operations\n *\n * Pure functions for reshaping, transposing, and manipulating array dimensions.\n * @module ops/shape\n */\n\nimport { ArrayStorage, computeStrides } from '../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type TypedArray } from '../core/dtype';\n\n/**\n * Reshape array to a new shape\n * Returns a view if array is C-contiguous, otherwise copies data\n */\nexport function reshape(storage: ArrayStorage, newShape: number[]): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Check if -1 is in the shape (infer dimension)\n const negIndex = newShape.indexOf(-1);\n let finalShape: number[];\n\n if (negIndex !== -1) {\n // Infer the dimension at negIndex\n const knownSize = newShape.reduce((acc, dim, i) => (i === negIndex ? acc : acc * dim), 1);\n const inferredDim = size / knownSize;\n\n if (!Number.isInteger(inferredDim)) {\n throw new Error(\n `cannot reshape array of size ${size} into shape ${JSON.stringify(newShape)}`\n );\n }\n\n finalShape = newShape.map((dim, i) => (i === negIndex ? inferredDim : dim));\n } else {\n finalShape = newShape;\n }\n\n // Validate that the new shape has the same total size\n const newSize = finalShape.reduce((a, b) => a * b, 1);\n if (newSize !== size) {\n throw new Error(\n `cannot reshape array of size ${size} into shape ${JSON.stringify(finalShape)}`\n );\n }\n\n // Fast path: if array is C-contiguous, create a view (no copy)\n if (storage.isCContiguous) {\n const data = storage.data;\n return ArrayStorage.fromData(data, finalShape, dtype, computeStrides(finalShape), 0);\n }\n\n // Slow path: array is not contiguous, must copy data first\n // Create contiguous copy, then reshape\n const contiguousCopy = storage.copy(); // copy() creates C-contiguous array\n const data = contiguousCopy.data;\n return ArrayStorage.fromData(data, finalShape, dtype, computeStrides(finalShape), 0);\n}\n\n/**\n * Return a flattened copy of the array\n * Creates 1D array containing all elements in row-major order\n * Always returns a copy (matching NumPy behavior)\n */\nexport function flatten(storage: ArrayStorage): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n const Constructor = getTypedArrayConstructor(dtype);\n\n if (!Constructor) {\n throw new Error(`Cannot flatten array with dtype ${dtype}`);\n }\n\n // Fast path: if array is C-contiguous, just copy the underlying data\n if (storage.isCContiguous) {\n const data = storage.data;\n const newData = data.slice(storage.offset, storage.offset + size);\n return ArrayStorage.fromData(newData as TypedArray, [size], dtype, [1], 0);\n }\n\n // Slow path: non-contiguous array, copy using iget (flat index)\n // This is much faster than recursive get(...indices) calls\n const newData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n for (let i = 0; i < size; i++) {\n const value = storage.iget(i);\n if (isBigInt) {\n (newData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(newData, [size], dtype, [1], 0);\n}\n\n/**\n * Return a flattened array (view when possible, otherwise copy)\n * Returns a view if array is C-contiguous, otherwise copies data\n */\nexport function ravel(storage: ArrayStorage): ArrayStorage {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Fast path: if array is C-contiguous, create a view (no copy needed)\n if (storage.isCContiguous) {\n const data = storage.data;\n return ArrayStorage.fromData(data, [size], dtype, [1], 0);\n }\n\n // Slow path: array is not contiguous, must copy like flatten()\n return flatten(storage);\n}\n\n/**\n * Transpose array (permute dimensions)\n * Returns a view with transposed dimensions\n */\nexport function transpose(storage: ArrayStorage, axes?: number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n let permutation: number[];\n\n if (axes === undefined) {\n // Default: reverse all dimensions\n permutation = Array.from({ length: ndim }, (_, i) => ndim - 1 - i);\n } else {\n // Validate axes\n if (axes.length !== ndim) {\n throw new Error(`axes must have length ${ndim}, got ${axes.length}`);\n }\n\n // Check that axes is a valid permutation\n const seen = new Set<number>();\n for (const axis of axes) {\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n if (seen.has(normalizedAxis)) {\n throw new Error(`repeated axis in transpose`);\n }\n seen.add(normalizedAxis);\n }\n\n permutation = axes.map((ax) => (ax < 0 ? ndim + ax : ax));\n }\n\n // Compute new shape and strides\n const newShape = permutation.map((i) => shape[i]!);\n const oldStrides = Array.from(strides);\n const newStrides = permutation.map((i) => oldStrides[i]!);\n\n // Create transposed view\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Remove axes of length 1\n * Returns a view with specified dimensions removed\n */\nexport function squeeze(storage: ArrayStorage, axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n if (axis === undefined) {\n // Remove all axes with size 1\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n for (let i = 0; i < ndim; i++) {\n if (shape[i] !== 1) {\n newShape.push(shape[i]!);\n newStrides.push(strides[i]!);\n }\n }\n\n // If all dimensions were 1, result would be a scalar (0-d array)\n // For now, keep at least one dimension\n if (newShape.length === 0) {\n newShape.push(1);\n newStrides.push(1);\n }\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n } else {\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Check that the axis has size 1\n if (shape[normalizedAxis] !== 1) {\n throw new Error(\n `cannot select an axis which has size not equal to one (axis ${axis} has size ${shape[normalizedAxis]})`\n );\n }\n\n // Remove the specified axis\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n for (let i = 0; i < ndim; i++) {\n if (i !== normalizedAxis) {\n newShape.push(shape[i]!);\n newStrides.push(strides[i]!);\n }\n }\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n }\n}\n\n/**\n * Expand the shape by inserting a new axis of length 1\n * Returns a view with additional dimension\n */\nexport function expandDims(storage: ArrayStorage, axis: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Normalize axis (can be from -ndim-1 to ndim)\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + axis + 1;\n }\n\n if (normalizedAxis < 0 || normalizedAxis > ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim + 1}`);\n }\n\n // Insert 1 at the specified position\n const newShape = [...Array.from(shape)];\n newShape.splice(normalizedAxis, 0, 1);\n\n // Insert a stride at the new axis position\n // The stride for a dimension of size 1 doesn't matter, but conventionally\n // it should be the product of all dimensions to its right\n const newStrides = [...Array.from(strides)];\n const insertedStride =\n normalizedAxis < ndim ? strides[normalizedAxis]! * (shape[normalizedAxis] || 1) : 1;\n newStrides.splice(normalizedAxis, 0, insertedStride);\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Swap two axes of an array\n * Returns a view with axes swapped\n */\nexport function swapaxes(storage: ArrayStorage, axis1: number, axis2: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const strides = storage.strides;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Normalize axes\n let normalizedAxis1 = axis1 < 0 ? ndim + axis1 : axis1;\n let normalizedAxis2 = axis2 < 0 ? ndim + axis2 : axis2;\n\n if (normalizedAxis1 < 0 || normalizedAxis1 >= ndim) {\n throw new Error(`axis1 ${axis1} is out of bounds for array of dimension ${ndim}`);\n }\n if (normalizedAxis2 < 0 || normalizedAxis2 >= ndim) {\n throw new Error(`axis2 ${axis2} is out of bounds for array of dimension ${ndim}`);\n }\n\n // If same axis, return a view without change\n if (normalizedAxis1 === normalizedAxis2) {\n return ArrayStorage.fromData(\n data,\n Array.from(shape),\n dtype,\n Array.from(strides),\n storage.offset\n );\n }\n\n // Swap shape and strides\n const newShape = Array.from(shape);\n const newStrides = Array.from(strides);\n\n [newShape[normalizedAxis1], newShape[normalizedAxis2]] = [\n newShape[normalizedAxis2]!,\n newShape[normalizedAxis1]!,\n ];\n [newStrides[normalizedAxis1], newStrides[normalizedAxis2]] = [\n newStrides[normalizedAxis2]!,\n newStrides[normalizedAxis1]!,\n ];\n\n return ArrayStorage.fromData(data, newShape, dtype, newStrides, storage.offset);\n}\n\n/**\n * Move axes to new positions\n * Returns a view with axes moved\n */\nexport function moveaxis(\n storage: ArrayStorage,\n source: number | number[],\n destination: number | number[]\n): ArrayStorage {\n const ndim = storage.ndim;\n\n // Convert to arrays\n const sourceArr = Array.isArray(source) ? source : [source];\n const destArr = Array.isArray(destination) ? destination : [destination];\n\n if (sourceArr.length !== destArr.length) {\n throw new Error('source and destination must have the same number of elements');\n }\n\n // Normalize axes\n const normalizedSource = sourceArr.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`source axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n const normalizedDest = destArr.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`destination axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n // Check for duplicate source/dest axes\n if (new Set(normalizedSource).size !== normalizedSource.length) {\n throw new Error('repeated axis in source');\n }\n if (new Set(normalizedDest).size !== normalizedDest.length) {\n throw new Error('repeated axis in destination');\n }\n\n // Build permutation\n // Start with axes not in source\n const order: number[] = [];\n for (let i = 0; i < ndim; i++) {\n if (!normalizedSource.includes(i)) {\n order.push(i);\n }\n }\n\n // Insert source axes at destination positions\n for (let i = 0; i < normalizedSource.length; i++) {\n const dst = normalizedDest[i]!;\n order.splice(dst, 0, normalizedSource[i]!);\n }\n\n return transpose(storage, order);\n}\n\n/**\n * Concatenate arrays along an axis\n */\nexport function concatenate(storages: ArrayStorage[], axis: number = 0): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to concatenate');\n }\n\n if (storages.length === 1) {\n return storages[0]!.copy();\n }\n\n const first = storages[0]!;\n const ndim = first.ndim;\n const dtype = first.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Validate shapes: all arrays must have same shape except along axis\n for (let i = 1; i < storages.length; i++) {\n const s = storages[i]!;\n if (s.ndim !== ndim) {\n throw new Error('all the input arrays must have same number of dimensions');\n }\n for (let d = 0; d < ndim; d++) {\n if (d !== normalizedAxis && s.shape[d] !== first.shape[d]) {\n throw new Error(\n `all the input array dimensions except for the concatenation axis must match exactly`\n );\n }\n }\n }\n\n // Calculate output shape\n const outputShape = Array.from(first.shape);\n let totalAlongAxis = first.shape[normalizedAxis]!;\n for (let i = 1; i < storages.length; i++) {\n totalAlongAxis += storages[i]!.shape[normalizedAxis]!;\n }\n outputShape[normalizedAxis] = totalAlongAxis;\n\n // Create output array\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot concatenate arrays with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Copy data from each input array\n let offset = 0;\n for (const storage of storages) {\n const axisSize = storage.shape[normalizedAxis]!;\n copyToOutput(storage, outputData, outputShape, outputStrides, normalizedAxis, offset, dtype);\n offset += axisSize;\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Helper to copy data into concatenated output\n */\nfunction copyToOutput(\n source: ArrayStorage,\n outputData: TypedArray,\n _outputShape: number[],\n outputStrides: number[],\n axis: number,\n axisOffset: number,\n dtype: string\n): void {\n const sourceShape = source.shape;\n const ndim = sourceShape.length;\n const sourceSize = source.size;\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n\n // Fast path: if concatenating along axis 0 and both are C-contiguous,\n // we can do bulk copy\n if (axis === 0 && source.isCContiguous && ndim > 0) {\n // Calculate the starting position in output array\n const outputOffset = axisOffset * outputStrides[0]!;\n const sourceData = source.data;\n const start = source.offset;\n const end = start + sourceSize;\n\n // Bulk copy the entire source array\n // @ts-expect-error - TypedArray.set() works with any typed array subarray\n outputData.set(sourceData.subarray(start, end), outputOffset);\n return;\n }\n\n // Optimized path for axis=1 (common for hstack): copy row by row\n if (axis === 1 && ndim === 2 && source.isCContiguous) {\n const rows = sourceShape[0]!;\n const cols = sourceShape[1]!;\n const outputCols = _outputShape[1]!;\n const sourceData = source.data;\n const sourceStart = source.offset;\n\n for (let row = 0; row < rows; row++) {\n const sourceRowStart = sourceStart + row * cols;\n const outputRowStart = row * outputCols + axisOffset;\n // @ts-expect-error - TypedArray.set() works with any typed array subarray\n outputData.set(sourceData.subarray(sourceRowStart, sourceRowStart + cols), outputRowStart);\n }\n return;\n }\n\n // Slow path: element-by-element copy using flat indices (iget)\n // Optimized to avoid array spread and pre-compute base offset\n const indices = new Array(ndim).fill(0);\n const baseOutputOffset = axisOffset * outputStrides[axis]!;\n\n for (let i = 0; i < sourceSize; i++) {\n // Get value from source using flat index\n const value = source.iget(i);\n\n // Compute output index more efficiently\n let outputIdx = baseOutputOffset;\n for (let d = 0; d < ndim; d++) {\n outputIdx += indices[d]! * outputStrides[d]!;\n }\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputIdx] =\n value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < sourceShape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n}\n\n/**\n * Stack arrays along a new axis\n */\nexport function stack(storages: ArrayStorage[], axis: number = 0): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n const first = storages[0]!;\n const shape = first.shape;\n const ndim = first.ndim;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + 1 + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis > ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim + 1}`);\n }\n\n // Validate shapes: all arrays must have exact same shape\n for (let i = 1; i < storages.length; i++) {\n const s = storages[i]!;\n if (s.ndim !== ndim) {\n throw new Error('all input arrays must have the same shape');\n }\n for (let d = 0; d < ndim; d++) {\n if (s.shape[d] !== shape[d]) {\n throw new Error('all input arrays must have the same shape');\n }\n }\n }\n\n // Expand dims on each array, then concatenate\n const expanded = storages.map((s) => expandDims(s, normalizedAxis));\n return concatenate(expanded, normalizedAxis);\n}\n\n/**\n * Stack arrays vertically (row-wise)\n * vstack is equivalent to concatenation along the first axis after\n * 1-D arrays of shape (N,) have been reshaped to (1,N)\n */\nexport function vstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // For 1D arrays, reshape to (1, N) first\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!]);\n }\n return s;\n });\n\n return concatenate(prepared, 0);\n}\n\n/**\n * Stack arrays horizontally (column-wise)\n * hstack is equivalent to concatenation along the second axis,\n * except for 1-D arrays where it concatenates along the first axis\n */\nexport function hstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // Check if all arrays are 1D\n const allOneDim = storages.every((s) => s.ndim === 1);\n\n if (allOneDim) {\n // For 1D arrays, concatenate along axis 0\n return concatenate(storages, 0);\n }\n\n // For higher-dimensional arrays, concatenate along axis 1\n return concatenate(storages, 1);\n}\n\n/**\n * Stack arrays depth-wise (along third axis)\n * dstack is equivalent to concatenation along the third axis after\n * 2-D arrays of shape (M,N) have been reshaped to (M,N,1) and\n * 1-D arrays of shape (N,) have been reshaped to (1,N,1)\n */\nexport function dstack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // Prepare arrays\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n // Reshape (N,) to (1, N, 1)\n return reshape(expandDims(reshape(s, [1, s.shape[0]!]), 2), [1, s.shape[0]!, 1]);\n } else if (s.ndim === 2) {\n // Reshape (M, N) to (M, N, 1)\n return expandDims(s, 2);\n }\n return s;\n });\n\n return concatenate(prepared, 2);\n}\n\n/**\n * Split array into sub-arrays\n */\nexport function split(\n storage: ArrayStorage,\n indicesOrSections: number | number[],\n axis: number = 0\n): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n let splitIndices: number[];\n\n if (typeof indicesOrSections === 'number') {\n // Split into N equal sections\n if (axisSize % indicesOrSections !== 0) {\n throw new Error(`array split does not result in an equal division`);\n }\n const sectionSize = axisSize / indicesOrSections;\n splitIndices = [];\n for (let i = 1; i < indicesOrSections; i++) {\n splitIndices.push(i * sectionSize);\n }\n } else {\n // Split at specified indices\n splitIndices = indicesOrSections;\n }\n\n return splitAtIndices(storage, splitIndices, normalizedAxis);\n}\n\n/**\n * Split array into sub-arrays (allows unequal splits)\n */\nexport function arraySplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[],\n axis: number = 0\n): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n let splitIndices: number[];\n\n if (typeof indicesOrSections === 'number') {\n // Split into N sections (may be unequal)\n const numSections = indicesOrSections;\n const sectionSize = Math.floor(axisSize / numSections);\n const remainder = axisSize % numSections;\n\n splitIndices = [];\n let offset = 0;\n for (let i = 0; i < numSections - 1; i++) {\n offset += sectionSize + (i < remainder ? 1 : 0);\n splitIndices.push(offset);\n }\n } else {\n // Split at specified indices\n splitIndices = indicesOrSections;\n }\n\n return splitAtIndices(storage, splitIndices, normalizedAxis);\n}\n\n/**\n * Helper to split array at specified indices\n */\nfunction splitAtIndices(storage: ArrayStorage, indices: number[], axis: number): ArrayStorage[] {\n const shape = storage.shape;\n const axisSize = shape[axis]!;\n\n // Add boundaries\n const boundaries = [0, ...indices, axisSize];\n const result: ArrayStorage[] = [];\n\n for (let i = 0; i < boundaries.length - 1; i++) {\n const start = boundaries[i]!;\n const end = boundaries[i + 1]!;\n\n if (start > end) {\n throw new Error('split indices must be in ascending order');\n }\n\n // Create slice\n const sliceShape = Array.from(shape);\n sliceShape[axis] = end - start;\n\n // Calculate new offset and strides\n const newOffset = storage.offset + start * storage.strides[axis]!;\n\n result.push(\n ArrayStorage.fromData(\n storage.data,\n sliceShape,\n storage.dtype,\n Array.from(storage.strides),\n newOffset\n )\n );\n }\n\n return result;\n}\n\n/**\n * Split array vertically (row-wise)\n */\nexport function vsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 2) {\n throw new Error('vsplit only works on arrays of 2 or more dimensions');\n }\n return arraySplit(storage, indicesOrSections, 0);\n}\n\n/**\n * Split array horizontally (column-wise)\n */\nexport function hsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 1) {\n throw new Error('hsplit only works on arrays of 1 or more dimensions');\n }\n // For 1D arrays, split along axis 0; for higher dims, split along axis 1\n const axis = storage.ndim === 1 ? 0 : 1;\n return arraySplit(storage, indicesOrSections, axis);\n}\n\n/**\n * Tile array by repeating along each axis\n */\nexport function tile(storage: ArrayStorage, reps: number | number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize reps to array\n const repsArr = Array.isArray(reps) ? reps : [reps];\n\n // Pad reps or shape to match dimensions\n const maxDim = Math.max(ndim, repsArr.length);\n const paddedShape = new Array(maxDim).fill(1);\n const paddedReps = new Array(maxDim).fill(1);\n\n // Fill from the right\n for (let i = 0; i < ndim; i++) {\n paddedShape[maxDim - ndim + i] = shape[i]!;\n }\n for (let i = 0; i < repsArr.length; i++) {\n paddedReps[maxDim - repsArr.length + i] = repsArr[i]!;\n }\n\n // Calculate output shape\n const outputShape = paddedShape.map((s, i) => s * paddedReps[i]!);\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot tile array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // If we need to expand dimensions of input, reshape it\n let expandedStorage = storage;\n if (ndim < maxDim) {\n expandedStorage = reshape(storage, paddedShape);\n }\n\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n const expandedStrides = expandedStorage.strides;\n\n // Fill output by iterating through all output positions\n const outputIndices = new Array(maxDim).fill(0);\n\n for (let i = 0; i < outputSize; i++) {\n // Compute source flat index directly (wrap around for tiling)\n let sourceFlatIdx = expandedStorage.offset;\n for (let d = 0; d < maxDim; d++) {\n const sourceIdx = outputIndices[d]! % paddedShape[d]!;\n sourceFlatIdx += sourceIdx * expandedStrides[d]!;\n }\n\n // Read value directly from flat index\n const value = expandedStorage.data[sourceFlatIdx];\n\n // Write to output using direct index calculation\n let outputIdx = 0;\n for (let d = 0; d < maxDim; d++) {\n outputIdx += outputIndices[d]! * outputStrides[d]!;\n }\n\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputIdx] =\n value as number;\n }\n\n // Increment indices\n for (let d = maxDim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < outputShape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Repeat elements of an array\n */\nexport function repeat(\n storage: ArrayStorage,\n repeats: number | number[],\n axis?: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n if (axis === undefined) {\n // Flatten and repeat each element\n const flatSize = size;\n const repeatsArr = Array.isArray(repeats) ? repeats : new Array(flatSize).fill(repeats);\n\n if (repeatsArr.length !== flatSize) {\n throw new Error(\n `operands could not be broadcast together with shape (${flatSize},) (${repeatsArr.length},)`\n );\n }\n\n const outputSize = repeatsArr.reduce((a, b) => a + b, 0);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot repeat array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n let outIdx = 0;\n for (let i = 0; i < flatSize; i++) {\n const value = storage.iget(i);\n const rep = repeatsArr[i]!;\n for (let r = 0; r < rep; r++) {\n if (dtype === 'int64' || dtype === 'uint64') {\n (outputData as BigInt64Array | BigUint64Array)[outIdx++] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx++] =\n value as number;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, [outputSize], dtype);\n }\n\n // Repeat along specified axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const repeatsArr = Array.isArray(repeats) ? repeats : new Array(axisSize).fill(repeats);\n\n if (repeatsArr.length !== axisSize) {\n throw new Error(\n `operands could not be broadcast together with shape (${axisSize},) (${repeatsArr.length},)`\n );\n }\n\n // Calculate output shape\n const outputShape = Array.from(shape);\n outputShape[normalizedAxis] = repeatsArr.reduce((a, b) => a + b, 0);\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot repeat array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Iterate through source and write repeated values\n const sourceIndices = new Array(ndim).fill(0);\n const isBigInt = dtype === 'int64' || dtype === 'uint64';\n\n // Track cumulative positions along axis\n const axisPositions: number[] = [0];\n for (let i = 0; i < axisSize; i++) {\n axisPositions.push(axisPositions[i]! + repeatsArr[i]!);\n }\n\n for (let i = 0; i < size; i++) {\n // Use iget for flat index access instead of get(...indices)\n const value = storage.iget(i);\n const axisIdx = sourceIndices[normalizedAxis]!;\n const rep = repeatsArr[axisIdx]!;\n\n // Calculate base output index (without axis component)\n let baseOutIdx = 0;\n for (let d = 0; d < ndim; d++) {\n if (d !== normalizedAxis) {\n baseOutIdx += sourceIndices[d]! * outputStrides[d]!;\n }\n }\n\n // Write repeated values\n const axisStride = outputStrides[normalizedAxis]!;\n const axisStart = axisPositions[axisIdx]!;\n for (let r = 0; r < rep; r++) {\n const outIdx = baseOutIdx + (axisStart + r) * axisStride;\n\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] =\n value as number;\n }\n }\n\n // Increment source indices\n for (let d = ndim - 1; d >= 0; d--) {\n sourceIndices[d]++;\n if (sourceIndices[d]! < shape[d]!) {\n break;\n }\n sourceIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Reverse the order of elements in an array along given axis\n */\nexport function flip(storage: ArrayStorage, axis?: number | number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n // Determine which axes to flip\n let axesToFlip: Set<number>;\n if (axis === undefined) {\n // Flip all axes\n axesToFlip = new Set(Array.from({ length: ndim }, (_, i) => i));\n } else if (typeof axis === 'number') {\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n axesToFlip = new Set([normalizedAxis]);\n } else {\n axesToFlip = new Set(\n axis.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n })\n );\n }\n\n // Create output array\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot flip array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n // Fast path for 1D arrays\n if (ndim === 1 && storage.isCContiguous) {\n const sourceData = storage.data;\n const start = storage.offset;\n for (let i = 0; i < size; i++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = sourceData[\n start + size - 1 - i\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = sourceData[\n start + size - 1 - i\n ] as number;\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n // Fast path for 2D arrays\n if (ndim === 2 && storage.isCContiguous) {\n const rows = shape[0]!;\n const cols = shape[1]!;\n const sourceData = storage.data;\n const start = storage.offset;\n\n // Flipping both axes - reverse entire array\n if (axesToFlip.size === 2) {\n for (let i = 0; i < size; i++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = sourceData[\n start + size - 1 - i\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = sourceData[\n start + size - 1 - i\n ] as number;\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n if (axesToFlip.size === 1) {\n if (axesToFlip.has(0)) {\n // Flip rows: copy rows in reverse order\n for (let r = 0; r < rows; r++) {\n const sourceRowStart = start + (rows - 1 - r) * cols;\n const outputRowStart = r * cols;\n for (let c = 0; c < cols; c++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputRowStart + c] = sourceData[\n sourceRowStart + c\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[\n outputRowStart + c\n ] = sourceData[sourceRowStart + c] as number;\n }\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n } else if (axesToFlip.has(1)) {\n // Flip columns: reverse each row\n for (let r = 0; r < rows; r++) {\n const sourceRowStart = start + r * cols;\n const outputRowStart = r * cols;\n for (let c = 0; c < cols; c++) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputRowStart + c] = sourceData[\n sourceRowStart + cols - 1 - c\n ] as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[\n outputRowStart + c\n ] = sourceData[sourceRowStart + cols - 1 - c] as number;\n }\n }\n }\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n }\n }\n\n // General path: element-by-element copy\n const sourceIndices = new Array(ndim);\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n // Compute source indices by flipping the specified axes\n for (let d = 0; d < ndim; d++) {\n sourceIndices[d] = axesToFlip.has(d) ? shape[d]! - 1 - outputIndices[d]! : outputIndices[d];\n }\n\n // Get value from source\n let sourceOffset = storage.offset;\n for (let d = 0; d < ndim; d++) {\n sourceOffset += sourceIndices[d]! * storage.strides[d]!;\n }\n const value = storage.data[sourceOffset];\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n\n // Increment output indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < shape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n}\n\n/**\n * Rotate array by 90 degrees in the plane specified by axes\n */\nexport function rot90(\n storage: ArrayStorage,\n k: number = 1,\n axes: [number, number] = [0, 1]\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n if (ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n\n // Normalize axes\n const axis0 = axes[0] < 0 ? ndim + axes[0] : axes[0];\n const axis1 = axes[1] < 0 ? ndim + axes[1] : axes[1];\n\n if (axis0 < 0 || axis0 >= ndim || axis1 < 0 || axis1 >= ndim) {\n throw new Error(`Axes are out of bounds for array of dimension ${ndim}`);\n }\n\n if (axis0 === axis1) {\n throw new Error('Axes must be different');\n }\n\n // Normalize k to 0-3\n k = ((k % 4) + 4) % 4;\n\n if (k === 0) {\n return storage.copy();\n }\n\n // Optimized: do the rotation in one pass instead of k iterations\n // k=1: flip axis1, transpose\n // k=2: flip both axes\n // k=3: flip axis0, transpose\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot rotate array with dtype ${dtype}`);\n }\n\n const outputShape = [...shape];\n if (k === 1 || k === 3) {\n // Swap dimensions for axis0 and axis1\n [outputShape[axis0], outputShape[axis1]] = [outputShape[axis1]!, outputShape[axis0]!];\n }\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n const isBigInt = isBigIntDType(dtype);\n\n const indices = new Array(ndim).fill(0);\n const sourceIndices = new Array(ndim);\n\n for (let i = 0; i < storage.size; i++) {\n // Transform indices based on k\n for (let d = 0; d < ndim; d++) {\n sourceIndices[d] = indices[d];\n }\n\n let outIdx0, outIdx1;\n if (k === 1) {\n // 90 degrees: flip axis1, then transpose\n outIdx0 = shape[axis1]! - 1 - indices[axis1]!;\n outIdx1 = indices[axis0];\n } else if (k === 2) {\n // 180 degrees: flip both axes\n outIdx0 = shape[axis0]! - 1 - indices[axis0]!;\n outIdx1 = shape[axis1]! - 1 - indices[axis1]!;\n sourceIndices[axis0] = outIdx0;\n sourceIndices[axis1] = outIdx1;\n } else {\n // k === 3, 270 degrees: flip axis0, then transpose\n outIdx0 = indices[axis1];\n outIdx1 = shape[axis0]! - 1 - indices[axis0]!;\n }\n\n if (k !== 2) {\n sourceIndices[axis0] = outIdx0;\n sourceIndices[axis1] = outIdx1;\n }\n\n // Compute output offset\n let outputOffset = 0;\n for (let d = 0; d < ndim; d++) {\n outputOffset += sourceIndices[d]! * outputStrides[d]!;\n }\n\n // Get source value\n const value = storage.iget(i);\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outputOffset] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outputOffset] =\n value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < shape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Roll array elements along a given axis\n */\nexport function roll(\n storage: ArrayStorage,\n shift: number | number[],\n axis?: number | number[]\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const size = storage.size;\n\n // Handle no axis case - roll as flattened array\n if (axis === undefined) {\n const flatShift = Array.isArray(shift) ? shift.reduce((a, b) => a + b, 0) : shift;\n const flatStorage = flatten(storage);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot roll array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n for (let i = 0; i < size; i++) {\n const sourceIdx = (((i - flatShift) % size) + size) % size;\n const value = flatStorage.iget(sourceIdx);\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n // Reshape back to original shape\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n }\n\n // Handle axis specified case\n const shifts = Array.isArray(shift) ? shift : [shift];\n const axes = Array.isArray(axis) ? axis : [axis];\n\n if (shifts.length !== axes.length) {\n throw new Error('shift and axis must have the same length');\n }\n\n // Normalize axes\n const normalizedAxes = axes.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n\n // Create output array\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot roll array with dtype ${dtype}`);\n }\n const outputData = new Constructor(size);\n const isBigInt = isBigIntDType(dtype);\n\n // Iterate through all output positions\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n // Compute source indices by rolling back\n const sourceIndices = [...outputIndices];\n for (let j = 0; j < normalizedAxes.length; j++) {\n const ax = normalizedAxes[j]!;\n const axisSize = shape[ax]!;\n const sh = shifts[j]!;\n sourceIndices[ax] = (((sourceIndices[ax]! - sh) % axisSize) + axisSize) % axisSize;\n }\n\n // Get value from source\n let sourceOffset = storage.offset;\n for (let d = 0; d < ndim; d++) {\n sourceOffset += sourceIndices[d]! * storage.strides[d]!;\n }\n const value = storage.data[sourceOffset];\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n\n // Increment output indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < shape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, [...shape], dtype);\n}\n\n/**\n * Roll the specified axis backwards until it lies in a given position\n */\nexport function rollaxis(storage: ArrayStorage, axis: number, start: number = 0): ArrayStorage {\n const ndim = storage.ndim;\n\n // Normalize axis\n let normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Normalize start\n let normalizedStart = start < 0 ? ndim + start : start;\n if (normalizedStart < 0 || normalizedStart > ndim) {\n throw new Error(`start ${start} is out of bounds`);\n }\n\n if (normalizedAxis < normalizedStart) {\n normalizedStart--;\n }\n\n if (normalizedAxis === normalizedStart) {\n return ArrayStorage.fromData(\n storage.data,\n Array.from(storage.shape),\n storage.dtype,\n Array.from(storage.strides),\n storage.offset\n );\n }\n\n return moveaxis(storage, normalizedAxis, normalizedStart);\n}\n\n/**\n * Split array along third axis (depth)\n */\nexport function dsplit(\n storage: ArrayStorage,\n indicesOrSections: number | number[]\n): ArrayStorage[] {\n if (storage.ndim < 3) {\n throw new Error('dsplit only works on arrays of 3 or more dimensions');\n }\n return arraySplit(storage, indicesOrSections, 2);\n}\n\n/**\n * Stack 1-D arrays as columns into a 2-D array\n */\nexport function columnStack(storages: ArrayStorage[]): ArrayStorage {\n if (storages.length === 0) {\n throw new Error('need at least one array to stack');\n }\n\n // If all arrays are 1D, reshape them to column vectors\n const prepared = storages.map((s) => {\n if (s.ndim === 1) {\n return reshape(s, [s.shape[0]!, 1]);\n }\n return s;\n });\n\n return hstack(prepared);\n}\n\n/**\n * Stack arrays in sequence vertically (row_stack is an alias for vstack)\n */\nexport const rowStack = vstack;\n\n/**\n * Resize array to new shape (returns new array, may repeat or truncate)\n */\nexport function resize(storage: ArrayStorage, newShape: number[]): ArrayStorage {\n const dtype = storage.dtype;\n const newSize = newShape.reduce((a, b) => a * b, 1);\n const oldSize = storage.size;\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot resize array with dtype ${dtype}`);\n }\n const outputData = new Constructor(newSize);\n const isBigInt = isBigIntDType(dtype);\n\n // Fill output by cycling through source data\n for (let i = 0; i < newSize; i++) {\n const sourceIdx = i % oldSize;\n const value = storage.iget(sourceIdx);\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, newShape, dtype);\n}\n\n/**\n * Convert arrays to at least 1D\n */\nexport function atleast1d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n // 0-D array -> 1-D with one element\n return reshape(s, [1]);\n }\n return s;\n });\n}\n\n/**\n * Convert arrays to at least 2D\n */\nexport function atleast2d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n return reshape(s, [1, 1]);\n } else if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!]);\n }\n return s;\n });\n}\n\n/**\n * Convert arrays to at least 3D\n */\nexport function atleast3d(storages: ArrayStorage[]): ArrayStorage[] {\n return storages.map((s) => {\n if (s.ndim === 0) {\n return reshape(s, [1, 1, 1]);\n } else if (s.ndim === 1) {\n return reshape(s, [1, s.shape[0]!, 1]);\n } else if (s.ndim === 2) {\n return reshape(s, [s.shape[0]!, s.shape[1]!, 1]);\n }\n return s;\n });\n}\n", "/**\n * Linear algebra operations\n *\n * Pure functions for matrix operations (matmul, etc.).\n * @module ops/linalg\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { promoteDTypes } from '../core/dtype';\nimport * as shapeOps from './shape';\n\n/**\n * BLAS-like types for matrix operations\n */\ntype Layout = 'row-major' | 'column-major';\ntype Transpose = 'no-transpose' | 'transpose';\n\n/**\n * Double-precision general matrix multiply (DGEMM)\n *\n * Full BLAS-compatible implementation without external dependencies.\n * Performs: C = alpha * op(A) * op(B) + beta * C\n *\n * Supports all combinations of:\n * - Row-major and column-major layouts\n * - Transpose and no-transpose operations\n * - Arbitrary alpha and beta scalars\n *\n * Uses specialized loops for each case to avoid function call overhead.\n *\n * @internal\n */\nfunction dgemm(\n layout: Layout,\n transA: Transpose,\n transB: Transpose,\n M: number, // rows of op(A) and C\n N: number, // cols of op(B) and C\n K: number, // cols of op(A) and rows of op(B)\n alpha: number, // scalar alpha\n A: Float64Array, // matrix A\n lda: number, // leading dimension of A\n B: Float64Array, // matrix B\n ldb: number, // leading dimension of B\n beta: number, // scalar beta\n C: Float64Array, // matrix C (output)\n ldc: number // leading dimension of C\n): void {\n // Apply beta scaling to C first\n if (beta === 0) {\n for (let i = 0; i < M * N; i++) {\n C[i] = 0;\n }\n } else if (beta !== 1) {\n for (let i = 0; i < M * N; i++) {\n C[i] = (C[i] ?? 0) * beta;\n }\n }\n\n // Select specialized loop based on layout and transpose modes\n // This avoids function call overhead in the hot loop\n const isRowMajor = layout === 'row-major';\n const transposeA = transA === 'transpose';\n const transposeB = transB === 'transpose';\n\n if (isRowMajor && !transposeA && !transposeB) {\n // Row-major, no transpose (most common case)\n // C[i,j] = sum_k A[i,k] * B[k,j]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && transposeA && !transposeB) {\n // Row-major, A transposed\n // C[i,j] = sum_k A[k,i] * B[k,j]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && !transposeA && transposeB) {\n // Row-major, B transposed\n // C[i,j] = sum_k A[i,k] * B[j,k]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (isRowMajor && transposeA && transposeB) {\n // Row-major, both transposed\n // C[i,j] = sum_k A[k,i] * B[j,k]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[i * ldc + j] = (C[i * ldc + j] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && !transposeA && !transposeB) {\n // Column-major, no transpose\n // C[i,j] = sum_k A[i,k] * B[k,j]\n // Column-major: A[i,k] = A[k*lda + i], C[i,j] = C[j*ldc + i]\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && transposeA && !transposeB) {\n // Column-major, A transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[j * ldb + k] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else if (!isRowMajor && !transposeA && transposeB) {\n // Column-major, B transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[k * lda + i] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n } else {\n // Column-major, both transposed\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < N; j++) {\n let sum = 0;\n for (let k = 0; k < K; k++) {\n sum += (A[i * lda + k] ?? 0) * (B[k * ldb + j] ?? 0);\n }\n C[j * ldc + i] = (C[j * ldc + i] ?? 0) + alpha * sum;\n }\n }\n }\n}\n\n/**\n * Dot product of two arrays (fully NumPy-compatible)\n *\n * Behavior depends on input dimensions:\n * - 0D \u00B7 0D: Multiply scalars \u2192 scalar\n * - 0D \u00B7 ND or ND \u00B7 0D: Element-wise multiply \u2192 ND\n * - 1D \u00B7 1D: Inner product \u2192 scalar\n * - 2D \u00B7 2D: Matrix multiplication \u2192 2D\n * - 2D \u00B7 1D: Matrix-vector product \u2192 1D\n * - 1D \u00B7 2D: Vector-matrix product \u2192 1D\n * - ND \u00B7 1D (N\u22652): Sum product over last axis of a \u2192 (N-1)D\n * - 1D \u00B7 ND (N\u22652): Sum product over first axis of b \u2192 (N-1)D\n * - ND \u00B7 MD (N,M\u22652): Sum product over last axis of a and second-to-last of b \u2192 (N+M-2)D\n *\n * For 2D\u00B72D, prefer using matmul() instead.\n */\nexport function dot(a: ArrayStorage, b: ArrayStorage): ArrayStorage | number | bigint {\n const aDim = a.ndim;\n const bDim = b.ndim;\n\n // Case 0: Scalar (0D) cases - treat as multiplication\n if (aDim === 0 || bDim === 0) {\n // Get scalar values\n const aVal = aDim === 0 ? a.get() : null;\n const bVal = bDim === 0 ? b.get() : null;\n\n if (aDim === 0 && bDim === 0) {\n // Both scalars: multiply them\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n return aVal * bVal;\n }\n return Number(aVal) * Number(bVal);\n } else if (aDim === 0) {\n // a is scalar, b is array: scalar * array (element-wise)\n // Equivalent to multiply(a, b)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([...b.shape], resultDtype);\n for (let i = 0; i < b.size; i++) {\n const bData = b.data[i + b.offset];\n if (typeof aVal === 'bigint' && typeof bData === 'bigint') {\n result.data[i] = aVal * bData;\n } else {\n result.data[i] = Number(aVal) * Number(bData);\n }\n }\n return result;\n } else {\n // b is scalar, a is array: array * scalar (element-wise)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([...a.shape], resultDtype);\n for (let i = 0; i < a.size; i++) {\n const aData = a.data[i + a.offset];\n if (typeof aData === 'bigint' && typeof bVal === 'bigint') {\n result.data[i] = aData * bVal;\n } else {\n result.data[i] = Number(aData) * Number(bVal);\n }\n }\n return result;\n }\n }\n\n // Case 1: Both 1D -> scalar (inner product)\n if (aDim === 1 && bDim === 1) {\n if (a.shape[0] !== b.shape[0]) {\n throw new Error(`dot: incompatible shapes (${a.shape[0]},) and (${b.shape[0]},)`);\n }\n const n = a.shape[0]!;\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const aVal = a.get(i);\n const bVal = b.get(i);\n // Handle BigInt\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n return sum;\n }\n\n // Case 2: Both 2D -> matrix multiplication (delegate to matmul)\n if (aDim === 2 && bDim === 2) {\n return matmul(a, b);\n }\n\n // Case 3: 2D \u00B7 1D -> matrix-vector product (returns 1D)\n if (aDim === 2 && bDim === 1) {\n const [m, k] = a.shape;\n const n = b.shape[0]!;\n if (k !== n) {\n throw new Error(`dot: incompatible shapes (${m},${k}) and (${n},)`);\n }\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([m!], resultDtype);\n\n for (let i = 0; i < m!; i++) {\n let sum = 0;\n for (let j = 0; j < k!; j++) {\n const aVal = a.get(i, j);\n const bVal = b.get(j);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set([i], sum);\n }\n\n return result;\n }\n\n // Case 4: 1D \u00B7 2D -> vector-matrix product (returns 1D)\n if (aDim === 1 && bDim === 2) {\n const m = a.shape[0]!;\n const [k, n] = b.shape;\n if (m !== k) {\n throw new Error(`dot: incompatible shapes (${m},) and (${k},${n})`);\n }\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([n!], resultDtype);\n\n for (let j = 0; j < n!; j++) {\n let sum = 0;\n for (let i = 0; i < m; i++) {\n const aVal = a.get(i);\n const bVal = b.get(i, j);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set([j], sum);\n }\n\n return result;\n }\n\n // Case 5: ND \u00B7 1D (N > 2) -> sum product over last axis, result is (N-1)D\n if (aDim > 2 && bDim === 1) {\n const lastDimA = a.shape[aDim - 1]!;\n const bSize = b.shape[0]!;\n if (lastDimA !== bSize) {\n throw new Error(`dot: incompatible shapes ${JSON.stringify(a.shape)} and (${bSize},)`);\n }\n\n // Result shape is a.shape[:-1]\n const resultShape = [...a.shape.slice(0, -1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n // Iterate over all positions in result\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n for (let i = 0; i < resultSize; i++) {\n let sum = 0;\n // Compute multi-dimensional index for result\n let temp = i;\n const resultIdx: number[] = [];\n for (let d = resultShape.length - 1; d >= 0; d--) {\n resultIdx[d] = temp % resultShape[d]!;\n temp = Math.floor(temp / resultShape[d]!);\n }\n\n // Sum over the last dimension of a\n for (let k = 0; k < lastDimA; k++) {\n const aIdx = [...resultIdx, k];\n const aVal = a.get(...aIdx);\n const bVal = b.get(k);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set(resultIdx, sum);\n }\n\n return result;\n }\n\n // Case 6: 1D \u00B7 ND (N > 2) -> sum product over SECOND axis of b, result is (b.shape[0], b.shape[2:])\n // Actually for 1D\u00B73D: sum over axis 1 of b\n // For general case: need to handle this more carefully\n if (aDim === 1 && bDim > 2) {\n const aSize = a.shape[0]!;\n // For 1D (size K) \u00B7 ND, we contract over axis 1 of b (which should have size K)\n const contractAxisB = 1;\n const contractDimB = b.shape[contractAxisB]!;\n\n if (aSize !== contractDimB) {\n throw new Error(`dot: incompatible shapes (${aSize},) and ${JSON.stringify(b.shape)}`);\n }\n\n // Result shape: b.shape[0:1] + b.shape[2:]\n // For (K,) \u00B7 (L, K, M, N, ...) -> (L, M, N, ...)\n const resultShape = [...b.shape.slice(0, contractAxisB), ...b.shape.slice(contractAxisB + 1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n // Compute using multi-dimensional indices\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n for (let i = 0; i < resultSize; i++) {\n // Convert flat index to multi-dim result index\n let temp = i;\n const resultIdx: number[] = [];\n for (let d = resultShape.length - 1; d >= 0; d--) {\n resultIdx[d] = temp % resultShape[d]!;\n temp = Math.floor(temp / resultShape[d]!);\n }\n\n // Build b index by inserting the contract dimension\n // result[i,j,...] corresponds to b[i, :, j, ...]\n const bIdxBefore = resultIdx.slice(0, contractAxisB);\n const bIdxAfter = resultIdx.slice(contractAxisB);\n\n let sum = 0;\n for (let k = 0; k < aSize; k++) {\n const aVal = a.get(k);\n const bIdx = [...bIdxBefore, k, ...bIdxAfter];\n const bVal = b.get(...bIdx);\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n result.set(resultIdx, sum);\n }\n\n return result;\n }\n\n // Case 7: ND \u00B7 MD (N,M \u2265 2, not both 2) -> general tensor contraction\n // Result shape: a.shape[:-1] + b.shape[:-2] + b.shape[-1:]\n if (aDim >= 2 && bDim >= 2 && !(aDim === 2 && bDim === 2)) {\n const lastDimA = a.shape[aDim - 1]!;\n const secondLastDimB = b.shape[bDim - 2]!;\n\n if (lastDimA !== secondLastDimB) {\n throw new Error(\n `dot: incompatible shapes ${JSON.stringify(a.shape)} and ${JSON.stringify(b.shape)}`\n );\n }\n\n // Build result shape\n const resultShape = [...a.shape.slice(0, -1), ...b.shape.slice(0, -2), b.shape[bDim - 1]!];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const aOuterSize = a.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const bOuterSize = b.shape.slice(0, -2).reduce((acc, dim) => acc * dim, 1);\n const bLastDim = b.shape[bDim - 1]!;\n const contractionDim = lastDimA;\n\n // Iterate: result[i, j, k] = sum_m a[i, m] * b[j, m, k]\n for (let i = 0; i < aOuterSize; i++) {\n for (let j = 0; j < bOuterSize; j++) {\n for (let k = 0; k < bLastDim; k++) {\n let sum = 0;\n for (let m = 0; m < contractionDim; m++) {\n // Get a[i, m] - need to convert flat index i to multi-dim\n const aIdx = i * contractionDim + m;\n const aVal = a.data[aIdx + a.offset];\n\n // Get b[j, m, k] - need multi-dim indexing\n const bIdx = j * contractionDim * bLastDim + m * bLastDim + k;\n const bVal = b.data[bIdx + b.offset];\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n // Set result at the appropriate position\n const resultIdx = i * bOuterSize * bLastDim + j * bLastDim + k;\n result.data[resultIdx] = sum;\n }\n }\n }\n\n return result;\n }\n\n // Should never reach here - all cases covered\n throw new Error(`dot: unexpected combination of dimensions ${aDim}D \u00B7 ${bDim}D`);\n}\n\n/**\n * Matrix multiplication\n * Requires 2D arrays with compatible shapes\n *\n * Automatically detects transposed/non-contiguous arrays via strides\n * and uses appropriate DGEMM transpose parameters.\n *\n * Note: Currently uses float64 precision for all operations.\n * Integer inputs are promoted to float64 (matching NumPy behavior).\n */\nexport function matmul(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n if (a.ndim !== 2 || b.ndim !== 2) {\n throw new Error('matmul requires 2D arrays');\n }\n\n const [m = 0, k = 0] = a.shape;\n const [k2 = 0, n = 0] = b.shape;\n\n if (k !== k2) {\n throw new Error(`matmul shape mismatch: (${m},${k}) @ (${k2},${n})`);\n }\n\n // Determine result dtype (promote inputs, but use float64 for integer types)\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const computeDtype =\n resultDtype.startsWith('int') || resultDtype.startsWith('uint') || resultDtype === 'bool'\n ? 'float64'\n : resultDtype;\n\n // For now, we only support float64 matmul (using dgemm)\n // TODO: Add float32 support using sgemm\n if (computeDtype !== 'float64') {\n throw new Error(`matmul currently only supports float64, got ${computeDtype}`);\n }\n\n // Convert inputs to Float64Array if needed\n let aData =\n a.dtype === 'float64'\n ? (a.data as Float64Array)\n : Float64Array.from(Array.from(a.data as ArrayLike<number>).map(Number));\n let bData =\n b.dtype === 'float64'\n ? (b.data as Float64Array)\n : Float64Array.from(Array.from(b.data as ArrayLike<number>).map(Number));\n\n // Handle offset for sliced arrays (views)\n // If the array has an offset, we need to pass the subarray starting from that offset\n if (a.offset > 0) {\n aData = aData.subarray(a.offset) as Float64Array;\n }\n if (b.offset > 0) {\n bData = bData.subarray(b.offset) as Float64Array;\n }\n\n // Detect array layout from strides\n // Row-major (C-contiguous): row stride > col stride\n // Transposed (F-contiguous or transposed view): col stride > row stride\n const [aStrideRow = 0, aStrideCol = 0] = a.strides;\n const [bStrideRow = 0, bStrideCol = 0] = b.strides;\n\n // Determine if arrays are effectively transposed\n // For a normal MxK array: strides are [K, 1] (row stride = K cols)\n // For a transposed KxM array (viewed as MxK): strides are [1, M] (col stride > row stride)\n const aIsTransposed = aStrideCol > aStrideRow;\n const bIsTransposed = bStrideCol > bStrideRow;\n\n const transA: Transpose = aIsTransposed ? 'transpose' : 'no-transpose';\n const transB: Transpose = bIsTransposed ? 'transpose' : 'no-transpose';\n\n // Determine leading dimensions based on memory layout\n // Leading dimension is the stride of the major dimension in memory\n let lda: number;\n let ldb: number;\n\n if (aIsTransposed) {\n // Array is stored with columns contiguous (F-order or transposed)\n // The leading dimension is how many elements to skip between columns\n lda = aStrideCol;\n } else {\n // Array is row-major (C-order)\n // The leading dimension is the row stride (number of elements per row)\n lda = aStrideRow;\n }\n\n if (bIsTransposed) {\n ldb = bStrideCol;\n } else {\n ldb = bStrideRow;\n }\n\n // Create result array (always row-major)\n const result = ArrayStorage.zeros([m, n], 'float64');\n\n // Call dgemm with detected transpose flags and leading dimensions\n dgemm(\n 'row-major',\n transA,\n transB,\n m,\n n,\n k,\n 1.0, // alpha\n aData,\n lda, // leading dimension of a (accounts for actual memory layout)\n bData,\n ldb, // leading dimension of b (accounts for actual memory layout)\n 0.0, // beta\n result.data as Float64Array,\n n // ldc (result is always row-major with n cols)\n );\n\n return result;\n}\n\n/**\n * Sum along the diagonal of a 2D array\n *\n * Computes the trace (sum of diagonal elements) of a matrix.\n * For non-square matrices, sums along the diagonal up to min(rows, cols).\n *\n * @param a - Input 2D array\n * @returns Sum of diagonal elements\n */\nexport function trace(a: ArrayStorage): number | bigint {\n if (a.ndim !== 2) {\n throw new Error(`trace requires 2D array, got ${a.ndim}D`);\n }\n\n const [rows = 0, cols = 0] = a.shape;\n const diagLen = Math.min(rows, cols);\n\n let sum: number | bigint = 0;\n\n for (let i = 0; i < diagLen; i++) {\n const val = a.get(i, i);\n if (typeof val === 'bigint') {\n sum = (typeof sum === 'bigint' ? sum : BigInt(sum)) + val;\n } else {\n sum = (typeof sum === 'bigint' ? Number(sum) : sum) + val;\n }\n }\n\n return sum;\n}\n\n/**\n * Permute the dimensions of an array\n *\n * Standalone version of NDArray.transpose() method.\n * Returns a view with axes permuted.\n *\n * @param a - Input array\n * @param axes - Optional permutation of axes (defaults to reverse order)\n * @returns Transposed view\n */\nexport function transpose(a: ArrayStorage, axes?: number[]): ArrayStorage {\n return shapeOps.transpose(a, axes);\n}\n\n/**\n * Inner product of two arrays\n *\n * Computes sum product over the LAST axes of both a and b.\n * - 1D \u00B7 1D: Same as dot (ordinary inner product) \u2192 scalar\n * - ND \u00B7 MD: Contracts last dimension of each \u2192 (*a.shape[:-1], *b.shape[:-1])\n *\n * Different from dot: always uses last axis of BOTH arrays.\n *\n * @param a - First array\n * @param b - Second array\n * @returns Inner product result\n */\nexport function inner(a: ArrayStorage, b: ArrayStorage): ArrayStorage | number | bigint {\n const aDim = a.ndim;\n const bDim = b.ndim;\n\n // Last dimensions must match\n const aLastDim = a.shape[aDim - 1]!;\n const bLastDim = b.shape[bDim - 1]!;\n\n if (aLastDim !== bLastDim) {\n throw new Error(\n `inner: incompatible shapes - last dimensions ${aLastDim} and ${bLastDim} don't match`\n );\n }\n\n // Special case: both 1D -> scalar\n if (aDim === 1 && bDim === 1) {\n return dot(a, b) as number;\n }\n\n // General case: result shape is a.shape[:-1] + b.shape[:-1]\n const resultShape = [...a.shape.slice(0, -1), ...b.shape.slice(0, -1)];\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const aOuterSize = aDim === 1 ? 1 : a.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const bOuterSize = bDim === 1 ? 1 : b.shape.slice(0, -1).reduce((acc, dim) => acc * dim, 1);\n const contractionDim = aLastDim;\n\n // Compute: result[i, j] = sum_k a[i, k] * b[j, k]\n for (let i = 0; i < aOuterSize; i++) {\n for (let j = 0; j < bOuterSize; j++) {\n let sum = 0;\n for (let k = 0; k < contractionDim; k++) {\n // Get a[i, k] and b[j, k]\n const aIdx = aDim === 1 ? k : i * contractionDim + k;\n const bIdx = bDim === 1 ? k : j * contractionDim + k;\n const aVal = a.data[aIdx + a.offset];\n const bVal = b.data[bIdx + b.offset];\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n // Set result\n if (resultShape.length === 0) {\n // Scalar result\n return sum;\n }\n const resultIdx = aOuterSize === 1 ? j : i * bOuterSize + j;\n result.data[resultIdx] = sum;\n }\n }\n\n return result;\n}\n\n/**\n * Outer product of two vectors\n *\n * Computes out[i, j] = a[i] * b[j]\n * Input arrays are flattened if not 1D.\n *\n * @param a - First input (flattened to 1D)\n * @param b - Second input (flattened to 1D)\n * @returns 2D array of shape (a.size, b.size)\n */\nexport function outer(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n // Flatten inputs to 1D\n const aFlat = a.ndim === 1 ? a : shapeOps.ravel(a);\n const bFlat = b.ndim === 1 ? b : shapeOps.ravel(b);\n\n const m = aFlat.size;\n const n = bFlat.size;\n\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros([m, n], resultDtype);\n\n // Compute outer product: result[i,j] = a[i] * b[j]\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n const aVal = aFlat.get(i);\n const bVal = bFlat.get(j);\n\n let product;\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n product = aVal * bVal;\n } else {\n product = Number(aVal) * Number(bVal);\n }\n\n result.set([i, j], product);\n }\n }\n\n return result;\n}\n\n/**\n * Tensor dot product along specified axes\n *\n * Computes sum product over specified axes.\n *\n * @param a - First array\n * @param b - Second array\n * @param axes - Axes to contract:\n * - Integer N: Contract last N axes of a with first N of b\n * - [a_axes, b_axes]: Contract specified axes\n * @returns Tensor dot product\n */\nexport function tensordot(\n a: ArrayStorage,\n b: ArrayStorage,\n axes: number | [number[], number[]]\n): ArrayStorage | number | bigint {\n let aAxes: number[];\n let bAxes: number[];\n\n if (typeof axes === 'number') {\n // Contract last N axes of a with first N of b\n const N = axes;\n if (N < 0) {\n throw new Error('tensordot: axes must be non-negative');\n }\n if (N > a.ndim || N > b.ndim) {\n throw new Error('tensordot: axes exceeds array dimensions');\n }\n\n // Last N axes of a\n aAxes = Array.from({ length: N }, (_, i) => a.ndim - N + i);\n // First N axes of b\n bAxes = Array.from({ length: N }, (_, i) => i);\n } else {\n [aAxes, bAxes] = axes;\n if (aAxes.length !== bAxes.length) {\n throw new Error('tensordot: axes lists must have same length');\n }\n }\n\n // Validate axes and check dimension compatibility\n for (let i = 0; i < aAxes.length; i++) {\n const aAxis = aAxes[i]!;\n const bAxis = bAxes[i]!;\n if (aAxis < 0 || aAxis >= a.ndim || bAxis < 0 || bAxis >= b.ndim) {\n throw new Error('tensordot: axis out of bounds');\n }\n if (a.shape[aAxis] !== b.shape[bAxis]) {\n throw new Error(\n `tensordot: shape mismatch on axes ${aAxis} and ${bAxis}: ${a.shape[aAxis]} != ${b.shape[bAxis]}`\n );\n }\n }\n\n // Separate axes into contracted and free axes\n const aFreeAxes: number[] = [];\n const bFreeAxes: number[] = [];\n\n for (let i = 0; i < a.ndim; i++) {\n if (!aAxes.includes(i)) {\n aFreeAxes.push(i);\n }\n }\n for (let i = 0; i < b.ndim; i++) {\n if (!bAxes.includes(i)) {\n bFreeAxes.push(i);\n }\n }\n\n // Build result shape: free axes of a + free axes of b\n const resultShape = [\n ...aFreeAxes.map((ax) => a.shape[ax]!),\n ...bFreeAxes.map((ax) => b.shape[ax]!),\n ];\n\n // Special case: no free axes (full contraction) -> scalar result\n if (resultShape.length === 0) {\n let sum = 0;\n // Iterate over all combinations of contracted axes\n const contractSize = aAxes.map((ax) => a.shape[ax]!).reduce((acc, dim) => acc * dim, 1);\n\n for (let i = 0; i < contractSize; i++) {\n // Convert flat index to contracted indices\n let temp = i;\n const contractedIdx: number[] = new Array(aAxes.length);\n for (let j = aAxes.length - 1; j >= 0; j--) {\n const ax = aAxes[j]!;\n contractedIdx[j] = temp % a.shape[ax]!;\n temp = Math.floor(temp / a.shape[ax]!);\n }\n\n // Build full indices for a and b\n const aIdx: number[] = new Array(a.ndim);\n const bIdx: number[] = new Array(b.ndim);\n\n for (let j = 0; j < aAxes.length; j++) {\n aIdx[aAxes[j]!] = contractedIdx[j]!;\n }\n for (let j = 0; j < bAxes.length; j++) {\n bIdx[bAxes[j]!] = contractedIdx[j]!;\n }\n\n const aVal = a.get(...aIdx);\n const bVal = b.get(...bIdx);\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n return sum;\n }\n\n // General case: with free axes\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n\n const resultSize = resultShape.reduce((acc, dim) => acc * dim, 1);\n const contractSize = aAxes.map((ax) => a.shape[ax]!).reduce((acc, dim) => acc * dim, 1);\n\n // Iterate over all result positions\n for (let resIdx = 0; resIdx < resultSize; resIdx++) {\n // Convert flat result index to multi-dimensional\n let temp = resIdx;\n const resultIndices: number[] = [];\n for (let i = resultShape.length - 1; i >= 0; i--) {\n resultIndices[i] = temp % resultShape[i]!;\n temp = Math.floor(temp / resultShape[i]!);\n }\n\n // Extract indices for a's free axes and b's free axes\n const aFreeIndices = resultIndices.slice(0, aFreeAxes.length);\n const bFreeIndices = resultIndices.slice(aFreeAxes.length);\n\n let sum = 0;\n\n // Sum over all contracted axes\n for (let c = 0; c < contractSize; c++) {\n // Convert flat contracted index to multi-dimensional\n temp = c;\n const contractedIndices: number[] = [];\n for (let i = aAxes.length - 1; i >= 0; i--) {\n const ax = aAxes[i]!;\n contractedIndices[i] = temp % a.shape[ax]!;\n temp = Math.floor(temp / a.shape[ax]!);\n }\n\n // Build full indices for a and b\n const aFullIdx: number[] = new Array(a.ndim);\n const bFullIdx: number[] = new Array(b.ndim);\n\n // Fill in free axes\n for (let i = 0; i < aFreeAxes.length; i++) {\n aFullIdx[aFreeAxes[i]!] = aFreeIndices[i]!;\n }\n for (let i = 0; i < bFreeAxes.length; i++) {\n bFullIdx[bFreeAxes[i]!] = bFreeIndices[i]!;\n }\n\n // Fill in contracted axes\n for (let i = 0; i < aAxes.length; i++) {\n aFullIdx[aAxes[i]!] = contractedIndices[i]!;\n bFullIdx[bAxes[i]!] = contractedIndices[i]!;\n }\n\n const aVal = a.get(...aFullIdx);\n const bVal = b.get(...bFullIdx);\n\n if (typeof aVal === 'bigint' && typeof bVal === 'bigint') {\n sum = Number(sum) + Number(aVal * bVal);\n } else {\n sum += Number(aVal) * Number(bVal);\n }\n }\n\n result.set(resultIndices, sum);\n }\n\n return result;\n}\n\n/**\n * Extract a diagonal or construct a diagonal array.\n *\n * NumPy behavior:\n * - For 2D arrays: extract the k-th diagonal\n * - For ND arrays (N >= 2): extract diagonal from the axes specified\n * - Returns a view when possible, copy otherwise\n *\n * @param a - Input array (must be at least 2D)\n * @param offset - Offset of the diagonal from the main diagonal (default: 0)\n * - offset > 0: diagonal above main diagonal\n * - offset < 0: diagonal below main diagonal\n * @param axis1 - First axis for ND arrays (default: 0)\n * @param axis2 - Second axis for ND arrays (default: 1)\n * @returns Array containing the diagonal elements\n */\nexport function diagonal(\n a: ArrayStorage,\n offset: number = 0,\n axis1: number = 0,\n axis2: number = 1\n): ArrayStorage {\n const shape = a.shape;\n const ndim = shape.length;\n\n if (ndim < 2) {\n throw new Error('diagonal requires an array of at least two dimensions');\n }\n\n // Normalize negative axes\n const ax1 = axis1 < 0 ? ndim + axis1 : axis1;\n const ax2 = axis2 < 0 ? ndim + axis2 : axis2;\n\n if (ax1 < 0 || ax1 >= ndim || ax2 < 0 || ax2 >= ndim) {\n throw new Error('axis out of bounds');\n }\n\n if (ax1 === ax2) {\n throw new Error('axis1 and axis2 cannot be the same');\n }\n\n // Get dimensions of the two axes\n const dim1 = shape[ax1]!;\n const dim2 = shape[ax2]!;\n\n // Calculate diagonal length\n let diagLen: number;\n if (offset >= 0) {\n diagLen = Math.max(0, Math.min(dim1, dim2 - offset));\n } else {\n diagLen = Math.max(0, Math.min(dim1 + offset, dim2));\n }\n\n // Build output shape: remove axis1 and axis2, append diagLen\n const outShape: number[] = [];\n for (let i = 0; i < ndim; i++) {\n if (i !== ax1 && i !== ax2) {\n outShape.push(shape[i]!);\n }\n }\n outShape.push(diagLen);\n\n // Create output array\n const result = ArrayStorage.zeros(outShape, a.dtype);\n\n // Extract diagonal elements\n // We need to iterate over all combinations of indices for other dimensions\n const otherDims = shape.filter((_, i) => i !== ax1 && i !== ax2);\n const otherSize = otherDims.reduce((acc, d) => acc * d, 1);\n\n for (let otherIdx = 0; otherIdx < otherSize; otherIdx++) {\n // Convert flat index to multi-dimensional indices for \"other\" dimensions\n let temp = otherIdx;\n const otherIndices: number[] = [];\n for (let i = otherDims.length - 1; i >= 0; i--) {\n otherIndices.unshift(temp % otherDims[i]!);\n temp = Math.floor(temp / otherDims[i]!);\n }\n\n // Extract diagonal for this slice\n for (let d = 0; d < diagLen; d++) {\n // Build source indices\n const srcIndices: number[] = new Array(ndim);\n let otherIdx2 = 0;\n for (let i = 0; i < ndim; i++) {\n if (i === ax1) {\n srcIndices[i] = offset >= 0 ? d : d - offset;\n } else if (i === ax2) {\n srcIndices[i] = offset >= 0 ? d + offset : d;\n } else {\n srcIndices[i] = otherIndices[otherIdx2++]!;\n }\n }\n\n // Build destination indices\n const dstIndices = [...otherIndices, d];\n\n // Copy element\n const value = a.get(...srcIndices);\n result.set(dstIndices, value);\n }\n }\n\n return result;\n}\n\n/**\n * Einstein summation convention\n *\n * Performs tensor contractions and reductions using Einstein summation notation.\n *\n * Examples:\n * - 'ij,jk->ik': matrix multiplication\n * - 'i,i->': dot product (inner product)\n * - 'ij->ji': transpose\n * - 'ii->': trace\n * - 'ij->j': sum over first axis\n * - 'ijk,ikl->ijl': batched matrix multiplication\n *\n * @param subscripts - Einstein summation subscripts (e.g., 'ij,jk->ik')\n * @param operands - Input arrays\n * @returns Result of the Einstein summation\n */\nexport function einsum(\n subscripts: string,\n ...operands: ArrayStorage[]\n): ArrayStorage | number | bigint {\n // Parse the subscripts\n const arrowMatch = subscripts.indexOf('->');\n\n let inputSubscripts: string;\n let outputSubscript: string;\n\n if (arrowMatch === -1) {\n // Implicit output: collect unique indices not repeated\n inputSubscripts = subscripts;\n outputSubscript = inferOutputSubscript(inputSubscripts);\n } else {\n inputSubscripts = subscripts.slice(0, arrowMatch);\n outputSubscript = subscripts.slice(arrowMatch + 2);\n }\n\n // Parse input subscripts into individual operand subscripts\n const operandSubscripts = inputSubscripts.split(',').map((s) => s.trim());\n\n if (operandSubscripts.length !== operands.length) {\n throw new Error(\n `einsum: expected ${operandSubscripts.length} operands, got ${operands.length}`\n );\n }\n\n // Validate subscripts and build index dimension map\n const indexDims = new Map<string, number>();\n\n for (let i = 0; i < operands.length; i++) {\n const sub = operandSubscripts[i]!;\n const op = operands[i]!;\n\n if (sub.length !== op.ndim) {\n throw new Error(\n `einsum: operand ${i} has ${op.ndim} dimensions but subscript '${sub}' has ${sub.length} indices`\n );\n }\n\n for (let j = 0; j < sub.length; j++) {\n const idx = sub[j]!;\n const dim = op.shape[j]!;\n\n if (indexDims.has(idx)) {\n if (indexDims.get(idx) !== dim) {\n throw new Error(\n `einsum: size mismatch for index '${idx}': ${indexDims.get(idx)} vs ${dim}`\n );\n }\n } else {\n indexDims.set(idx, dim);\n }\n }\n }\n\n // Validate output subscript\n for (const idx of outputSubscript) {\n if (!indexDims.has(idx)) {\n throw new Error(`einsum: output subscript contains unknown index '${idx}'`);\n }\n }\n\n // Identify summation indices (in inputs but not in output)\n const outputIndices = new Set(outputSubscript);\n const allInputIndices = new Set<string>();\n for (const sub of operandSubscripts) {\n for (const idx of sub) {\n allInputIndices.add(idx);\n }\n }\n\n const sumIndices: string[] = [];\n for (const idx of allInputIndices) {\n if (!outputIndices.has(idx)) {\n sumIndices.push(idx);\n }\n }\n\n // ========================================\n // FAST PATHS: Detect common patterns and delegate to optimized implementations\n // ========================================\n\n // Pattern: Matrix multiplication \"ij,jk->ik\" or similar\n if (operands.length === 2 && operandSubscripts.length === 2) {\n const [sub1, sub2] = operandSubscripts;\n const [op1, op2] = operands;\n\n // Check for matmul pattern: two 2D arrays, one shared index\n if (\n sub1!.length === 2 &&\n sub2!.length === 2 &&\n outputSubscript.length === 2 &&\n op1!.ndim === 2 &&\n op2!.ndim === 2\n ) {\n const [i1, j1] = [sub1![0]!, sub1![1]!];\n const [i2, j2] = [sub2![0]!, sub2![1]!];\n const [o1, o2] = [outputSubscript[0]!, outputSubscript[1]!];\n\n // Pattern: \"ij,jk->ik\" (standard matmul)\n if (i1 === o1 && j2 === o2 && j1 === i2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n return matmul(op1!, op2!);\n }\n\n // Pattern: \"ik,kj->ij\" (matmul with different index names)\n if (i1 === o1 && j2 === o2 && j1 === i2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n return matmul(op1!, op2!);\n }\n\n // Pattern: \"ji,jk->ik\" (transpose A then multiply)\n if (j1 === o1 && j2 === o2 && i1 === i2 && sumIndices.length === 1 && sumIndices[0] === i1) {\n const op1T = transpose(op1!);\n return matmul(op1T, op2!);\n }\n\n // Pattern: \"ij,kj->ik\" (transpose B then multiply)\n if (i1 === o1 && i2 === o2 && j1 === j2 && sumIndices.length === 1 && sumIndices[0] === j1) {\n const op2T = transpose(op2!);\n return matmul(op1!, op2T);\n }\n }\n\n // Check for dot product pattern: two 1D arrays \"i,i->\" or \"i,i->scalar\"\n if (\n sub1!.length === 1 &&\n sub2!.length === 1 &&\n sub1 === sub2 &&\n outputSubscript.length === 0 &&\n op1!.ndim === 1 &&\n op2!.ndim === 1\n ) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n\n // Check for outer product pattern: \"i,j->ij\"\n if (\n sub1 &&\n sub2 &&\n sub1.length === 1 &&\n sub2.length === 1 &&\n outputSubscript.length === 2 &&\n outputSubscript === sub1 + sub2 &&\n sumIndices.length === 0 &&\n op1!.ndim === 1 &&\n op2!.ndim === 1\n ) {\n return outer(op1!, op2!);\n }\n }\n\n // Pattern: Single operand trace \"ii->\"\n if (operands.length === 1 && operandSubscripts[0]!.length === 2 && outputSubscript.length === 0) {\n const sub = operandSubscripts[0]!;\n if (sub[0] === sub[1]) {\n // This is a trace operation\n const op = operands[0]!;\n if (op.ndim === 2) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n }\n }\n\n // ========================================\n // END FAST PATHS - Fall through to generic implementation\n // ========================================\n\n // Build output shape\n const outputShape = Array.from(outputSubscript).map((idx) => indexDims.get(idx)!);\n\n // Special case: scalar output\n if (outputShape.length === 0) {\n return computeEinsumScalar(operands, operandSubscripts, sumIndices, indexDims);\n }\n\n // Determine result dtype\n let resultDtype = operands[0]!.dtype;\n for (let i = 1; i < operands.length; i++) {\n resultDtype = promoteDTypes(resultDtype, operands[i]!.dtype);\n }\n\n // Create output array\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n\n // Compute output size\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n // Compute sum range\n let sumSize = 1;\n for (const idx of sumIndices) {\n sumSize *= indexDims.get(idx)!;\n }\n\n // Iterate over all output positions\n for (let outIdx = 0; outIdx < outputSize; outIdx++) {\n // Convert flat index to multi-dimensional output index\n const outMultiIdx = flatToMulti(outIdx, outputShape);\n\n // Build index assignment for output indices\n const indexValues = new Map<string, number>();\n for (let i = 0; i < outputSubscript.length; i++) {\n indexValues.set(outputSubscript[i]!, outMultiIdx[i]!);\n }\n\n // Sum over summation indices\n let sum = 0;\n for (let sumIdx = 0; sumIdx < sumSize; sumIdx++) {\n // Assign values to summation indices\n let temp = sumIdx;\n for (let i = sumIndices.length - 1; i >= 0; i--) {\n const idx = sumIndices[i]!;\n const dim = indexDims.get(idx)!;\n indexValues.set(idx, temp % dim);\n temp = Math.floor(temp / dim);\n }\n\n // Compute product of all operand values\n let product = 1;\n for (let i = 0; i < operands.length; i++) {\n const op = operands[i]!;\n const sub = operandSubscripts[i]!;\n\n // Build operand index\n const opIdx: number[] = [];\n for (const idx of sub) {\n opIdx.push(indexValues.get(idx)!);\n }\n\n const val = op.get(...opIdx);\n product *= Number(val);\n }\n\n sum += product;\n }\n\n result.set(outMultiIdx, sum);\n }\n\n return result;\n}\n\n/**\n * Infer output subscript for implicit einsum notation\n * @private\n */\nfunction inferOutputSubscript(inputSubscripts: string): string {\n // Count occurrences of each index\n const counts = new Map<string, number>();\n const operandSubscripts = inputSubscripts.split(',');\n\n for (const sub of operandSubscripts) {\n for (const idx of sub.trim()) {\n counts.set(idx, (counts.get(idx) || 0) + 1);\n }\n }\n\n // Output contains indices that appear exactly once, sorted alphabetically\n const outputIndices: string[] = [];\n for (const [idx, count] of counts) {\n if (count === 1) {\n outputIndices.push(idx);\n }\n }\n\n return outputIndices.sort().join('');\n}\n\n/**\n * Compute einsum result when output is a scalar\n * @private\n */\nfunction computeEinsumScalar(\n operands: ArrayStorage[],\n operandSubscripts: string[],\n sumIndices: string[],\n indexDims: Map<string, number>\n): number {\n // All indices are summation indices\n let sumSize = 1;\n for (const idx of sumIndices) {\n sumSize *= indexDims.get(idx)!;\n }\n\n let sum = 0;\n\n for (let sumIdx = 0; sumIdx < sumSize; sumIdx++) {\n // Assign values to summation indices\n const indexValues = new Map<string, number>();\n let temp = sumIdx;\n for (let i = sumIndices.length - 1; i >= 0; i--) {\n const idx = sumIndices[i]!;\n const dim = indexDims.get(idx)!;\n indexValues.set(idx, temp % dim);\n temp = Math.floor(temp / dim);\n }\n\n // Compute product of all operand values\n let product = 1;\n for (let i = 0; i < operands.length; i++) {\n const op = operands[i]!;\n const sub = operandSubscripts[i]!;\n\n // Build operand index\n const opIdx: number[] = [];\n for (const idx of sub) {\n opIdx.push(indexValues.get(idx)!);\n }\n\n const val = op.get(...opIdx);\n product *= Number(val);\n }\n\n sum += product;\n }\n\n return sum;\n}\n\n/**\n * Convert flat index to multi-dimensional index\n * @private\n */\nfunction flatToMulti(flatIdx: number, shape: number[]): number[] {\n const result: number[] = new Array(shape.length);\n let temp = flatIdx;\n\n for (let i = shape.length - 1; i >= 0; i--) {\n result[i] = temp % shape[i]!;\n temp = Math.floor(temp / shape[i]!);\n }\n\n return result;\n}\n\n/**\n * Kronecker product of two arrays.\n *\n * Computes the Kronecker product, a composite array made of blocks of the\n * second array scaled by the elements of the first.\n *\n * NumPy behavior:\n * - If both inputs are vectors (1D), output is also a vector\n * - If both inputs are 2D matrices, output shape is (m1*m2, n1*n2)\n * - General case: broadcasts shapes then computes block product\n *\n * @param a - First input array\n * @param b - Second input array\n * @returns Kronecker product of a and b\n */\nexport function kron(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const aShape = a.shape;\n const bShape = b.shape;\n const aNdim = aShape.length;\n const bNdim = bShape.length;\n\n // Promote dtypes\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n\n // Determine output shape\n const ndim = Math.max(aNdim, bNdim);\n const outShape: number[] = new Array(ndim);\n\n // Pad shapes with ones on the left if needed\n const aPadded: number[] = new Array(ndim).fill(1);\n const bPadded: number[] = new Array(ndim).fill(1);\n\n for (let i = 0; i < aNdim; i++) {\n aPadded[ndim - aNdim + i] = aShape[i]!;\n }\n for (let i = 0; i < bNdim; i++) {\n bPadded[ndim - bNdim + i] = bShape[i]!;\n }\n\n // Output shape is element-wise product\n for (let i = 0; i < ndim; i++) {\n outShape[i] = aPadded[i]! * bPadded[i]!;\n }\n\n // Create result array\n const result = ArrayStorage.zeros(outShape, resultDtype);\n\n // Compute total number of elements in each array\n const aSize = aShape.reduce((acc, d) => acc * d, 1);\n const bSize = bShape.reduce((acc, d) => acc * d, 1);\n\n // Nested loop approach: for each element in a, scale all of b\n for (let aIdx = 0; aIdx < aSize; aIdx++) {\n // Convert flat index to multi-dimensional index for a\n let temp = aIdx;\n const aIndices: number[] = new Array(aNdim);\n for (let i = aNdim - 1; i >= 0; i--) {\n aIndices[i] = temp % aShape[i]!;\n temp = Math.floor(temp / aShape[i]!);\n }\n\n // Pad aIndices to match ndim\n const aIndicesPadded: number[] = new Array(ndim).fill(0);\n for (let i = 0; i < aNdim; i++) {\n aIndicesPadded[ndim - aNdim + i] = aIndices[i]!;\n }\n\n const aVal = a.get(...aIndices);\n\n // For each element in b\n for (let bIdx = 0; bIdx < bSize; bIdx++) {\n // Convert flat index to multi-dimensional index for b\n let temp2 = bIdx;\n const bIndices: number[] = new Array(bNdim);\n for (let i = bNdim - 1; i >= 0; i--) {\n bIndices[i] = temp2 % bShape[i]!;\n temp2 = Math.floor(temp2 / bShape[i]!);\n }\n\n // Pad bIndices to match ndim\n const bIndicesPadded: number[] = new Array(ndim).fill(0);\n for (let i = 0; i < bNdim; i++) {\n bIndicesPadded[ndim - bNdim + i] = bIndices[i]!;\n }\n\n const bVal = b.get(...bIndices);\n\n // Compute output index: each dimension is aIdx*bDim + bIdx\n const outIndices: number[] = new Array(ndim);\n for (let i = 0; i < ndim; i++) {\n outIndices[i] = aIndicesPadded[i]! * bPadded[i]! + bIndicesPadded[i]!;\n }\n\n // Compute product and store\n const product =\n typeof aVal === 'bigint' || typeof bVal === 'bigint'\n ? BigInt(Number(aVal)) * BigInt(Number(bVal))\n : Number(aVal) * Number(bVal);\n\n result.set(outIndices, product);\n }\n }\n\n return result;\n}\n\n// ========================================\n// NUMPY.LINALG MODULE FUNCTIONS\n// ========================================\n\n/**\n * Cross product of two vectors.\n *\n * For 3D vectors: returns the cross product vector\n * For 2D vectors: returns the scalar z-component of the cross product\n *\n * @param a - First input array\n * @param b - Second input array\n * @param axisa - Axis of a that defines the vectors (default: -1)\n * @param axisb - Axis of b that defines the vectors (default: -1)\n * @param axisc - Axis of c containing the cross product vectors (default: -1)\n * @param axis - If defined, the axis of a, b and c that defines the vectors\n * @returns Cross product of a and b\n */\nexport function cross(\n a: ArrayStorage,\n b: ArrayStorage,\n axisa: number = -1,\n axisb: number = -1,\n axisc: number = -1,\n axis?: number\n): ArrayStorage | number {\n // If axis is specified, use it for all\n if (axis !== undefined) {\n axisa = axis;\n axisb = axis;\n axisc = axis;\n }\n\n // Normalize negative axes\n const normalizeAxis = (ax: number, ndim: number) => (ax < 0 ? ndim + ax : ax);\n\n const axisA = normalizeAxis(axisa, a.ndim);\n const axisB = normalizeAxis(axisb, b.ndim);\n\n // Simple case: both are 1D vectors\n if (a.ndim === 1 && b.ndim === 1) {\n const dimA = a.shape[0]!;\n const dimB = b.shape[0]!;\n\n if (dimA === 3 && dimB === 3) {\n // 3D cross product\n const a0 = Number(a.get(0));\n const a1 = Number(a.get(1));\n const a2 = Number(a.get(2));\n const b0 = Number(b.get(0));\n const b1 = Number(b.get(1));\n const b2 = Number(b.get(2));\n\n const result = ArrayStorage.zeros([3], 'float64');\n result.set([0], a1 * b2 - a2 * b1);\n result.set([1], a2 * b0 - a0 * b2);\n result.set([2], a0 * b1 - a1 * b0);\n return result;\n } else if (dimA === 2 && dimB === 2) {\n // 2D cross product (returns scalar)\n const a0 = Number(a.get(0));\n const a1 = Number(a.get(1));\n const b0 = Number(b.get(0));\n const b1 = Number(b.get(1));\n return a0 * b1 - a1 * b0;\n } else if ((dimA === 2 && dimB === 3) || (dimA === 3 && dimB === 2)) {\n // Mixed 2D/3D - treat 2D as having z=0\n const a0 = Number(a.get(0));\n const a1 = Number(a.get(1));\n const a2 = dimA === 3 ? Number(a.get(2)) : 0;\n const b0 = Number(b.get(0));\n const b1 = Number(b.get(1));\n const b2 = dimB === 3 ? Number(b.get(2)) : 0;\n\n const result = ArrayStorage.zeros([3], 'float64');\n result.set([0], a1 * b2 - a2 * b1);\n result.set([1], a2 * b0 - a0 * b2);\n result.set([2], a0 * b1 - a1 * b0);\n return result;\n } else {\n throw new Error(`cross: incompatible dimensions for cross product: ${dimA} and ${dimB}`);\n }\n }\n\n // Handle higher dimensional arrays by iterating over all other axes\n // For simplicity, we'll handle the case where the vector axis is last\n const vectorDimA = a.shape[axisA]!;\n const vectorDimB = b.shape[axisB]!;\n\n if ((vectorDimA !== 2 && vectorDimA !== 3) || (vectorDimB !== 2 && vectorDimB !== 3)) {\n throw new Error(\n `cross: incompatible dimensions for cross product: ${vectorDimA} and ${vectorDimB}`\n );\n }\n\n // Determine output shape and vector dimension\n const outputVectorDim = vectorDimA === 2 && vectorDimB === 2 ? 0 : 3;\n\n // Build output shape (broadcast the non-vector axes)\n const aOtherShape = [...a.shape.slice(0, axisA), ...a.shape.slice(axisA + 1)];\n const bOtherShape = [...b.shape.slice(0, axisB), ...b.shape.slice(axisB + 1)];\n\n // For now, require same shapes for non-vector axes\n if (aOtherShape.length !== bOtherShape.length) {\n throw new Error('cross: incompatible shapes for cross product');\n }\n for (let i = 0; i < aOtherShape.length; i++) {\n if (aOtherShape[i] !== bOtherShape[i]) {\n throw new Error('cross: incompatible shapes for cross product');\n }\n }\n\n const otherShape = aOtherShape;\n const normalizedAxisC = axisc < 0 ? otherShape.length + 1 + axisc : axisc;\n\n // Build result shape\n let resultShape: number[];\n if (outputVectorDim === 0) {\n // Scalar output per position\n resultShape = otherShape;\n } else {\n // Insert vector dimension at axisc\n resultShape = [\n ...otherShape.slice(0, normalizedAxisC),\n outputVectorDim,\n ...otherShape.slice(normalizedAxisC),\n ];\n }\n\n if (resultShape.length === 0) {\n // Both 2D vectors, scalar result (already handled above)\n throw new Error('cross: unexpected scalar result from higher-dimensional input');\n }\n\n const result = ArrayStorage.zeros(resultShape, 'float64');\n\n // Iterate over all \"other\" positions\n const otherSize = otherShape.reduce((acc, d) => acc * d, 1);\n\n for (let i = 0; i < otherSize; i++) {\n // Convert flat index to multi-dim\n let temp = i;\n const otherIndices: number[] = [];\n for (let j = otherShape.length - 1; j >= 0; j--) {\n otherIndices[j] = temp % otherShape[j]!;\n temp = Math.floor(temp / otherShape[j]!);\n }\n\n // Build indices for a and b (insert vector axis)\n const aIndices = [...otherIndices.slice(0, axisA), 0, ...otherIndices.slice(axisA)];\n const bIndices = [...otherIndices.slice(0, axisB), 0, ...otherIndices.slice(axisB)];\n\n // Extract vector components\n const getA = (idx: number) => {\n aIndices[axisA] = idx;\n return Number(a.get(...aIndices));\n };\n const getB = (idx: number) => {\n bIndices[axisB] = idx;\n return Number(b.get(...bIndices));\n };\n\n const a0 = getA(0);\n const a1 = getA(1);\n const a2 = vectorDimA === 3 ? getA(2) : 0;\n const b0 = getB(0);\n const b1 = getB(1);\n const b2 = vectorDimB === 3 ? getB(2) : 0;\n\n if (outputVectorDim === 0) {\n // Scalar result\n result.set(otherIndices, a0 * b1 - a1 * b0);\n } else {\n // Vector result\n const c0 = a1 * b2 - a2 * b1;\n const c1 = a2 * b0 - a0 * b2;\n const c2 = a0 * b1 - a1 * b0;\n\n const setResult = (idx: number, val: number) => {\n const resultIndices = [\n ...otherIndices.slice(0, normalizedAxisC),\n idx,\n ...otherIndices.slice(normalizedAxisC),\n ];\n result.set(resultIndices, val);\n };\n\n setResult(0, c0);\n setResult(1, c1);\n setResult(2, c2);\n }\n }\n\n return result;\n}\n\n/**\n * Vector norm.\n *\n * @param x - Input vector or array\n * @param ord - Order of the norm (default: 2)\n * - Infinity: max(abs(x))\n * - -Infinity: min(abs(x))\n * - 0: sum(x != 0)\n * - Other: sum(abs(x)^ord)^(1/ord)\n * @param axis - Axis along which to compute (flattened if not specified)\n * @param keepdims - Keep reduced dimensions\n * @returns Vector norm\n */\nexport function vector_norm(\n x: ArrayStorage,\n ord: number | 'fro' | 'nuc' = 2,\n axis?: number | null,\n keepdims: boolean = false\n): ArrayStorage | number {\n // Handle numeric ord only for vector norm\n if (typeof ord !== 'number') {\n throw new Error('vector_norm: ord must be a number');\n }\n\n // If no axis specified, flatten and compute\n if (axis === undefined || axis === null) {\n const flat = x.ndim === 1 ? x : shapeOps.ravel(x);\n const n = flat.size;\n\n let result: number;\n if (ord === Infinity) {\n result = 0;\n for (let i = 0; i < n; i++) {\n result = Math.max(result, Math.abs(Number(flat.get(i))));\n }\n } else if (ord === -Infinity) {\n result = Infinity;\n for (let i = 0; i < n; i++) {\n result = Math.min(result, Math.abs(Number(flat.get(i))));\n }\n } else if (ord === 0) {\n result = 0;\n for (let i = 0; i < n; i++) {\n if (Number(flat.get(i)) !== 0) result++;\n }\n } else if (ord === 1) {\n result = 0;\n for (let i = 0; i < n; i++) {\n result += Math.abs(Number(flat.get(i)));\n }\n } else if (ord === 2) {\n result = 0;\n for (let i = 0; i < n; i++) {\n const val = Number(flat.get(i));\n result += val * val;\n }\n result = Math.sqrt(result);\n } else {\n result = 0;\n for (let i = 0; i < n; i++) {\n result += Math.pow(Math.abs(Number(flat.get(i))), ord);\n }\n result = Math.pow(result, 1 / ord);\n }\n\n if (keepdims) {\n const shape = new Array(x.ndim).fill(1);\n const out = ArrayStorage.zeros(shape, 'float64');\n out.set(new Array(x.ndim).fill(0), result);\n return out;\n }\n return result;\n }\n\n // Compute along specified axis\n const ax = axis < 0 ? x.ndim + axis : axis;\n if (ax < 0 || ax >= x.ndim) {\n throw new Error(`vector_norm: axis ${axis} out of bounds for array with ${x.ndim} dimensions`);\n }\n\n // Build output shape\n const outShape = keepdims\n ? [...x.shape.slice(0, ax), 1, ...x.shape.slice(ax + 1)]\n : [...x.shape.slice(0, ax), ...x.shape.slice(ax + 1)];\n\n if (outShape.length === 0) {\n // Scalar result\n return vector_norm(x, ord, null, false) as number;\n }\n\n const result = ArrayStorage.zeros(outShape, 'float64');\n const axisLen = x.shape[ax]!;\n const outSize = outShape.reduce((acc, d) => acc * d, 1);\n\n for (let outIdx = 0; outIdx < outSize; outIdx++) {\n // Convert flat index to multi-dim output index\n let temp = outIdx;\n const outIndices: number[] = [];\n for (let i = outShape.length - 1; i >= 0; i--) {\n outIndices[i] = temp % outShape[i]!;\n temp = Math.floor(temp / outShape[i]!);\n }\n\n // Build input indices (insert axis dimension)\n const inIndices = keepdims\n ? [...outIndices.slice(0, ax), 0, ...outIndices.slice(ax + 1)]\n : [...outIndices.slice(0, ax), 0, ...outIndices.slice(ax)];\n\n // Compute norm along axis\n let normVal: number;\n if (ord === Infinity) {\n normVal = 0;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n normVal = Math.max(normVal, Math.abs(Number(x.get(...inIndices))));\n }\n } else if (ord === -Infinity) {\n normVal = Infinity;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n normVal = Math.min(normVal, Math.abs(Number(x.get(...inIndices))));\n }\n } else if (ord === 0) {\n normVal = 0;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n if (Number(x.get(...inIndices)) !== 0) normVal++;\n }\n } else if (ord === 1) {\n normVal = 0;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n normVal += Math.abs(Number(x.get(...inIndices)));\n }\n } else if (ord === 2) {\n normVal = 0;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n const val = Number(x.get(...inIndices));\n normVal += val * val;\n }\n normVal = Math.sqrt(normVal);\n } else {\n normVal = 0;\n for (let i = 0; i < axisLen; i++) {\n inIndices[ax] = i;\n normVal += Math.pow(Math.abs(Number(x.get(...inIndices))), ord);\n }\n normVal = Math.pow(normVal, 1 / ord);\n }\n\n result.set(outIndices, normVal);\n }\n\n return result;\n}\n\n/**\n * Matrix norm.\n *\n * @param x - Input 2D array\n * @param ord - Order of the norm:\n * - 'fro': Frobenius norm (default)\n * - 'nuc': Nuclear norm (sum of singular values)\n * - 1: Max column sum (max(sum(abs(x), axis=0)))\n * - -1: Min column sum (min(sum(abs(x), axis=0)))\n * - 2: Largest singular value\n * - -2: Smallest singular value\n * - Infinity: Max row sum (max(sum(abs(x), axis=1)))\n * - -Infinity: Min row sum (min(sum(abs(x), axis=1)))\n * @param keepdims - Keep reduced dimensions\n * @returns Matrix norm\n */\nexport function matrix_norm(\n x: ArrayStorage,\n ord: number | 'fro' | 'nuc' = 'fro',\n keepdims: boolean = false\n): ArrayStorage | number {\n if (x.ndim !== 2) {\n throw new Error(`matrix_norm: input must be 2D, got ${x.ndim}D`);\n }\n\n const [m, n] = x.shape;\n let result: number;\n\n if (ord === 'fro') {\n // Frobenius norm: sqrt(sum(abs(x)^2))\n result = 0;\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < n!; j++) {\n const val = Number(x.get(i, j));\n result += val * val;\n }\n }\n result = Math.sqrt(result);\n } else if (ord === 'nuc') {\n // Nuclear norm: sum of singular values\n const { s } = svdFull(x);\n result = 0;\n for (let i = 0; i < s.size; i++) {\n result += Number(s.get(i));\n }\n } else if (ord === 1) {\n // Max column sum\n result = 0;\n for (let j = 0; j < n!; j++) {\n let colSum = 0;\n for (let i = 0; i < m!; i++) {\n colSum += Math.abs(Number(x.get(i, j)));\n }\n result = Math.max(result, colSum);\n }\n } else if (ord === -1) {\n // Min column sum\n result = Infinity;\n for (let j = 0; j < n!; j++) {\n let colSum = 0;\n for (let i = 0; i < m!; i++) {\n colSum += Math.abs(Number(x.get(i, j)));\n }\n result = Math.min(result, colSum);\n }\n } else if (ord === Infinity) {\n // Max row sum\n result = 0;\n for (let i = 0; i < m!; i++) {\n let rowSum = 0;\n for (let j = 0; j < n!; j++) {\n rowSum += Math.abs(Number(x.get(i, j)));\n }\n result = Math.max(result, rowSum);\n }\n } else if (ord === -Infinity) {\n // Min row sum\n result = Infinity;\n for (let i = 0; i < m!; i++) {\n let rowSum = 0;\n for (let j = 0; j < n!; j++) {\n rowSum += Math.abs(Number(x.get(i, j)));\n }\n result = Math.min(result, rowSum);\n }\n } else if (ord === 2) {\n // Largest singular value\n const { s } = svdFull(x);\n result = Number(s.get(0));\n } else if (ord === -2) {\n // Smallest singular value\n const { s } = svdFull(x);\n result = Number(s.get(s.size - 1));\n } else {\n throw new Error(`matrix_norm: invalid ord value: ${ord}`);\n }\n\n if (keepdims) {\n const out = ArrayStorage.zeros([1, 1], 'float64');\n out.set([0, 0], result);\n return out;\n }\n return result;\n}\n\n/**\n * General norm function (for both vectors and matrices).\n *\n * @param x - Input array\n * @param ord - Order of the norm (default: 'fro' for 2D, 2 for 1D)\n * @param axis - Axis or axes along which to compute\n * @param keepdims - Keep reduced dimensions\n * @returns Norm\n */\nexport function norm(\n x: ArrayStorage,\n ord: number | 'fro' | 'nuc' | null = null,\n axis: number | [number, number] | null = null,\n keepdims: boolean = false\n): ArrayStorage | number {\n // Determine default ord based on axis\n if (ord === null) {\n if (axis === null) {\n // Flatten and compute 2-norm\n return vector_norm(x, 2, null, keepdims);\n } else if (typeof axis === 'number') {\n return vector_norm(x, 2, axis, keepdims);\n } else {\n // axis is [number, number] - matrix norm\n return matrix_norm(x, 'fro', keepdims);\n }\n }\n\n // If axis is specified as a tuple, compute matrix norm\n if (Array.isArray(axis)) {\n if (axis.length !== 2) {\n throw new Error('norm: axis must be a 2-tuple for matrix norms');\n }\n // For now, only support the simple case where the matrix axes are (0, 1) or (-2, -1)\n const ax0 = axis[0] < 0 ? x.ndim + axis[0] : axis[0];\n const ax1 = axis[1] < 0 ? x.ndim + axis[1] : axis[1];\n\n if (x.ndim !== 2 || (ax0 !== 0 && ax0 !== 1) || (ax1 !== 0 && ax1 !== 1) || ax0 === ax1) {\n throw new Error('norm: complex axis specification not yet supported');\n }\n\n return matrix_norm(x, ord as 'fro' | 'nuc' | number, keepdims);\n }\n\n // Single axis or no axis - vector norm\n if (x.ndim === 2 && axis === null && (ord === 'fro' || ord === 'nuc')) {\n return matrix_norm(x, ord, keepdims);\n }\n\n if (typeof ord !== 'number' && ord !== null) {\n throw new Error(`norm: ord '${ord}' not valid for vector norm`);\n }\n\n return vector_norm(x, ord ?? 2, axis, keepdims);\n}\n\n/**\n * QR decomposition using Householder reflections.\n *\n * @param a - Input matrix (m x n)\n * @param mode - 'reduced' (default), 'complete', 'r', or 'raw'\n * @returns { q, r } where A = Q @ R\n */\nexport function qr(\n a: ArrayStorage,\n mode: 'reduced' | 'complete' | 'r' | 'raw' = 'reduced'\n): { q: ArrayStorage; r: ArrayStorage } | ArrayStorage | { h: ArrayStorage; tau: ArrayStorage } {\n if (a.ndim !== 2) {\n throw new Error(`qr: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n const k = Math.min(m!, n!);\n\n // Copy input to working array (float64)\n const R = ArrayStorage.zeros([m!, n!], 'float64');\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < n!; j++) {\n R.set([i, j], Number(a.get(i, j)));\n }\n }\n\n // Store Householder vectors for Q reconstruction\n const householderVectors: number[][] = [];\n const tau: number[] = [];\n\n // Householder QR\n for (let j = 0; j < k; j++) {\n // Extract column j from row j onwards\n const colLen = m! - j;\n const col: number[] = [];\n for (let i = j; i < m!; i++) {\n col.push(Number(R.get(i, j)));\n }\n\n // Compute norm of column\n let normCol = 0;\n for (let i = 0; i < colLen; i++) {\n normCol += col[i]! * col[i]!;\n }\n normCol = Math.sqrt(normCol);\n\n if (normCol < 1e-15) {\n householderVectors.push(col);\n tau.push(0);\n continue;\n }\n\n // Compute Householder vector\n const sign = col[0]! >= 0 ? 1 : -1;\n const u0 = col[0]! + sign * normCol;\n const v: number[] = [1];\n for (let i = 1; i < colLen; i++) {\n v.push(col[i]! / u0);\n }\n\n const tauJ = (sign * u0) / normCol;\n tau.push(tauJ);\n householderVectors.push(v);\n\n // Apply Householder reflection to R[:, j:]\n // R = R - tau * v * (v^T @ R)\n for (let jj = j; jj < n!; jj++) {\n // Compute v^T @ R[:, jj]\n let vTR = 0;\n for (let i = 0; i < colLen; i++) {\n vTR += v[i]! * Number(R.get(j + i, jj));\n }\n // Update R[:, jj]\n for (let i = 0; i < colLen; i++) {\n R.set([j + i, jj], Number(R.get(j + i, jj)) - tauJ * v[i]! * vTR);\n }\n }\n }\n\n if (mode === 'raw') {\n // Return raw Householder representation\n const h = ArrayStorage.zeros([m!, n!], 'float64');\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < n!; j++) {\n h.set([i, j], Number(R.get(i, j)));\n }\n }\n const tauArr = ArrayStorage.zeros([k], 'float64');\n for (let i = 0; i < k; i++) {\n tauArr.set([i], tau[i]!);\n }\n return { h, tau: tauArr };\n }\n\n if (mode === 'r') {\n // Return only R (upper triangular)\n const rResult = ArrayStorage.zeros([k, n!], 'float64');\n for (let i = 0; i < k; i++) {\n for (let j = i; j < n!; j++) {\n rResult.set([i, j], Number(R.get(i, j)));\n }\n }\n return rResult;\n }\n\n // Reconstruct Q from Householder vectors\n const qRows = mode === 'complete' ? m! : k;\n const Q = ArrayStorage.zeros([m!, qRows], 'float64');\n\n // Initialize Q as identity\n for (let i = 0; i < Math.min(m!, qRows); i++) {\n Q.set([i, i], 1);\n }\n\n // Apply Householder reflections in reverse order\n for (let j = k - 1; j >= 0; j--) {\n const v = householderVectors[j]!;\n const tauJ = tau[j]!;\n const colLen = m! - j;\n\n // Apply H_j to Q[j:, j:]\n // Q = Q - tau * v * (v^T @ Q)\n for (let jj = j; jj < qRows; jj++) {\n let vTQ = 0;\n for (let i = 0; i < colLen; i++) {\n vTQ += v[i]! * Number(Q.get(j + i, jj));\n }\n for (let i = 0; i < colLen; i++) {\n Q.set([j + i, jj], Number(Q.get(j + i, jj)) - tauJ * v[i]! * vTQ);\n }\n }\n }\n\n // Extract final Q and R\n const qResult = ArrayStorage.zeros([m!, qRows], 'float64');\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < qRows; j++) {\n qResult.set([i, j], Number(Q.get(i, j)));\n }\n }\n\n const rRows = mode === 'complete' ? m! : k;\n const rResult = ArrayStorage.zeros([rRows, n!], 'float64');\n for (let i = 0; i < rRows; i++) {\n for (let j = 0; j < n!; j++) {\n if (j >= i) {\n rResult.set([i, j], Number(R.get(i, j)));\n }\n }\n }\n\n return { q: qResult, r: rResult };\n}\n\n/**\n * Cholesky decomposition.\n *\n * Returns the lower triangular matrix L such that A = L @ L^T\n * for a symmetric positive-definite matrix A.\n *\n * @param a - Symmetric positive-definite matrix\n * @param upper - If true, return upper triangular U such that A = U^T @ U\n * @returns Lower (or upper) triangular Cholesky factor\n */\nexport function cholesky(a: ArrayStorage, upper: boolean = false): ArrayStorage {\n if (a.ndim !== 2) {\n throw new Error(`cholesky: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`cholesky: matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n const L = ArrayStorage.zeros([size, size], 'float64');\n\n for (let i = 0; i < size; i++) {\n for (let j = 0; j <= i; j++) {\n let sum = 0;\n\n if (i === j) {\n // Diagonal elements\n for (let k = 0; k < j; k++) {\n sum += Number(L.get(j, k)) ** 2;\n }\n const val = Number(a.get(j, j)) - sum;\n if (val < 0) {\n throw new Error('cholesky: matrix is not positive definite');\n }\n L.set([j, j], Math.sqrt(val));\n } else {\n // Off-diagonal elements\n for (let k = 0; k < j; k++) {\n sum += Number(L.get(i, k)) * Number(L.get(j, k));\n }\n const ljj = Number(L.get(j, j));\n if (Math.abs(ljj) < 1e-15) {\n throw new Error('cholesky: matrix is not positive definite');\n }\n L.set([i, j], (Number(a.get(i, j)) - sum) / ljj);\n }\n }\n }\n\n if (upper) {\n // Return L^T (upper triangular)\n const U = ArrayStorage.zeros([size, size], 'float64');\n for (let i = 0; i < size; i++) {\n for (let j = i; j < size; j++) {\n U.set([i, j], Number(L.get(j, i)));\n }\n }\n return U;\n }\n\n return L;\n}\n\n/**\n * Singular Value Decomposition (full).\n * Internal helper that returns all components.\n *\n * @param a - Input matrix\n * @returns { u, s, vt } where A = U @ diag(S) @ V^T\n */\nfunction svdFull(a: ArrayStorage): { u: ArrayStorage; s: ArrayStorage; vt: ArrayStorage } {\n if (a.ndim !== 2) {\n throw new Error(`svd: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n const smaller = Math.min(m!, n!);\n\n // For SVD, we use the approach: A^T @ A has eigenvalues sigma^2\n // and A @ A^T also has eigenvalues sigma^2\n // V are eigenvectors of A^T @ A\n // U are eigenvectors of A @ A^T\n\n // Compute A^T @ A\n const ATA = ArrayStorage.zeros([n!, n!], 'float64');\n for (let i = 0; i < n!; i++) {\n for (let j = 0; j < n!; j++) {\n let sum = 0;\n for (let k = 0; k < m!; k++) {\n sum += Number(a.get(k, i)) * Number(a.get(k, j));\n }\n ATA.set([i, j], sum);\n }\n }\n\n // Get eigendecomposition of A^T @ A\n const { values: eigVals, vectors: V } = eigSymmetric(ATA);\n\n // Sort eigenvalues in descending order\n const indices = Array.from({ length: n! }, (_, i) => i);\n indices.sort((i, j) => eigVals[j]! - eigVals[i]!);\n\n // Singular values are sqrt of eigenvalues\n const s = ArrayStorage.zeros([smaller], 'float64');\n for (let i = 0; i < smaller; i++) {\n const eigVal = eigVals[indices[i]!]!;\n s.set([i], Math.sqrt(Math.max(0, eigVal)));\n }\n\n // V^T (sorted)\n const vt = ArrayStorage.zeros([n!, n!], 'float64');\n for (let i = 0; i < n!; i++) {\n for (let j = 0; j < n!; j++) {\n vt.set([i, j], V[j]![indices[i]!]!);\n }\n }\n\n // Compute U = A @ V @ S^-1\n const u = ArrayStorage.zeros([m!, m!], 'float64');\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < smaller; j++) {\n const sigma = Number(s.get(j));\n if (sigma > 1e-10) {\n let sum = 0;\n for (let k = 0; k < n!; k++) {\n sum += Number(a.get(i, k)) * Number(vt.get(j, k));\n }\n u.set([i, j], sum / sigma);\n }\n }\n }\n\n // Fill remaining columns of U with orthonormal vectors\n if (m! > smaller) {\n // Use Gram-Schmidt to complete U\n for (let j = smaller; j < m!; j++) {\n // Start with a standard basis vector\n const col: number[] = new Array(m!).fill(0);\n col[j] = 1;\n\n // Orthogonalize against existing columns\n for (let k = 0; k < j; k++) {\n let dotProd = 0;\n for (let i = 0; i < m!; i++) {\n dotProd += col[i]! * Number(u.get(i, k));\n }\n for (let i = 0; i < m!; i++) {\n col[i] = col[i]! - dotProd * Number(u.get(i, k));\n }\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < m!; i++) {\n norm += col[i]! * col[i]!;\n }\n norm = Math.sqrt(norm);\n if (norm > 1e-10) {\n for (let i = 0; i < m!; i++) {\n u.set([i, j], col[i]! / norm);\n }\n }\n }\n }\n\n return { u, s, vt };\n}\n\n/**\n * Symmetric matrix eigendecomposition using Jacobi iteration.\n * Returns eigenvalues and eigenvectors.\n *\n * @param a - Symmetric matrix\n * @returns { values, vectors } - eigenvalues array and eigenvector matrix (columns are eigenvectors)\n */\nfunction eigSymmetric(a: ArrayStorage): { values: number[]; vectors: number[][] } {\n const n = a.shape[0]!;\n const maxIter = 100 * n * n;\n const tol = 1e-10;\n\n // Copy matrix\n const A: number[][] = [];\n for (let i = 0; i < n; i++) {\n A.push([]);\n for (let j = 0; j < n; j++) {\n A[i]!.push(Number(a.get(i, j)));\n }\n }\n\n // Initialize eigenvector matrix as identity\n const V: number[][] = [];\n for (let i = 0; i < n; i++) {\n V.push([]);\n for (let j = 0; j < n; j++) {\n V[i]!.push(i === j ? 1 : 0);\n }\n }\n\n // Jacobi iteration\n for (let iter = 0; iter < maxIter; iter++) {\n // Find largest off-diagonal element\n let maxVal = 0;\n let p = 0;\n let q = 1;\n\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (Math.abs(A[i]![j]!) > maxVal) {\n maxVal = Math.abs(A[i]![j]!);\n p = i;\n q = j;\n }\n }\n }\n\n if (maxVal < tol) break;\n\n // Compute rotation angle\n const app = A[p]![p]!;\n const aqq = A[q]![q]!;\n const apq = A[p]![q]!;\n\n let theta: number;\n if (Math.abs(app - aqq) < 1e-15) {\n theta = Math.PI / 4;\n } else {\n // Standard Jacobi rotation: tan(2\u03B8) = 2*A[p,q] / (A[q,q] - A[p,p])\n theta = 0.5 * Math.atan2(2 * apq, aqq - app);\n }\n\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n\n // Apply rotation to A\n const newApp = c * c * app + s * s * aqq - 2 * s * c * apq;\n const newAqq = s * s * app + c * c * aqq + 2 * s * c * apq;\n\n A[p]![p] = newApp;\n A[q]![q] = newAqq;\n A[p]![q] = 0;\n A[q]![p] = 0;\n\n for (let i = 0; i < n; i++) {\n if (i !== p && i !== q) {\n const aip = A[i]![p]!;\n const aiq = A[i]![q]!;\n A[i]![p] = c * aip - s * aiq;\n A[p]![i] = A[i]![p]!;\n A[i]![q] = s * aip + c * aiq;\n A[q]![i] = A[i]![q]!;\n }\n }\n\n // Apply rotation to V (eigenvector accumulation)\n for (let i = 0; i < n; i++) {\n const vip = V[i]![p]!;\n const viq = V[i]![q]!;\n V[i]![p] = c * vip - s * viq;\n V[i]![q] = s * vip + c * viq;\n }\n }\n\n // Extract eigenvalues from diagonal\n const values: number[] = [];\n for (let i = 0; i < n; i++) {\n values.push(A[i]![i]!);\n }\n\n return { values, vectors: V };\n}\n\n/**\n * Singular Value Decomposition.\n *\n * @param a - Input matrix (m x n)\n * @param full_matrices - If true, return full U and V^T, otherwise reduced\n * @param compute_uv - If true, return U, S, V^T; if false, return only S\n * @returns { u, s, vt } or just s depending on compute_uv\n */\nexport function svd(\n a: ArrayStorage,\n full_matrices: boolean = true,\n compute_uv: boolean = true\n): { u: ArrayStorage; s: ArrayStorage; vt: ArrayStorage } | ArrayStorage {\n const result = svdFull(a);\n\n if (!compute_uv) {\n return result.s;\n }\n\n if (!full_matrices) {\n const [m, n] = a.shape;\n const k = Math.min(m!, n!);\n\n // Reduced U: m x k\n const uReduced = ArrayStorage.zeros([m!, k], 'float64');\n for (let i = 0; i < m!; i++) {\n for (let j = 0; j < k; j++) {\n uReduced.set([i, j], Number(result.u.get(i, j)));\n }\n }\n\n // Reduced V^T: k x n\n const vtReduced = ArrayStorage.zeros([k, n!], 'float64');\n for (let i = 0; i < k; i++) {\n for (let j = 0; j < n!; j++) {\n vtReduced.set([i, j], Number(result.vt.get(i, j)));\n }\n }\n\n return { u: uReduced, s: result.s, vt: vtReduced };\n }\n\n return result;\n}\n\n/**\n * Compute the determinant of a square matrix.\n *\n * Uses LU decomposition for numerical stability.\n *\n * @param a - Square matrix\n * @returns Determinant\n */\nexport function det(a: ArrayStorage): number {\n if (a.ndim !== 2) {\n throw new Error(`det: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`det: matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n\n if (size === 0) {\n return 1; // Empty matrix has determinant 1\n }\n\n const aData = a.data;\n\n if (size === 1) {\n return Number(aData[0]);\n }\n\n if (size === 2) {\n return Number(aData[0]) * Number(aData[3]) - Number(aData[1]) * Number(aData[2]);\n }\n\n // LU decomposition with partial pivoting\n const { lu, sign } = luDecomposition(a);\n\n // Determinant is product of diagonal of U times sign from pivoting\n // Use direct array access for speed\n const luData = lu.data as Float64Array;\n let result = sign;\n for (let i = 0; i < size; i++) {\n result *= luData[i * size + i]!;\n }\n\n return result;\n}\n\n/**\n * LU decomposition with partial pivoting - optimized with direct array access.\n *\n * @param a - Input matrix\n * @returns { lu, piv, sign } - Combined L\\U matrix, pivot indices, and sign from pivoting\n */\nfunction luDecomposition(a: ArrayStorage): { lu: ArrayStorage; piv: number[]; sign: number } {\n const [m, n] = a.shape;\n const size = m!;\n const cols = n!;\n\n // Copy matrix - use direct array access for speed\n const lu = ArrayStorage.zeros([size, cols], 'float64');\n const luData = lu.data as Float64Array;\n const aData = a.data;\n\n // Fast copy\n for (let i = 0; i < size * cols; i++) {\n luData[i] = Number(aData[i]);\n }\n\n const piv: number[] = Array.from({ length: size }, (_, i) => i);\n let sign = 1;\n\n for (let k = 0; k < Math.min(size, cols); k++) {\n // Find pivot - direct array access\n let maxVal = Math.abs(luData[k * cols + k]!);\n let maxRow = k;\n\n for (let i = k + 1; i < size; i++) {\n const val = Math.abs(luData[i * cols + k]!);\n if (val > maxVal) {\n maxVal = val;\n maxRow = i;\n }\n }\n\n // Swap rows - direct array access\n if (maxRow !== k) {\n for (let j = 0; j < cols; j++) {\n const temp = luData[k * cols + j]!;\n luData[k * cols + j] = luData[maxRow * cols + j]!;\n luData[maxRow * cols + j] = temp;\n }\n const tempPiv = piv[k]!;\n piv[k] = piv[maxRow]!;\n piv[maxRow] = tempPiv;\n sign = -sign;\n }\n\n // Eliminate - direct array access\n const pivot = luData[k * cols + k]!;\n if (Math.abs(pivot) > 1e-15) {\n for (let i = k + 1; i < size; i++) {\n const factor = luData[i * cols + k]! / pivot;\n luData[i * cols + k] = factor;\n for (let j = k + 1; j < cols; j++) {\n luData[i * cols + j] = luData[i * cols + j]! - factor * luData[k * cols + j]!;\n }\n }\n }\n }\n\n return { lu, piv, sign };\n}\n\n/**\n * Compute the matrix inverse - optimized to do LU decomposition once.\n *\n * @param a - Square matrix\n * @returns Inverse matrix\n */\nexport function inv(a: ArrayStorage): ArrayStorage {\n if (a.ndim !== 2) {\n throw new Error(`inv: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`inv: matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n\n // Do LU decomposition once\n const { lu, piv } = luDecomposition(a);\n const luData = lu.data as Float64Array;\n\n // Solve A @ X = I for all columns at once\n const result = ArrayStorage.zeros([size, size], 'float64');\n const resultData = result.data as Float64Array;\n\n // Process each column of the identity matrix\n for (let col = 0; col < size; col++) {\n // Forward substitution for column col (L @ y = P @ e_col)\n const y = new Float64Array(size);\n for (let i = 0; i < size; i++) {\n // e_col[piv[i]] is 1 if piv[i] === col, else 0\n let sum = piv[i] === col ? 1 : 0;\n for (let j = 0; j < i; j++) {\n sum -= luData[i * size + j]! * y[j]!;\n }\n y[i] = sum;\n }\n\n // Back substitution (U @ x = y)\n for (let i = size - 1; i >= 0; i--) {\n let sum = y[i]!;\n for (let j = i + 1; j < size; j++) {\n sum -= luData[i * size + j]! * resultData[j * size + col]!;\n }\n const diag = luData[i * size + i]!;\n if (Math.abs(diag) < 1e-15) {\n throw new Error('inv: singular matrix');\n }\n resultData[i * size + col] = sum / diag;\n }\n }\n\n return result;\n}\n\n/**\n * Solve a linear system A @ x = b for a vector b - optimized with direct array access.\n *\n * @param a - Coefficient matrix\n * @param b - Right-hand side vector\n * @returns Solution vector x\n */\nfunction solveVector(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const [m] = a.shape;\n const size = m!;\n\n // LU decomposition\n const { lu, piv } = luDecomposition(a);\n const luData = lu.data as Float64Array;\n const bData = b.data;\n\n // Apply permutation to b - direct array access\n const pb = new Float64Array(size);\n for (let i = 0; i < size; i++) {\n pb[i] = Number(bData[piv[i]!]);\n }\n\n // Forward substitution (L @ y = Pb) - direct array access\n const y = new Float64Array(size);\n for (let i = 0; i < size; i++) {\n let sum = pb[i]!;\n for (let j = 0; j < i; j++) {\n sum -= luData[i * size + j]! * y[j]!;\n }\n y[i] = sum;\n }\n\n // Back substitution (U @ x = y) - direct array access\n const x = ArrayStorage.zeros([size], 'float64');\n const xData = x.data as Float64Array;\n for (let i = size - 1; i >= 0; i--) {\n let sum = y[i]!;\n for (let j = i + 1; j < size; j++) {\n sum -= luData[i * size + j]! * xData[j]!;\n }\n const diag = luData[i * size + i]!;\n if (Math.abs(diag) < 1e-15) {\n throw new Error('solve: singular matrix');\n }\n xData[i] = sum / diag;\n }\n\n return x;\n}\n\n/**\n * Solve a linear system A @ x = b.\n *\n * @param a - Coefficient matrix (n x n)\n * @param b - Right-hand side (n,) or (n, k)\n * @returns Solution x with same shape as b\n */\nexport function solve(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n if (a.ndim !== 2) {\n throw new Error(`solve: coefficient matrix must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`solve: coefficient matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n\n if (b.ndim === 1) {\n if (b.shape[0] !== size) {\n throw new Error(`solve: incompatible shapes (${m},${n}) and (${b.shape[0]},)`);\n }\n return solveVector(a, b);\n }\n\n if (b.ndim === 2) {\n if (b.shape[0] !== size) {\n throw new Error(`solve: incompatible shapes (${m},${n}) and (${b.shape[0]},${b.shape[1]})`);\n }\n\n const k = b.shape[1]!;\n const result = ArrayStorage.zeros([size, k], 'float64');\n\n // Solve for each column\n for (let j = 0; j < k; j++) {\n // Extract column j of b\n const bCol = ArrayStorage.zeros([size], 'float64');\n for (let i = 0; i < size; i++) {\n bCol.set([i], Number(b.get(i, j)));\n }\n\n // Solve\n const xCol = solveVector(a, bCol);\n\n // Copy to result\n for (let i = 0; i < size; i++) {\n result.set([i, j], Number(xCol.get(i)));\n }\n }\n\n return result;\n }\n\n throw new Error(`solve: b must be 1D or 2D, got ${b.ndim}D`);\n}\n\n/**\n * Compute the least-squares solution to a linear matrix equation.\n *\n * @param a - Coefficient matrix (m x n)\n * @param b - Right-hand side (m,) or (m, k)\n * @param rcond - Cutoff for small singular values (default: machine precision * max(m, n))\n * @returns { x, residuals, rank, s } - Solution, residuals, effective rank, singular values\n */\nexport function lstsq(\n a: ArrayStorage,\n b: ArrayStorage,\n rcond: number | null = null\n): { x: ArrayStorage; residuals: ArrayStorage; rank: number; s: ArrayStorage } {\n if (a.ndim !== 2) {\n throw new Error(`lstsq: coefficient matrix must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n\n // Use SVD to solve least squares\n const { u, s, vt } = svdFull(a);\n const k = Math.min(m!, n!);\n\n // Determine rcond\n const threshold = rcond ?? Math.max(m!, n!) * Number.EPSILON;\n const maxSigma = Number(s.get(0));\n const cutoff = maxSigma * threshold;\n\n // Compute effective rank\n let rank = 0;\n for (let i = 0; i < k; i++) {\n if (Number(s.get(i)) > cutoff) {\n rank++;\n }\n }\n\n // Handle 1D b\n const b2D = b.ndim === 1 ? shapeOps.reshape(b, [b.size, 1]) : b;\n const nrhs = b2D.shape[1]!;\n\n if (b2D.shape[0] !== m) {\n throw new Error(`lstsq: incompatible shapes (${m},${n}) and (${b.shape.join(',')})`);\n }\n\n // Compute x = V @ S^+ @ U^T @ b\n // where S^+ is pseudoinverse of S (1/s for s > cutoff, 0 otherwise)\n const x = ArrayStorage.zeros([n!, nrhs], 'float64');\n\n for (let j = 0; j < nrhs; j++) {\n // Compute U^T @ b[:, j]\n const utb: number[] = new Array(m!).fill(0);\n for (let i = 0; i < m!; i++) {\n for (let l = 0; l < m!; l++) {\n utb[i]! += Number(u.get(l, i)) * Number(b2D.get(l, j));\n }\n }\n\n // Apply S^+ and V\n for (let i = 0; i < n!; i++) {\n let sum = 0;\n for (let l = 0; l < k; l++) {\n const sigma = Number(s.get(l));\n if (sigma > cutoff) {\n sum += (Number(vt.get(l, i)) * utb[l]!) / sigma;\n }\n }\n x.set([i, j], sum);\n }\n }\n\n // Compute residuals if m > n (overdetermined)\n let residuals: ArrayStorage;\n if (m! > n!) {\n residuals = ArrayStorage.zeros([nrhs], 'float64');\n for (let j = 0; j < nrhs; j++) {\n // Compute ||A @ x[:, j] - b[:, j]||^2\n let resSum = 0;\n for (let i = 0; i < m!; i++) {\n let axij = 0;\n for (let l = 0; l < n!; l++) {\n axij += Number(a.get(i, l)) * Number(x.get(l, j));\n }\n const diff = axij - Number(b2D.get(i, j));\n resSum += diff * diff;\n }\n residuals.set([j], resSum);\n }\n } else {\n residuals = ArrayStorage.zeros([0], 'float64');\n }\n\n // Reshape x if b was 1D\n const xResult = b.ndim === 1 ? shapeOps.reshape(x, [n!]) : x;\n\n return { x: xResult, residuals, rank, s };\n}\n\n/**\n * Compute the condition number of a matrix.\n *\n * @param a - Input matrix\n * @param p - Order of the norm (default: 2, -2, 'fro', or inf)\n * @returns Condition number\n */\nexport function cond(a: ArrayStorage, p: number | 'fro' | 'nuc' = 2): number {\n if (a.ndim !== 2) {\n throw new Error(`cond: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n\n if (p === 2 || p === -2) {\n // Condition number from singular values\n const { s } = svdFull(a);\n const k = Math.min(m!, n!);\n const maxS = Number(s.get(0));\n const minS = Number(s.get(k - 1));\n\n if (p === 2) {\n return minS > 0 ? maxS / minS : Infinity;\n } else {\n return maxS > 0 ? minS / maxS : 0;\n }\n }\n\n // For other norms, compute norm(A) * norm(inv(A))\n if (m !== n) {\n throw new Error(`cond: matrix must be square for p=${p}`);\n }\n\n const normA = matrix_norm(a, p as 'fro' | number) as number;\n const invA = inv(a);\n const normInvA = matrix_norm(invA, p as 'fro' | number) as number;\n\n return normA * normInvA;\n}\n\n/**\n * Compute the rank of a matrix using SVD.\n *\n * @param a - Input matrix\n * @param tol - Threshold below which singular values are considered zero\n * @returns Matrix rank\n */\nexport function matrix_rank(a: ArrayStorage, tol?: number): number {\n if (a.ndim === 0) {\n return Number(a.get()) !== 0 ? 1 : 0;\n }\n\n if (a.ndim === 1) {\n for (let i = 0; i < a.size; i++) {\n if (Number(a.get(i)) !== 0) return 1;\n }\n return 0;\n }\n\n if (a.ndim !== 2) {\n throw new Error(`matrix_rank: input must be at most 2D, got ${a.ndim}D`);\n }\n\n const { s } = svdFull(a);\n const maxS = Number(s.get(0));\n\n // Default tolerance\n const threshold = tol ?? maxS * Math.max(a.shape[0]!, a.shape[1]!) * Number.EPSILON;\n\n let rank = 0;\n for (let i = 0; i < s.size; i++) {\n if (Number(s.get(i)) > threshold) {\n rank++;\n }\n }\n\n return rank;\n}\n\n/**\n * Raise a square matrix to an integer power.\n *\n * @param a - Input square matrix\n * @param n - Integer power (can be negative)\n * @returns Matrix raised to power n\n */\nexport function matrix_power(a: ArrayStorage, n: number): ArrayStorage {\n if (a.ndim !== 2) {\n throw new Error(`matrix_power: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, k] = a.shape;\n if (m !== k) {\n throw new Error(`matrix_power: matrix must be square, got ${m}x${k}`);\n }\n\n const size = m!;\n\n if (!Number.isInteger(n)) {\n throw new Error('matrix_power: exponent must be an integer');\n }\n\n // Handle n = 0: return identity\n if (n === 0) {\n const result = ArrayStorage.zeros([size, size], 'float64');\n for (let i = 0; i < size; i++) {\n result.set([i, i], 1);\n }\n return result;\n }\n\n // Handle negative powers: A^-n = (A^-1)^n\n let base = a;\n let power = n;\n if (n < 0) {\n base = inv(a);\n power = -n;\n }\n\n // Use binary exponentiation\n let result = ArrayStorage.zeros([size, size], 'float64');\n for (let i = 0; i < size; i++) {\n result.set([i, i], 1);\n }\n\n let current = ArrayStorage.zeros([size, size], 'float64');\n for (let i = 0; i < size; i++) {\n for (let j = 0; j < size; j++) {\n current.set([i, j], Number(base.get(i, j)));\n }\n }\n\n while (power > 0) {\n if (power & 1) {\n result = matmul(result, current);\n }\n current = matmul(current, current);\n power >>= 1;\n }\n\n return result;\n}\n\n/**\n * Compute the Moore-Penrose pseudo-inverse using SVD.\n *\n * @param a - Input matrix\n * @param rcond - Cutoff for small singular values\n * @returns Pseudo-inverse of a\n */\nexport function pinv(a: ArrayStorage, rcond: number = 1e-15): ArrayStorage {\n if (a.ndim !== 2) {\n throw new Error(`pinv: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n const { u, s, vt } = svdFull(a);\n const k = Math.min(m!, n!);\n\n // Determine cutoff\n const maxS = Number(s.get(0));\n const cutoff = maxS * rcond;\n\n // Compute V @ S^+ @ U^T\n // S^+ has 1/s for s > cutoff, 0 otherwise\n const result = ArrayStorage.zeros([n!, m!], 'float64');\n\n for (let i = 0; i < n!; i++) {\n for (let j = 0; j < m!; j++) {\n let sum = 0;\n for (let l = 0; l < k; l++) {\n const sigma = Number(s.get(l));\n if (sigma > cutoff) {\n sum += (Number(vt.get(l, i)) * Number(u.get(j, l))) / sigma;\n }\n }\n result.set([i, j], sum);\n }\n }\n\n return result;\n}\n\n/**\n * Compute eigenvalues and right eigenvectors of a square matrix.\n *\n * For general matrices, uses iterative methods.\n * For symmetric matrices, use eigh for better performance.\n *\n * **Limitation**: Complex eigenvalues are not supported. For non-symmetric matrices,\n * this function returns only the real parts of eigenvalues. If your matrix has\n * complex eigenvalues (e.g., rotation matrices), results will be incorrect.\n * Use eigh() for symmetric matrices where eigenvalues are guaranteed to be real.\n *\n * @param a - Input square matrix\n * @returns { w, v } - Eigenvalues (real only) and eigenvector matrix\n */\nexport function eig(a: ArrayStorage): { w: ArrayStorage; v: ArrayStorage } {\n if (a.ndim !== 2) {\n throw new Error(`eig: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`eig: matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n\n // Check if symmetric\n let isSymmetric = true;\n outer: for (let i = 0; i < size; i++) {\n for (let j = i + 1; j < size; j++) {\n if (Math.abs(Number(a.get(i, j)) - Number(a.get(j, i))) > 1e-10) {\n isSymmetric = false;\n break outer;\n }\n }\n }\n\n if (isSymmetric) {\n // Use symmetric eigendecomposition (Jacobi method)\n // Symmetric matrices always have real eigenvalues, so this is exact\n const { values, vectors } = eigSymmetric(a);\n\n const w = ArrayStorage.zeros([size], 'float64');\n const v = ArrayStorage.zeros([size, size], 'float64');\n\n for (let i = 0; i < size; i++) {\n w.set([i], values[i]!);\n for (let j = 0; j < size; j++) {\n v.set([j, i], vectors[j]![i]!);\n }\n }\n\n return { w, v };\n }\n\n // WARNING: Non-symmetric matrices may have complex eigenvalues which we cannot represent.\n // This implementation returns only real approximations and may be inaccurate.\n console.warn(\n 'numpy-ts: eig() called on non-symmetric matrix. Complex eigenvalues are not supported; ' +\n 'results may be inaccurate. For symmetric matrices, use eigh() instead.'\n );\n\n // For non-symmetric matrices, use QR iteration (simplified)\n // This is a basic implementation that may not converge for all matrices\n const { values, vectors } = qrEigendecomposition(a);\n\n const w = ArrayStorage.zeros([size], 'float64');\n const v = ArrayStorage.zeros([size, size], 'float64');\n\n for (let i = 0; i < size; i++) {\n w.set([i], values[i]!);\n for (let j = 0; j < size; j++) {\n v.set([j, i], vectors[j]![i]!);\n }\n }\n\n return { w, v };\n}\n\n/**\n * QR algorithm for eigendecomposition.\n * Simplified version for real matrices.\n *\n * @param a - Input matrix\n * @returns { values, vectors }\n */\nfunction qrEigendecomposition(a: ArrayStorage): { values: number[]; vectors: number[][] } {\n const n = a.shape[0]!;\n const maxIter = 1000;\n const tol = 1e-10;\n\n // Copy matrix\n let A = ArrayStorage.zeros([n, n], 'float64');\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n A.set([i, j], Number(a.get(i, j)));\n }\n }\n\n // Initialize eigenvector accumulator as identity\n let V = ArrayStorage.zeros([n, n], 'float64');\n for (let i = 0; i < n; i++) {\n V.set([i, i], 1);\n }\n\n // QR iteration\n for (let iter = 0; iter < maxIter; iter++) {\n // Check for convergence (off-diagonal elements small)\n let offDiagNorm = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== j) {\n offDiagNorm += Number(A.get(i, j)) ** 2;\n }\n }\n }\n if (Math.sqrt(offDiagNorm) < tol * n) break;\n\n // QR decomposition\n const qrResult = qr(A, 'reduced') as { q: ArrayStorage; r: ArrayStorage };\n const Q = qrResult.q;\n const R = qrResult.r;\n\n // A = R @ Q\n A = matmul(R, Q);\n\n // V = V @ Q\n V = matmul(V, Q);\n }\n\n // Extract eigenvalues from diagonal\n const values: number[] = [];\n for (let i = 0; i < n; i++) {\n values.push(Number(A.get(i, i)));\n }\n\n // Convert V to 2D array\n const vectors: number[][] = [];\n for (let i = 0; i < n; i++) {\n vectors.push([]);\n for (let j = 0; j < n; j++) {\n vectors[i]!.push(Number(V.get(i, j)));\n }\n }\n\n return { values, vectors };\n}\n\n/**\n * Compute eigenvalues and eigenvectors of a real symmetric matrix.\n *\n * Note: Named \"Hermitian\" for NumPy compatibility, but only real symmetric\n * matrices are supported (complex Hermitian matrices require complex dtype support).\n * Symmetric matrices always have real eigenvalues, so results are exact.\n *\n * @param a - Real symmetric matrix\n * @param UPLO - 'L' or 'U' to use lower or upper triangle (default: 'L')\n * @returns { w, v } - Eigenvalues (sorted ascending) and eigenvector matrix\n */\nexport function eigh(a: ArrayStorage, UPLO: 'L' | 'U' = 'L'): { w: ArrayStorage; v: ArrayStorage } {\n if (a.ndim !== 2) {\n throw new Error(`eigh: input must be 2D, got ${a.ndim}D`);\n }\n\n const [m, n] = a.shape;\n if (m !== n) {\n throw new Error(`eigh: matrix must be square, got ${m}x${n}`);\n }\n\n const size = m!;\n\n // Symmetrize the matrix using specified triangle\n const sym = ArrayStorage.zeros([size, size], 'float64');\n for (let i = 0; i < size; i++) {\n for (let j = 0; j < size; j++) {\n if (UPLO === 'L') {\n if (i >= j) {\n sym.set([i, j], Number(a.get(i, j)));\n sym.set([j, i], Number(a.get(i, j)));\n }\n } else {\n if (j >= i) {\n sym.set([i, j], Number(a.get(i, j)));\n sym.set([j, i], Number(a.get(i, j)));\n }\n }\n }\n }\n\n // Use symmetric eigendecomposition\n const { values, vectors } = eigSymmetric(sym);\n\n // Sort by eigenvalue (ascending)\n const indices = Array.from({ length: size }, (_, i) => i);\n indices.sort((i, j) => values[i]! - values[j]!);\n\n const w = ArrayStorage.zeros([size], 'float64');\n const v = ArrayStorage.zeros([size, size], 'float64');\n\n for (let i = 0; i < size; i++) {\n w.set([i], values[indices[i]!]!);\n for (let j = 0; j < size; j++) {\n v.set([j, i], vectors[j]![indices[i]!]!);\n }\n }\n\n return { w, v };\n}\n\n/**\n * Compute eigenvalues of a general square matrix.\n *\n * **Limitation**: Complex eigenvalues are not supported. For non-symmetric matrices,\n * this function returns only real approximations. Use eigvalsh() for symmetric\n * matrices where eigenvalues are guaranteed to be real.\n *\n * @param a - Input square matrix\n * @returns Array of eigenvalues (real only)\n */\nexport function eigvals(a: ArrayStorage): ArrayStorage {\n const { w } = eig(a);\n return w;\n}\n\n/**\n * Compute eigenvalues of a real symmetric matrix.\n *\n * Note: Named \"Hermitian\" for NumPy compatibility, but only real symmetric\n * matrices are supported (complex Hermitian matrices require complex dtype support).\n * Symmetric matrices always have real eigenvalues, so results are exact.\n *\n * @param a - Real symmetric matrix\n * @param UPLO - 'L' or 'U' to use lower or upper triangle\n * @returns Array of eigenvalues (sorted ascending)\n */\nexport function eigvalsh(a: ArrayStorage, UPLO: 'L' | 'U' = 'L'): ArrayStorage {\n const { w } = eigh(a, UPLO);\n return w;\n}\n", "/**\n * Exponential, logarithmic, and power operations\n *\n * Pure functions for element-wise exponential operations:\n * exp, exp2, expm1, log, log2, log10, log1p, logaddexp, logaddexp2, sqrt, power\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp, elementwiseBinaryOp, broadcastShapes } from '../internal/compute';\nimport { isBigIntDType } from '../core/dtype';\n\n/**\n * Square root of each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with sqrt applied\n */\nexport function sqrt(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sqrt, false); // false = promote integers to float64\n}\n\n/**\n * Raise elements to power\n * NumPy behavior: Promotes to float64 for integer types with non-integer exponents\n *\n * @param a - Base array storage\n * @param b - Exponent (array storage or scalar)\n * @returns Result storage with power applied\n */\nexport function power(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n if (typeof b === 'number') {\n return powerScalar(a, b);\n }\n return elementwiseBinaryOp(a, b, Math.pow, 'power');\n}\n\n/**\n * Power with scalar exponent (optimized path)\n * @private\n */\nfunction powerScalar(storage: ArrayStorage, exponent: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // NumPy behavior: integer ** integer stays integer if exponent >= 0\n // integer ** negative or float exponent promotes to float64\n const isIntegerType = dtype !== 'float32' && dtype !== 'float64';\n const needsFloatPromotion = isIntegerType && (exponent < 0 || !Number.isInteger(exponent));\n const resultDtype = needsFloatPromotion ? 'float64' : dtype;\n\n // Create result with appropriate dtype\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n // BigInt arithmetic\n if (isBigIntDType(resultDtype) && Number.isInteger(exponent) && exponent >= 0) {\n // BigInt ** positive integer stays BigInt\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! ** BigInt(exponent);\n }\n } else {\n // BigInt ** negative or float promotes to float64\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.pow(Number(data[i]!), exponent);\n }\n }\n } else {\n // Regular numeric types\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.pow(Number(data[i]!), exponent);\n }\n }\n\n return result;\n}\n\n/**\n * Natural exponential function (e^x) for each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with exp applied\n */\nexport function exp(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.exp, false);\n}\n\n/**\n * Base-2 exponential function (2^x) for each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with 2^x applied\n */\nexport function exp2(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, (x) => Math.pow(2, x), false);\n}\n\n/**\n * Exponential minus one (e^x - 1) for each element\n * More accurate than exp(x) - 1 for small x\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with expm1 applied\n */\nexport function expm1(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.expm1, false);\n}\n\n/**\n * Natural logarithm (ln) for each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with log applied\n */\nexport function log(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.log, false);\n}\n\n/**\n * Base-2 logarithm for each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with log2 applied\n */\nexport function log2(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.log2, false);\n}\n\n/**\n * Base-10 logarithm for each element\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with log10 applied\n */\nexport function log10(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.log10, false);\n}\n\n/**\n * Natural logarithm of (1 + x) for each element\n * More accurate than log(1 + x) for small x\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with log1p applied\n */\nexport function log1p(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.log1p, false);\n}\n\n/**\n * Logarithm of the sum of exponentials: log(exp(x1) + exp(x2))\n * More numerically stable than computing the expression directly\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - First input array storage\n * @param x2 - Second input array storage (or scalar)\n * @returns Result storage with logaddexp applied\n */\nexport function logaddexp(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return logaddexpScalar(x1, x2);\n }\n return logaddexpArray(x1, x2);\n}\n\n/**\n * logaddexp with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction logaddexpArray(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const outputShape = broadcastShapes(x1.shape, x2.shape);\n const size = outputShape.reduce((a, b) => a * b, 1);\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for logaddexp (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n const resultData = result.data;\n\n // Use broadcast iteration\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.iget(i)) : Number(x1.iget(i));\n const val2 = isBigIntDType(dtype2) ? Number(x2.iget(i)) : Number(x2.iget(i));\n\n // Numerically stable implementation: log(exp(a) + exp(b)) = max(a,b) + log1p(exp(-|a-b|))\n const maxVal = Math.max(val1, val2);\n const minVal = Math.min(val1, val2);\n resultData[i] = maxVal + Math.log1p(Math.exp(minVal - maxVal));\n }\n\n return result;\n}\n\n/**\n * logaddexp with scalar x2 (optimized path)\n * @private\n */\nfunction logaddexpScalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const size = storage.size;\n\n // Always promote to float64 for logaddexp\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype) ? Number(storage.data[i]!) : Number(storage.data[i]!);\n\n // Numerically stable implementation\n const maxVal = Math.max(val1, x2);\n const minVal = Math.min(val1, x2);\n resultData[i] = maxVal + Math.log1p(Math.exp(minVal - maxVal));\n }\n\n return result;\n}\n\n/**\n * Logarithm base 2 of the sum of exponentials: log2(2^x1 + 2^x2)\n * More numerically stable than computing the expression directly\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - First input array storage\n * @param x2 - Second input array storage (or scalar)\n * @returns Result storage with logaddexp2 applied\n */\nexport function logaddexp2(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return logaddexp2Scalar(x1, x2);\n }\n return logaddexp2Array(x1, x2);\n}\n\n/**\n * logaddexp2 with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction logaddexp2Array(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const outputShape = broadcastShapes(x1.shape, x2.shape);\n const size = outputShape.reduce((a, b) => a * b, 1);\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for logaddexp2 (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(outputShape, resultDtype);\n const resultData = result.data;\n\n const LOG2_E = Math.LOG2E; // log2(e)\n\n // Use broadcast iteration\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.iget(i)) : Number(x1.iget(i));\n const val2 = isBigIntDType(dtype2) ? Number(x2.iget(i)) : Number(x2.iget(i));\n\n // Numerically stable implementation: log2(2^a + 2^b) = max(a,b) + log2(1 + 2^(-|a-b|))\n const maxVal = Math.max(val1, val2);\n const minVal = Math.min(val1, val2);\n // log2(1 + x) = log(1 + x) * log2(e)\n resultData[i] = maxVal + Math.log1p(Math.pow(2, minVal - maxVal)) * LOG2_E;\n }\n\n return result;\n}\n\n/**\n * logaddexp2 with scalar x2 (optimized path)\n * @private\n */\nfunction logaddexp2Scalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const size = storage.size;\n\n // Always promote to float64 for logaddexp2\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n const LOG2_E = Math.LOG2E;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype) ? Number(storage.data[i]!) : Number(storage.data[i]!);\n\n // Numerically stable implementation\n const maxVal = Math.max(val1, x2);\n const minVal = Math.min(val1, x2);\n resultData[i] = maxVal + Math.log1p(Math.pow(2, minVal - maxVal)) * LOG2_E;\n }\n\n return result;\n}\n", "/**\n * Trigonometric operations\n *\n * Pure functions for element-wise trigonometric operations:\n * sin, cos, tan, arcsin, arccos, arctan, arctan2, hypot, degrees, radians\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp } from '../internal/compute';\nimport { isBigIntDType } from '../core/dtype';\n\n/**\n * Sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with sin applied\n */\nexport function sin(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sin, false);\n}\n\n/**\n * Cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with cos applied\n */\nexport function cos(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.cos, false);\n}\n\n/**\n * Tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Result storage with tan applied\n */\nexport function tan(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.tan, false);\n}\n\n/**\n * Inverse sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range [-1, 1])\n * @returns Result storage with arcsin applied (radians)\n */\nexport function arcsin(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.asin, false);\n}\n\n/**\n * Inverse cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range [-1, 1])\n * @returns Result storage with arccos applied (radians)\n */\nexport function arccos(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.acos, false);\n}\n\n/**\n * Inverse tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with arctan applied (radians)\n */\nexport function arctan(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.atan, false);\n}\n\n/**\n * Element-wise arc tangent of x1/x2 choosing the quadrant correctly.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - y-coordinates\n * @param x2 - x-coordinates (array storage or scalar)\n * @returns Angle in radians between -\u03C0 and \u03C0\n */\nexport function arctan2(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return arctan2Scalar(x1, x2);\n }\n return arctan2Array(x1, x2);\n}\n\n/**\n * arctan2 with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction arctan2Array(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const shape = Array.from(x1.shape);\n const size = x1.size;\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for arctan2 (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.data[i]!) : Number(x1.data[i]!);\n const val2 = isBigIntDType(dtype2) ? Number(x2.data[i]!) : Number(x2.data[i]!);\n resultData[i] = Math.atan2(val1, val2);\n }\n\n return result;\n}\n\n/**\n * arctan2 with scalar x2 (optimized path)\n * @private\n */\nfunction arctan2Scalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Always promote to float64 for trig operations\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.atan2(Number(data[i]!), x2);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.atan2(Number(data[i]!), x2);\n }\n }\n\n return result;\n}\n\n/**\n * Given the \"legs\" of a right triangle, return its hypotenuse.\n * Equivalent to sqrt(x1**2 + x2**2), element-wise.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param x1 - First leg\n * @param x2 - Second leg (array storage or scalar)\n * @returns Hypotenuse\n */\nexport function hypot(x1: ArrayStorage, x2: ArrayStorage | number): ArrayStorage {\n if (typeof x2 === 'number') {\n return hypotScalar(x1, x2);\n }\n return hypotArray(x1, x2);\n}\n\n/**\n * hypot with array x2 (always returns float64 for non-float32 inputs)\n * @private\n */\nfunction hypotArray(x1: ArrayStorage, x2: ArrayStorage): ArrayStorage {\n const shape = Array.from(x1.shape);\n const size = x1.size;\n const dtype1 = x1.dtype;\n const dtype2 = x2.dtype;\n\n // Always promote to float64 for hypot (matching NumPy behavior)\n // Only preserve float32 if both inputs are float32\n const resultDtype = dtype1 === 'float32' && dtype2 === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n const val1 = isBigIntDType(dtype1) ? Number(x1.data[i]!) : Number(x1.data[i]!);\n const val2 = isBigIntDType(dtype2) ? Number(x2.data[i]!) : Number(x2.data[i]!);\n resultData[i] = Math.hypot(val1, val2);\n }\n\n return result;\n}\n\n/**\n * hypot with scalar x2 (optimized path)\n * @private\n */\nfunction hypotScalar(storage: ArrayStorage, x2: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n // Always promote to float64 for trig operations\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.hypot(Number(data[i]!), x2);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.hypot(Number(data[i]!), x2);\n }\n }\n\n return result;\n}\n\n/**\n * Convert angles from radians to degrees.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Angles in degrees\n */\nexport function degrees(a: ArrayStorage): ArrayStorage {\n const factor = 180 / Math.PI;\n return elementwiseUnaryOp(a, (x) => x * factor, false);\n}\n\n/**\n * Convert angles from degrees to radians.\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in degrees)\n * @returns Angles in radians\n */\nexport function radians(a: ArrayStorage): ArrayStorage {\n const factor = Math.PI / 180;\n return elementwiseUnaryOp(a, (x) => x * factor, false);\n}\n\n/**\n * Convert angles from degrees to radians (alias for radians).\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in degrees)\n * @returns Angles in radians\n */\nexport function deg2rad(a: ArrayStorage): ArrayStorage {\n return radians(a);\n}\n\n/**\n * Convert angles from radians to degrees (alias for degrees).\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (angles in radians)\n * @returns Angles in degrees\n */\nexport function rad2deg(a: ArrayStorage): ArrayStorage {\n return degrees(a);\n}\n", "/**\n * Hyperbolic operations\n *\n * Pure functions for element-wise hyperbolic operations:\n * sinh, cosh, tanh, arcsinh, arccosh, arctanh\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { elementwiseUnaryOp } from '../internal/compute';\n\n/**\n * Hyperbolic sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with sinh applied\n */\nexport function sinh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.sinh, false);\n}\n\n/**\n * Hyperbolic cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with cosh applied\n */\nexport function cosh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.cosh, false);\n}\n\n/**\n * Hyperbolic tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with tanh applied\n */\nexport function tanh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.tanh, false);\n}\n\n/**\n * Inverse hyperbolic sine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage\n * @returns Result storage with arcsinh applied\n */\nexport function arcsinh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.asinh, false);\n}\n\n/**\n * Inverse hyperbolic cosine of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values >= 1)\n * @returns Result storage with arccosh applied\n */\nexport function arccosh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.acosh, false);\n}\n\n/**\n * Inverse hyperbolic tangent of each element (element-wise)\n * NumPy behavior: Always promotes to float64 for integer types\n *\n * @param a - Input array storage (values in range (-1, 1))\n * @returns Result storage with arctanh applied\n */\nexport function arctanh(a: ArrayStorage): ArrayStorage {\n return elementwiseUnaryOp(a, Math.atanh, false);\n}\n", "/**\n * Advanced array operations\n *\n * Broadcasting, indexing, and comparison functions.\n * @module ops/advanced\n */\n\nimport { ArrayStorage, computeStrides } from '../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type TypedArray } from '../core/dtype';\nimport { computeBroadcastShape, broadcastTo, broadcastShapes } from '../core/broadcasting';\n\n/**\n * Broadcast an array to a given shape\n * Returns a read-only view on the original array\n */\nexport function broadcast_to(storage: ArrayStorage, targetShape: number[]): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const targetNdim = targetShape.length;\n\n if (targetNdim < ndim) {\n throw new Error(`input operand has more dimensions than allowed by the axis remapping`);\n }\n\n // Validate that broadcasting is possible\n const broadcastedShape = computeBroadcastShape([Array.from(shape), targetShape]);\n if (broadcastedShape === null) {\n throw new Error(\n `operands could not be broadcast together with shape (${shape.join(',')}) (${targetShape.join(',')})`\n );\n }\n\n // Check result matches target\n for (let i = 0; i < targetNdim; i++) {\n if (broadcastedShape[i] !== targetShape[i]) {\n throw new Error(\n `operands could not be broadcast together with shape (${shape.join(',')}) (${targetShape.join(',')})`\n );\n }\n }\n\n return broadcastTo(storage, targetShape);\n}\n\n/**\n * Broadcast multiple arrays to a common shape\n * Returns views on the original arrays\n */\nexport function broadcast_arrays(storages: ArrayStorage[]): ArrayStorage[] {\n if (storages.length === 0) {\n return [];\n }\n\n if (storages.length === 1) {\n return [storages[0]!];\n }\n\n // Compute broadcast shape\n const shapes = storages.map((s) => Array.from(s.shape));\n const targetShape = computeBroadcastShape(shapes);\n\n if (targetShape === null) {\n throw new Error(\n `operands could not be broadcast together with shapes ${shapes.map((s) => `(${s.join(',')})`).join(' ')}`\n );\n }\n\n // Broadcast each array to the target shape\n return storages.map((s) => broadcastTo(s, targetShape));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes\n * Re-export from core/broadcasting for convenience\n */\nexport { broadcastShapes as broadcast_shapes };\n\n/**\n * Take elements from an array along an axis\n */\nexport function take(storage: ArrayStorage, indices: number[], axis?: number): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n if (axis === undefined) {\n // Flatten and take\n const flatSize = storage.size;\n\n // Validate indices\n for (const idx of indices) {\n const normalizedIdx = idx < 0 ? flatSize + idx : idx;\n if (normalizedIdx < 0 || normalizedIdx >= flatSize) {\n throw new Error(`index ${idx} is out of bounds for axis 0 with size ${flatSize}`);\n }\n }\n\n // Create output array\n const outputSize = indices.length;\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take from array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n for (let i = 0; i < outputSize; i++) {\n let idx = indices[i]!;\n if (idx < 0) idx = flatSize + idx;\n const value = storage.iget(idx);\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, [outputSize], dtype);\n }\n\n // Take along specified axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Validate indices\n for (const idx of indices) {\n const normalizedIdx = idx < 0 ? axisSize + idx : idx;\n if (normalizedIdx < 0 || normalizedIdx >= axisSize) {\n throw new Error(\n `index ${idx} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n }\n\n // Calculate output shape\n const outputShape = Array.from(shape);\n outputShape[normalizedAxis] = indices.length;\n\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take from array with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const outputStrides = computeStrides(outputShape);\n\n // Iterate through output positions\n const outputIndices = new Array(ndim).fill(0);\n for (let i = 0; i < outputSize; i++) {\n // Compute source index\n const sourceIndices = [...outputIndices];\n let targetIdx = outputIndices[normalizedAxis]!;\n let sourceAxisIdx = indices[targetIdx]!;\n if (sourceAxisIdx < 0) sourceAxisIdx = axisSize + sourceAxisIdx;\n sourceIndices[normalizedAxis] = sourceAxisIdx;\n\n const value = storage.get(...sourceIndices);\n\n // Write to output\n let outIdx = 0;\n for (let d = 0; d < ndim; d++) {\n outIdx += outputIndices[d]! * outputStrides[d]!;\n }\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = value as number;\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < outputShape[d]!) {\n break;\n }\n outputIndices[d] = 0;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Put values at specified indices (modifies array in-place)\n */\nexport function put(\n storage: ArrayStorage,\n indices: number[],\n values: ArrayStorage | number | bigint\n): void {\n const flatSize = storage.size;\n const dtype = storage.dtype;\n\n // Get values to put\n let valueArray: (number | bigint)[];\n if (typeof values === 'number' || typeof values === 'bigint') {\n valueArray = new Array(indices.length).fill(values);\n } else {\n // Extract values from storage\n valueArray = [];\n for (let i = 0; i < values.size; i++) {\n valueArray.push(values.iget(i));\n }\n // Broadcast values if needed\n if (valueArray.length === 1) {\n valueArray = new Array(indices.length).fill(valueArray[0]);\n } else if (valueArray.length !== indices.length) {\n // Tile values to match indices length\n const original = [...valueArray];\n valueArray = [];\n for (let i = 0; i < indices.length; i++) {\n valueArray.push(original[i % original.length]!);\n }\n }\n }\n\n // Put values at indices\n for (let i = 0; i < indices.length; i++) {\n let idx = indices[i]!;\n if (idx < 0) idx = flatSize + idx;\n\n if (idx < 0 || idx >= flatSize) {\n throw new Error(`index ${indices[i]} is out of bounds for axis 0 with size ${flatSize}`);\n }\n\n let value = valueArray[i]!;\n\n // Convert value to appropriate type\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(idx, value);\n }\n}\n\n/**\n * Construct array from index array and choices\n */\nexport function choose(indexStorage: ArrayStorage, choices: ArrayStorage[]): ArrayStorage {\n if (choices.length === 0) {\n throw new Error('choices cannot be empty');\n }\n\n const indexShape = indexStorage.shape;\n const numChoices = choices.length;\n const dtype = choices[0]!.dtype;\n\n // Validate that all choices have compatible shapes\n const shapes = choices.map((c) => Array.from(c.shape));\n shapes.unshift(Array.from(indexShape));\n const broadcastedShape = computeBroadcastShape(shapes);\n\n if (broadcastedShape === null) {\n throw new Error('operands could not be broadcast together');\n }\n\n // Broadcast index array and choices to common shape\n const broadcastedIndex = broadcastTo(indexStorage, broadcastedShape);\n const broadcastedChoices = choices.map((c) => broadcastTo(c, broadcastedShape));\n\n // Create output array\n const outputSize = broadcastedShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot choose with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n // Fill output\n for (let i = 0; i < outputSize; i++) {\n const choiceIdx = Number(broadcastedIndex.iget(i));\n\n if (choiceIdx < 0 || choiceIdx >= numChoices) {\n throw new Error(`index ${choiceIdx} is out of bounds for axis 0 with size ${numChoices}`);\n }\n\n const value = broadcastedChoices[choiceIdx]!.iget(i);\n\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, broadcastedShape, dtype);\n}\n\n/**\n * Check if two arrays are element-wise equal\n */\nexport function array_equal(a: ArrayStorage, b: ArrayStorage, equal_nan: boolean = false): boolean {\n // Check shapes match\n if (a.ndim !== b.ndim) {\n return false;\n }\n\n for (let i = 0; i < a.ndim; i++) {\n if (a.shape[i] !== b.shape[i]) {\n return false;\n }\n }\n\n // Check all elements\n const size = a.size;\n for (let i = 0; i < size; i++) {\n const aVal = a.iget(i);\n const bVal = b.iget(i);\n\n // Handle NaN comparison\n if (equal_nan) {\n const aIsNaN = typeof aVal === 'number' && Number.isNaN(aVal);\n const bIsNaN = typeof bVal === 'number' && Number.isNaN(bVal);\n if (aIsNaN && bIsNaN) {\n continue;\n }\n }\n\n if (aVal !== bVal) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Take values along an axis using 1D index array\n */\nexport function take_along_axis(\n storage: ArrayStorage,\n indices: ArrayStorage,\n axis: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // indices must have same ndim as storage\n const indicesShape = indices.shape;\n if (indicesShape.length !== ndim) {\n throw new Error(\n `indices and arr must have the same number of dimensions, got ${indicesShape.length} vs ${ndim}`\n );\n }\n\n // Check that non-axis dimensions match (or are broadcastable with 1)\n for (let i = 0; i < ndim; i++) {\n if (i !== normalizedAxis) {\n if (indicesShape[i] !== shape[i] && indicesShape[i] !== 1 && shape[i] !== 1) {\n throw new Error(\n `index ${indicesShape[i]} is out of bounds for size ${shape[i]} in dimension ${i}`\n );\n }\n }\n }\n\n // Output shape matches indices shape\n const outputShape = Array.from(indicesShape);\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot take_along_axis with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n const inputStrides = computeStrides(shape);\n const indicesStrides = computeStrides(indicesShape);\n\n const axisSize = shape[normalizedAxis]!;\n\n // Iterate through output positions\n for (let outIdx = 0; outIdx < outputSize; outIdx++) {\n // Convert outIdx to multi-index in output shape\n const multiIdx = new Array(ndim);\n let remaining = outIdx;\n for (let d = ndim - 1; d >= 0; d--) {\n multiIdx[d] = remaining % outputShape[d]!;\n remaining = Math.floor(remaining / outputShape[d]!);\n }\n\n // Get the index value from indices array\n let indicesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const idx = indicesShape[d] === 1 ? 0 : multiIdx[d]!;\n indicesLinearIdx += idx * indicesStrides[d]!;\n }\n let indexValue = Number(indices.iget(indicesLinearIdx));\n if (indexValue < 0) indexValue = axisSize + indexValue;\n if (indexValue < 0 || indexValue >= axisSize) {\n throw new Error(\n `index ${indexValue} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n\n // Compute source index\n const sourceMultiIdx = [...multiIdx];\n sourceMultiIdx[normalizedAxis] = indexValue;\n let srcLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const idx = shape[d] === 1 ? 0 : sourceMultiIdx[d]!;\n srcLinearIdx += idx * inputStrides[d]!;\n }\n\n const value = storage.iget(srcLinearIdx);\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = value as number;\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Put values into array along an axis using 1D index array\n */\nexport function put_along_axis(\n storage: ArrayStorage,\n indices: ArrayStorage,\n values: ArrayStorage,\n axis: number\n): void {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const indicesShape = indices.shape;\n const valuesShape = values.shape;\n\n if (indicesShape.length !== ndim || valuesShape.length !== ndim) {\n throw new Error('indices, arr, and values must have same ndim');\n }\n\n const axisSize = shape[normalizedAxis]!;\n const inputStrides = computeStrides(shape);\n const indicesStrides = computeStrides(indicesShape);\n const valuesStrides = computeStrides(valuesShape);\n\n // Iterate through indices positions\n const indicesSize = indicesShape.reduce((a, b) => a * b, 1);\n for (let idx = 0; idx < indicesSize; idx++) {\n // Convert idx to multi-index\n const multiIdx = new Array(ndim);\n let remaining = idx;\n for (let d = ndim - 1; d >= 0; d--) {\n multiIdx[d] = remaining % indicesShape[d]!;\n remaining = Math.floor(remaining / indicesShape[d]!);\n }\n\n // Get the index value\n let indicesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n indicesLinearIdx += multiIdx[d]! * indicesStrides[d]!;\n }\n let indexValue = Number(indices.iget(indicesLinearIdx));\n if (indexValue < 0) indexValue = axisSize + indexValue;\n if (indexValue < 0 || indexValue >= axisSize) {\n throw new Error(\n `index ${indexValue} is out of bounds for axis ${normalizedAxis} with size ${axisSize}`\n );\n }\n\n // Get value from values array (broadcast if needed)\n let valuesLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n const vidx = valuesShape[d] === 1 ? 0 : multiIdx[d]!;\n valuesLinearIdx += vidx * valuesStrides[d]!;\n }\n let value = values.iget(valuesLinearIdx);\n\n // Compute destination index\n const destMultiIdx = [...multiIdx];\n destMultiIdx[normalizedAxis] = indexValue;\n let destLinearIdx = 0;\n for (let d = 0; d < ndim; d++) {\n destLinearIdx += destMultiIdx[d]! * inputStrides[d]!;\n }\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(destLinearIdx, value);\n }\n}\n\n/**\n * Change elements of array based on conditional mask\n */\nexport function putmask(\n storage: ArrayStorage,\n mask: ArrayStorage,\n values: ArrayStorage | number | bigint\n): void {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Get values array\n let valueArray: (number | bigint)[];\n if (typeof values === 'number' || typeof values === 'bigint') {\n valueArray = [values];\n } else {\n valueArray = [];\n for (let i = 0; i < values.size; i++) {\n valueArray.push(values.iget(i));\n }\n }\n\n // Put values where mask is true\n let valueIdx = 0;\n for (let i = 0; i < size; i++) {\n const maskVal = mask.iget(i);\n if (maskVal) {\n let value = valueArray[valueIdx % valueArray.length]!;\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(i, value);\n valueIdx++;\n }\n }\n}\n\n/**\n * Return selected slices along given axis based on condition\n */\nexport function compress(\n condition: ArrayStorage,\n storage: ArrayStorage,\n axis?: number\n): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Get direct access to underlying data for fast reading\n const inputData = storage.data;\n const isBigInt = isBigIntDType(dtype);\n\n if (axis === undefined) {\n // Flatten and select - optimized path\n // First pass: count true values\n let trueCount = 0;\n const maxLen = Math.min(condition.size, storage.size);\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) trueCount++;\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot compress with dtype ${dtype}`);\n }\n const outputData = new Constructor(trueCount);\n\n // Second pass: copy values\n let outIdx = 0;\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[outIdx] = (\n inputData as BigInt64Array | BigUint64Array\n )[i]!;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[outIdx] = (\n inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>\n )[i]!;\n }\n outIdx++;\n }\n }\n\n return ArrayStorage.fromData(outputData, [trueCount], dtype);\n }\n\n // Compress along axis - optimized version\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Build boolean array and axis mapping in one pass\n const axisSize = shape[normalizedAxis]!;\n const maxLen = Math.min(condition.size, axisSize);\n const axisMap: number[] = [];\n\n for (let i = 0; i < maxLen; i++) {\n if (condition.iget(i)) {\n axisMap.push(i);\n }\n }\n\n const trueCount = axisMap.length;\n\n // Output shape\n const outputShape = [...shape];\n outputShape[normalizedAxis] = trueCount;\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot compress with dtype ${dtype}`);\n }\n const outputData = new Constructor(outputSize);\n\n // Compute strides for efficient indexing\n const inputStrides = computeStrides(shape);\n\n // Special case: axis = 0 (most common, optimize heavily)\n if (normalizedAxis === 0) {\n const strideAlongAxis = inputStrides[0]!;\n const elementsPerSlice = shape.slice(1).reduce((a, b) => a * b, 1);\n\n let outIdx = 0;\n for (let i = 0; i < trueCount; i++) {\n const inputAxisIdx = axisMap[i]!;\n const srcOffset = inputAxisIdx * strideAlongAxis;\n\n // Copy entire slice at once\n if (isBigInt) {\n const src = inputData as BigInt64Array | BigUint64Array;\n const dst = outputData as BigInt64Array | BigUint64Array;\n for (let j = 0; j < elementsPerSlice; j++) {\n dst[outIdx++] = src[srcOffset + j]!;\n }\n } else {\n const src = inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n const dst = outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let j = 0; j < elementsPerSlice; j++) {\n dst[outIdx++] = src[srcOffset + j]!;\n }\n }\n }\n } else {\n // General case for other axes\n // Pre-compute outer and inner iteration counts\n const outerSize = shape.slice(0, normalizedAxis).reduce((a, b) => a * b, 1);\n const innerSize = shape.slice(normalizedAxis + 1).reduce((a, b) => a * b, 1);\n\n let outIdx = 0;\n for (let outer = 0; outer < outerSize; outer++) {\n for (let axisIdx = 0; axisIdx < trueCount; axisIdx++) {\n const inputAxisIdx = axisMap[axisIdx]!;\n\n // Compute base offset for this outer/axis combination\n let baseOffset = 0;\n let rem = outer;\n for (let d = normalizedAxis - 1; d >= 0; d--) {\n const idx = rem % shape[d]!;\n rem = Math.floor(rem / shape[d]!);\n baseOffset += idx * inputStrides[d]!;\n }\n baseOffset += inputAxisIdx * inputStrides[normalizedAxis]!;\n\n // Copy inner elements\n if (isBigInt) {\n const src = inputData as BigInt64Array | BigUint64Array;\n const dst = outputData as BigInt64Array | BigUint64Array;\n for (let inner = 0; inner < innerSize; inner++) {\n dst[outIdx++] = src[baseOffset + inner]!;\n }\n } else {\n const src = inputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n const dst = outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let inner = 0; inner < innerSize; inner++) {\n dst[outIdx++] = src[baseOffset + inner]!;\n }\n }\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Return array drawn from elements in choicelist, depending on conditions\n */\nexport function select(\n condlist: ArrayStorage[],\n choicelist: ArrayStorage[],\n defaultValue: number | bigint = 0\n): ArrayStorage {\n if (condlist.length !== choicelist.length) {\n throw new Error('condlist and choicelist must have same length');\n }\n\n if (condlist.length === 0) {\n throw new Error('condlist and choicelist cannot be empty');\n }\n\n // Compute broadcast shape from all conditions and choices\n const allShapes = [\n ...condlist.map((c) => Array.from(c.shape)),\n ...choicelist.map((c) => Array.from(c.shape)),\n ];\n const outputShape = computeBroadcastShape(allShapes);\n if (outputShape === null) {\n throw new Error('condlist and choicelist arrays could not be broadcast together');\n }\n\n const dtype = choicelist[0]!.dtype;\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot select with dtype ${dtype}`);\n }\n\n // Initialize with default value\n let defaultVal: number | bigint = defaultValue;\n if (isBigIntDType(dtype)) {\n defaultVal = typeof defaultValue === 'bigint' ? defaultValue : BigInt(defaultValue);\n } else {\n defaultVal = typeof defaultValue === 'bigint' ? Number(defaultValue) : defaultValue;\n }\n\n const outputData = new Constructor(outputSize);\n for (let i = 0; i < outputSize; i++) {\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = defaultVal as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = defaultVal as number;\n }\n }\n\n // Broadcast all arrays\n const broadcastedConds = condlist.map((c) => broadcastTo(c, outputShape));\n const broadcastedChoices = choicelist.map((c) => broadcastTo(c, outputShape));\n\n // Process conditions in order (first match wins)\n for (let i = 0; i < outputSize; i++) {\n for (let j = 0; j < condlist.length; j++) {\n if (broadcastedConds[j]!.iget(i)) {\n const value = broadcastedChoices[j]!.iget(i);\n if (isBigIntDType(dtype)) {\n (outputData as BigInt64Array | BigUint64Array)[i] = value as bigint;\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value as number;\n }\n break;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Change elements of array based on conditional and input values\n */\nexport function place(storage: ArrayStorage, mask: ArrayStorage, vals: ArrayStorage): void {\n const size = storage.size;\n const dtype = storage.dtype;\n\n // Get values array\n const valueArray: (number | bigint)[] = [];\n for (let i = 0; i < vals.size; i++) {\n valueArray.push(vals.iget(i));\n }\n\n if (valueArray.length === 0) {\n return;\n }\n\n // Place values where mask is true\n let valueIdx = 0;\n for (let i = 0; i < size; i++) {\n const maskVal = mask.iget(i);\n if (maskVal) {\n let value = valueArray[valueIdx % valueArray.length]!;\n\n // Convert type if needed\n if (isBigIntDType(dtype)) {\n if (typeof value !== 'bigint') {\n value = BigInt(Math.round(Number(value)));\n }\n } else {\n if (typeof value === 'bigint') {\n value = Number(value);\n }\n }\n\n storage.iset(i, value);\n valueIdx++;\n }\n }\n}\n\n/**\n * Return indices to access main diagonal of array\n */\nexport function diag_indices(n: number, ndim: number = 2): ArrayStorage[] {\n if (ndim < 1) {\n throw new Error('ndim must be at least 1');\n }\n\n const indices = new Int32Array(n);\n for (let i = 0; i < n; i++) {\n indices[i] = i;\n }\n\n const result: ArrayStorage[] = [];\n for (let d = 0; d < ndim; d++) {\n result.push(ArrayStorage.fromData(new Int32Array(indices), [n], 'int32'));\n }\n\n return result;\n}\n\n/**\n * Return indices to access main diagonal of array from given array\n */\nexport function diag_indices_from(storage: ArrayStorage): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n\n if (ndim < 2) {\n throw new Error('array must be at least 2-D');\n }\n\n // Check that all dimensions are equal\n const n = shape[0]!;\n for (let i = 1; i < ndim; i++) {\n if (shape[i] !== n) {\n throw new Error('All dimensions of input must be equal');\n }\n }\n\n return diag_indices(n, ndim);\n}\n\n/**\n * Return indices for lower-triangle of an (n, m) array\n */\nexport function tril_indices(n: number, k: number = 0, m?: number): ArrayStorage[] {\n const cols = m ?? n;\n\n const rows: number[] = [];\n const colIndices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j <= Math.min(i + k, cols - 1); j++) {\n if (j >= 0) {\n rows.push(i);\n colIndices.push(j);\n }\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(colIndices), [colIndices.length], 'int32'),\n ];\n}\n\n/**\n * Return indices for lower-triangle of given array\n */\nexport function tril_indices_from(storage: ArrayStorage, k: number = 0): ArrayStorage[] {\n const shape = storage.shape;\n\n if (shape.length !== 2) {\n throw new Error('array must be 2-D');\n }\n\n return tril_indices(shape[0]!, k, shape[1]);\n}\n\n/**\n * Return indices for upper-triangle of an (n, m) array\n */\nexport function triu_indices(n: number, k: number = 0, m?: number): ArrayStorage[] {\n const cols = m ?? n;\n\n const rows: number[] = [];\n const colIndices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = Math.max(i + k, 0); j < cols; j++) {\n rows.push(i);\n colIndices.push(j);\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(colIndices), [colIndices.length], 'int32'),\n ];\n}\n\n/**\n * Return indices for upper-triangle of given array\n */\nexport function triu_indices_from(storage: ArrayStorage, k: number = 0): ArrayStorage[] {\n const shape = storage.shape;\n\n if (shape.length !== 2) {\n throw new Error('array must be 2-D');\n }\n\n return triu_indices(shape[0]!, k, shape[1]);\n}\n\n/**\n * Return indices to access elements using mask function\n */\nexport function mask_indices(\n n: number,\n mask_func: (n: number, k: number) => ArrayStorage,\n k: number = 0\n): ArrayStorage[] {\n // Generate the mask using the mask function\n const mask = mask_func(n, k);\n const maskShape = mask.shape;\n\n if (maskShape.length !== 2 || maskShape[0] !== n || maskShape[1] !== n) {\n throw new Error('mask_func must return n x n array');\n }\n\n const rows: number[] = [];\n const cols: number[] = [];\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (mask.get(i, j)) {\n rows.push(i);\n cols.push(j);\n }\n }\n }\n\n return [\n ArrayStorage.fromData(new Int32Array(rows), [rows.length], 'int32'),\n ArrayStorage.fromData(new Int32Array(cols), [cols.length], 'int32'),\n ];\n}\n\n/**\n * Return array representing indices of a grid\n */\nexport function indices(\n dimensions: number[],\n dtype: 'int32' | 'int64' | 'float64' = 'int32'\n): ArrayStorage {\n const ndim = dimensions.length;\n const outputShape = [ndim, ...dimensions];\n const outputSize = outputShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create indices with dtype ${dtype}`);\n }\n\n const outputData = new Constructor(outputSize);\n const gridSize = dimensions.reduce((a, b) => a * b, 1);\n\n // For each dimension, fill the corresponding slice\n for (let d = 0; d < ndim; d++) {\n const sliceOffset = d * gridSize;\n\n // Iterate through grid positions\n for (let gridIdx = 0; gridIdx < gridSize; gridIdx++) {\n // Convert gridIdx to multi-index\n const multiIdx = new Array(ndim);\n let remaining = gridIdx;\n for (let i = ndim - 1; i >= 0; i--) {\n multiIdx[i] = remaining % dimensions[i]!;\n remaining = Math.floor(remaining / dimensions[i]!);\n }\n\n const value = multiIdx[d]!;\n if (dtype === 'int64') {\n (outputData as BigInt64Array)[sliceOffset + gridIdx] = BigInt(value);\n } else {\n (outputData as Float64Array | Int32Array)[sliceOffset + gridIdx] = value;\n }\n }\n }\n\n return ArrayStorage.fromData(outputData, outputShape, dtype);\n}\n\n/**\n * Construct open mesh from multiple sequences\n */\nexport function ix_(...args: ArrayStorage[]): ArrayStorage[] {\n const ndim = args.length;\n const result: ArrayStorage[] = [];\n\n for (let i = 0; i < ndim; i++) {\n const arr = args[i]!;\n const arrSize = arr.size;\n const dtype = arr.dtype;\n\n // Create shape with 1s except at position i\n const shape = new Array(ndim).fill(1);\n shape[i] = arrSize;\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create ix_ with dtype ${dtype}`);\n }\n\n const data = new Constructor(arrSize);\n for (let j = 0; j < arrSize; j++) {\n const value = arr.iget(j);\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[j] = value as bigint;\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[j] = value as number;\n }\n }\n\n result.push(ArrayStorage.fromData(data, shape, dtype));\n }\n\n return result;\n}\n\n/**\n * Convert multi-dimensional index arrays to flat index array\n */\nexport function ravel_multi_index(\n multi_index: ArrayStorage[],\n dims: number[],\n mode: 'raise' | 'wrap' | 'clip' = 'raise'\n): ArrayStorage {\n if (multi_index.length !== dims.length) {\n throw new Error('multi_index length must equal dims length');\n }\n\n if (multi_index.length === 0) {\n throw new Error('multi_index cannot be empty');\n }\n\n const size = multi_index[0]!.size;\n const ndim = dims.length;\n const outputData = new Int32Array(size);\n\n // Compute strides for row-major (C) order\n const strides = new Array(ndim);\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= dims[i]!;\n }\n\n for (let i = 0; i < size; i++) {\n let flatIdx = 0;\n for (let d = 0; d < ndim; d++) {\n let idx = Number(multi_index[d]!.iget(i));\n const dimSize = dims[d]!;\n\n // Handle mode\n if (mode === 'wrap') {\n idx = ((idx % dimSize) + dimSize) % dimSize;\n } else if (mode === 'clip') {\n idx = Math.max(0, Math.min(idx, dimSize - 1));\n } else if (idx < 0 || idx >= dimSize) {\n throw new Error(`index ${idx} is out of bounds for axis ${d} with size ${dimSize}`);\n }\n\n flatIdx += idx * strides[d]!;\n }\n outputData[i] = flatIdx;\n }\n\n return ArrayStorage.fromData(outputData, [size], 'int32');\n}\n\n/**\n * Convert flat index array to tuple of coordinate arrays\n */\nexport function unravel_index(\n indices: ArrayStorage | number,\n shape: number[],\n order: 'C' | 'F' = 'C'\n): ArrayStorage[] {\n const ndim = shape.length;\n\n // Handle scalar input\n let indicesArray: number[];\n let outputShape: number[];\n if (typeof indices === 'number') {\n indicesArray = [indices];\n outputShape = [];\n } else {\n indicesArray = [];\n for (let i = 0; i < indices.size; i++) {\n indicesArray.push(Number(indices.iget(i)));\n }\n outputShape = Array.from(indices.shape);\n }\n\n const size = indicesArray.length;\n const totalSize = shape.reduce((a, b) => a * b, 1);\n\n // Compute strides\n const strides = new Array(ndim);\n if (order === 'C') {\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n } else {\n let stride = 1;\n for (let i = 0; i < ndim; i++) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n }\n\n // Create output arrays\n const result: ArrayStorage[] = [];\n for (let d = 0; d < ndim; d++) {\n const data = new Int32Array(size);\n result.push(ArrayStorage.fromData(data, outputShape.length ? outputShape : [1], 'int32'));\n }\n\n // Convert each flat index\n for (let i = 0; i < size; i++) {\n let flatIdx = indicesArray[i]!;\n if (flatIdx < 0 || flatIdx >= totalSize) {\n throw new Error(`index ${flatIdx} is out of bounds for array with size ${totalSize}`);\n }\n\n if (order === 'C') {\n for (let d = 0; d < ndim; d++) {\n const coord = Math.floor(flatIdx / strides[d]!);\n flatIdx = flatIdx % strides[d]!;\n (result[d]!.data as Int32Array)[i] = coord % shape[d]!;\n }\n } else {\n for (let d = ndim - 1; d >= 0; d--) {\n const coord = Math.floor(flatIdx / strides[d]!);\n flatIdx = flatIdx % strides[d]!;\n (result[d]!.data as Int32Array)[i] = coord % shape[d]!;\n }\n }\n }\n\n // For scalar input, return scalar-shaped results\n if (typeof indices === 'number') {\n return result.map((arr) => {\n const value = arr.iget(0);\n return ArrayStorage.fromData(new Int32Array([Number(value)]), [], 'int32');\n });\n }\n\n return result;\n}\n", "/**\n * Bitwise operations\n *\n * Pure functions for element-wise bitwise operations:\n * bitwise_and, bitwise_or, bitwise_xor, bitwise_not, invert,\n * left_shift, right_shift, packbits, unpackbits\n *\n * These operations only work on integer types.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, isIntegerDType, promoteDTypes, DType } from '../core/dtype';\nimport { elementwiseBinaryOp } from '../internal/compute';\n\n/**\n * Helper: Validate that dtype is an integer type for bitwise operations\n */\nfunction validateIntegerDType(dtype: DType, opName: string): void {\n if (!isIntegerDType(dtype) && dtype !== 'bool') {\n throw new TypeError(\n `ufunc '${opName}' not supported for the input types, and the inputs could not be safely coerced to any supported types`\n );\n }\n}\n\n/**\n * Helper: Check if two arrays can use the fast path\n * (both C-contiguous with same shape, no broadcasting needed)\n */\nfunction canUseFastPath(a: ArrayStorage, b: ArrayStorage): boolean {\n return (\n a.isCContiguous &&\n b.isCContiguous &&\n a.shape.length === b.shape.length &&\n a.shape.every((dim, i) => dim === b.shape[i])\n );\n}\n\n/**\n * Bitwise AND of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_and(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_and');\n\n if (typeof b === 'number') {\n return bitwiseAndScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_and');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseAndArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x & y, 'bitwise_and');\n}\n\n/**\n * Fast path for bitwise AND of two contiguous arrays\n * @private\n */\nfunction bitwiseAndArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) & (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! & bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) & (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise AND with scalar (optimized path)\n * @private\n */\nfunction bitwiseAndScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! & scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) & scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise OR of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_or(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_or');\n\n if (typeof b === 'number') {\n return bitwiseOrScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_or');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseOrArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x | y, 'bitwise_or');\n}\n\n/**\n * Fast path for bitwise OR of two contiguous arrays\n * @private\n */\nfunction bitwiseOrArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) | (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! | bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) | (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise OR with scalar (optimized path)\n * @private\n */\nfunction bitwiseOrScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! | scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) | scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise XOR of two arrays or array and scalar\n *\n * @param a - First array storage (must be integer type)\n * @param b - Second array storage or scalar (must be integer type)\n * @returns Result storage\n */\nexport function bitwise_xor(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_xor');\n\n if (typeof b === 'number') {\n return bitwiseXorScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'bitwise_xor');\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return bitwiseXorArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x ^ y, 'bitwise_xor');\n}\n\n/**\n * Fast path for bitwise XOR of two contiguous arrays\n * @private\n */\nfunction bitwiseXorArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const needsConversion = !isBigIntDType(a.dtype) || !isBigIntDType(b.dtype);\n\n if (needsConversion) {\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) ^ (bVal as bigint);\n }\n } else {\n const aTyped = aData as BigInt64Array | BigUint64Array;\n const bTyped = bData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = aTyped[i]! ^ bTyped[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) ^ (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise XOR with scalar (optimized path)\n * @private\n */\nfunction bitwiseXorScalar(storage: ArrayStorage, scalar: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const scalarBig = BigInt(Math.round(scalar));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! ^ scalarBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) ^ scalar;\n }\n }\n\n return result;\n}\n\n/**\n * Bitwise NOT (invert) of each element\n *\n * @param a - Input array storage (must be integer type)\n * @returns Result storage with bitwise NOT values\n */\nexport function bitwise_not(a: ArrayStorage): ArrayStorage {\n validateIntegerDType(a.dtype, 'bitwise_not');\n\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n resultTyped[i] = ~thisTyped[i]!;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = ~(data[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Invert (bitwise NOT) - alias for bitwise_not\n *\n * @param a - Input array storage (must be integer type)\n * @returns Result storage with inverted values\n */\nexport function invert(a: ArrayStorage): ArrayStorage {\n return bitwise_not(a);\n}\n\n/**\n * Left shift of array elements\n *\n * @param a - Input array storage (must be integer type)\n * @param b - Shift amount (array storage or scalar)\n * @returns Result storage with left-shifted values\n */\nexport function left_shift(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'left_shift');\n\n if (typeof b === 'number') {\n return leftShiftScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'left_shift');\n\n // Fast path: single-element array or broadcastable scalar shape treated as scalar\n if (b.size === 1 || (b.ndim === 1 && b.shape[0] === 1)) {\n const shiftVal = isBigIntDType(b.dtype) ? Number(b.data[0] as bigint) : (b.data[0] as number);\n return leftShiftScalar(a, shiftVal);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return leftShiftArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x << y, 'left_shift');\n}\n\n/**\n * Fast path for left shift of two contiguous arrays\n * @private\n */\nfunction leftShiftArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) << (bVal as bigint);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) << (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Left shift with scalar (optimized path)\n * @private\n */\nfunction leftShiftScalar(storage: ArrayStorage, shift: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const shiftBig = BigInt(Math.round(shift));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! << shiftBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) << shift;\n }\n }\n\n return result;\n}\n\n/**\n * Right shift of array elements\n *\n * @param a - Input array storage (must be integer type)\n * @param b - Shift amount (array storage or scalar)\n * @returns Result storage with right-shifted values\n */\nexport function right_shift(a: ArrayStorage, b: ArrayStorage | number): ArrayStorage {\n validateIntegerDType(a.dtype, 'right_shift');\n\n if (typeof b === 'number') {\n return rightShiftScalar(a, b);\n }\n\n validateIntegerDType(b.dtype, 'right_shift');\n\n // Fast path: single-element array or broadcastable scalar shape treated as scalar\n if (b.size === 1 || (b.ndim === 1 && b.shape[0] === 1)) {\n const shiftVal = isBigIntDType(b.dtype) ? Number(b.data[0] as bigint) : (b.data[0] as number);\n return rightShiftScalar(a, shiftVal);\n }\n\n // Fast path: both contiguous, same shape\n if (canUseFastPath(a, b)) {\n return rightShiftArraysFast(a, b);\n }\n\n // Slow path: broadcasting or non-contiguous\n return elementwiseBinaryOp(a, b, (x, y) => x >> y, 'right_shift');\n}\n\n/**\n * Fast path for right shift of two contiguous arrays\n * @private\n */\nfunction rightShiftArraysFast(a: ArrayStorage, b: ArrayStorage): ArrayStorage {\n const dtype = promoteDTypes(a.dtype, b.dtype);\n const result = ArrayStorage.zeros(Array.from(a.shape), dtype);\n const size = a.size;\n const aData = a.data;\n const bData = b.data;\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const aVal = typeof aData[i] === 'bigint' ? aData[i] : BigInt(Math.round(Number(aData[i])));\n const bVal = typeof bData[i] === 'bigint' ? bData[i] : BigInt(Math.round(Number(bData[i])));\n resultTyped[i] = (aVal as bigint) >> (bVal as bigint);\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (aData[i] as number) >> (bData[i] as number);\n }\n }\n\n return result;\n}\n\n/**\n * Right shift with scalar (optimized path)\n * @private\n */\nfunction rightShiftScalar(storage: ArrayStorage, shift: number): ArrayStorage {\n const dtype = storage.dtype;\n const shape = Array.from(storage.shape);\n const data = storage.data;\n const size = storage.size;\n\n const result = ArrayStorage.zeros(shape, dtype);\n const resultData = result.data;\n\n if (isBigIntDType(dtype)) {\n const thisTyped = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n const shiftBig = BigInt(Math.round(shift));\n for (let i = 0; i < size; i++) {\n resultTyped[i] = thisTyped[i]! >> shiftBig;\n }\n } else {\n for (let i = 0; i < size; i++) {\n resultData[i] = (data[i] as number) >> shift;\n }\n }\n\n return result;\n}\n\n/**\n * Pack binary values into uint8 array\n *\n * Packs the elements of a binary-valued array into bits in a uint8 array.\n * The result has the same shape as the input, except for the specified axis\n * which is divided by 8 (rounded up).\n *\n * @param a - Input array (values are interpreted as binary: 0 or non-zero)\n * @param axis - The dimension over which bit-packing is done (default: -1, meaning the last axis)\n * @param bitorder - The order of bits within each packed byte. 'big' means the most significant bit is first. (default: 'big')\n * @returns Packed uint8 array\n */\nexport function packbits(\n a: ArrayStorage,\n axis: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): ArrayStorage {\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n\n // Handle negative axis\n if (axis < 0) {\n axis = ndim + axis;\n }\n\n if (axis < 0 || axis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Calculate output shape\n const axisSize = shape[axis]!;\n const packedAxisSize = Math.ceil(axisSize / 8);\n const outShape = [...shape];\n outShape[axis] = packedAxisSize;\n\n const result = ArrayStorage.zeros(outShape, 'uint8');\n const resultData = result.data as Uint8Array;\n\n // For 1D arrays, simple case\n if (ndim === 1) {\n for (let i = 0; i < packedAxisSize; i++) {\n let byte = 0;\n for (let bit = 0; bit < 8; bit++) {\n const srcIdx = i * 8 + bit;\n if (srcIdx < axisSize) {\n const val = Number(a.data[srcIdx]!) !== 0 ? 1 : 0;\n if (bitorder === 'big') {\n byte |= val << (7 - bit);\n } else {\n byte |= val << bit;\n }\n }\n }\n resultData[i] = byte;\n }\n return result;\n }\n\n // For N-D arrays, iterate over all combinations except the packed axis\n const preAxisShape = shape.slice(0, axis);\n const postAxisShape = shape.slice(axis + 1);\n\n const preAxisSize = preAxisShape.reduce((acc, dim) => acc * dim, 1);\n const postAxisSize = postAxisShape.reduce((acc, dim) => acc * dim, 1);\n\n // Calculate strides for input and output\n const inputStrides = computeStrides(shape);\n const outputStrides = computeStrides(outShape);\n\n for (let pre = 0; pre < preAxisSize; pre++) {\n for (let post = 0; post < postAxisSize; post++) {\n for (let packedIdx = 0; packedIdx < packedAxisSize; packedIdx++) {\n let byte = 0;\n for (let bit = 0; bit < 8; bit++) {\n const axisIdx = packedIdx * 8 + bit;\n if (axisIdx < axisSize) {\n // Calculate input linear index\n let inputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n inputIdx += axisIdx * inputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n\n const val = Number(a.data[inputIdx]!) !== 0 ? 1 : 0;\n if (bitorder === 'big') {\n byte |= val << (7 - bit);\n } else {\n byte |= val << bit;\n }\n }\n }\n\n // Calculate output linear index\n let outputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n outputIdx += packedIdx * outputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n\n resultData[outputIdx] = byte;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Unpack uint8 array into binary values\n *\n * Unpacks elements of a uint8 array into a binary-valued output array.\n * Each element of the input array is unpacked into 8 binary values.\n *\n * @param a - Input uint8 array\n * @param axis - The dimension over which bit-unpacking is done (default: -1, meaning the last axis)\n * @param count - The number of elements to unpack along axis, or -1 for all (default: -1)\n * @param bitorder - The order of bits within each packed byte. 'big' means the most significant bit is first. (default: 'big')\n * @returns Unpacked uint8 array of 0s and 1s\n */\nexport function unpackbits(\n a: ArrayStorage,\n axis: number = -1,\n count: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): ArrayStorage {\n if (a.dtype !== 'uint8') {\n throw new TypeError('Expected an input array of unsigned byte data type');\n }\n\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n\n // Handle negative axis\n if (axis < 0) {\n axis = ndim + axis;\n }\n\n if (axis < 0 || axis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Calculate output shape\n const packedAxisSize = shape[axis]!;\n let unpackedAxisSize = packedAxisSize * 8;\n\n // Apply count if specified\n if (count >= 0) {\n unpackedAxisSize = count;\n }\n\n const outShape = [...shape];\n outShape[axis] = unpackedAxisSize;\n\n const result = ArrayStorage.zeros(outShape, 'uint8');\n const resultData = result.data as Uint8Array;\n\n // For 1D arrays, simple case\n if (ndim === 1) {\n for (let i = 0; i < packedAxisSize; i++) {\n const byte = Number(a.data[i]!);\n for (let bit = 0; bit < 8; bit++) {\n const outIdx = i * 8 + bit;\n if (outIdx >= unpackedAxisSize) break;\n if (bitorder === 'big') {\n resultData[outIdx] = (byte >> (7 - bit)) & 1;\n } else {\n resultData[outIdx] = (byte >> bit) & 1;\n }\n }\n }\n return result;\n }\n\n // For N-D arrays\n const preAxisShape = shape.slice(0, axis);\n const postAxisShape = shape.slice(axis + 1);\n\n const preAxisSize = preAxisShape.reduce((acc, dim) => acc * dim, 1);\n const postAxisSize = postAxisShape.reduce((acc, dim) => acc * dim, 1);\n\n const inputStrides = computeStrides(shape);\n const outputStrides = computeStrides(outShape);\n\n for (let pre = 0; pre < preAxisSize; pre++) {\n for (let post = 0; post < postAxisSize; post++) {\n for (let packedIdx = 0; packedIdx < packedAxisSize; packedIdx++) {\n // Calculate input linear index\n let inputIdx = 0;\n let preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n inputIdx += packedIdx * inputStrides[axis]!;\n let postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n inputIdx += coord * inputStrides[d]!;\n }\n\n const byte = Number(a.data[inputIdx]!);\n\n for (let bit = 0; bit < 8; bit++) {\n const axisIdx = packedIdx * 8 + bit;\n if (axisIdx >= unpackedAxisSize) break;\n\n // Calculate output linear index\n let outputIdx = 0;\n preRemaining = pre;\n for (let d = 0; d < axis; d++) {\n const dimSize =\n d < axis - 1 ? preAxisShape.slice(d + 1).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(preRemaining / dimSize);\n preRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n outputIdx += axisIdx * outputStrides[axis]!;\n postRemaining = post;\n for (let d = axis + 1; d < ndim; d++) {\n const dimSize =\n d < ndim - 1 ? postAxisShape.slice(d - axis).reduce((acc, b) => acc * b, 1) : 1;\n const coord = Math.floor(postRemaining / dimSize);\n postRemaining %= dimSize;\n outputIdx += coord * outputStrides[d]!;\n }\n\n if (bitorder === 'big') {\n resultData[outputIdx] = (byte >> (7 - bit)) & 1;\n } else {\n resultData[outputIdx] = (byte >> bit) & 1;\n }\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Compute C-contiguous strides for a shape\n * @private\n */\nfunction computeStrides(shape: number[]): number[] {\n const ndim = shape.length;\n const strides = new Array(ndim);\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * Sorting and searching operations\n *\n * Functions for sorting arrays, finding sorted indices, and searching.\n * @module ops/sorting\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, type DType } from '../core/dtype';\nimport { outerIndexToMultiIndex, multiIndexToLinear } from '../internal/indexing';\n\n/**\n * Return a sorted copy of an array\n * @param storage - Input array storage\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\nexport function sort(storage: ArrayStorage, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return storage.copy();\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create output storage\n const result = storage.copy();\n const resultData = result.data;\n\n const axisSize = shape[normalizedAxis]!;\n\n // Compute output shape (same as input)\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Sort along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Sort by value\n values.sort((a, b) => (a.value < b.value ? -1 : a.value > b.value ? 1 : 0));\n\n // Write sorted values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultTyped[linearIdx] = values[axisIdx]!.value;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(data[linearIdx]!));\n }\n\n // Sort (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a) && isNaN(b)) return 0;\n if (isNaN(a)) return 1;\n if (isNaN(b)) return -1;\n return a - b;\n });\n\n // Write sorted values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Returns the indices that would sort an array\n * @param storage - Input array storage\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the input array\n */\nexport function argsort(storage: ArrayStorage, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Create output storage with int32 dtype\n const result = ArrayStorage.zeros(Array.from(shape), 'int32');\n const resultData = result.data as Int32Array;\n\n const axisSize = shape[normalizedAxis]!;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Get argsort along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Sort by value\n values.sort((a, b) => (a.value < b.value ? -1 : a.value > b.value ? 1 : 0));\n\n // Write sorted indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: number; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: Number(data[linearIdx]!), idx: axisIdx });\n }\n\n // Sort by value (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a.value) && isNaN(b.value)) return 0;\n if (isNaN(a.value)) return 1;\n if (isNaN(b.value)) return -1;\n return a.value - b.value;\n });\n\n // Write sorted indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Perform an indirect stable sort using a sequence of keys\n * @param keys - Array of ArrayStorage, the last key is the primary sort key\n * @returns Array of indices that would sort the keys\n */\nexport function lexsort(keys: ArrayStorage[]): ArrayStorage {\n if (keys.length === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // All keys must be 1D with the same length\n const firstKey = keys[0]!;\n const n = firstKey.size;\n\n for (const key of keys) {\n if (key.ndim !== 1) {\n throw new Error('keys must be 1D arrays');\n }\n if (key.size !== n) {\n throw new Error('all keys must have the same length');\n }\n }\n\n // Create indices array\n const indices: number[] = [];\n for (let i = 0; i < n; i++) {\n indices.push(i);\n }\n\n // Sort using all keys (last key is primary, first key is secondary)\n indices.sort((a, b) => {\n // Iterate keys in reverse order (last is primary)\n for (let k = keys.length - 1; k >= 0; k--) {\n const key = keys[k]!;\n const data = key.data;\n const va = Number(data[a]);\n const vb = Number(data[b]);\n\n // Handle NaN (put at end)\n if (isNaN(va) && isNaN(vb)) continue;\n if (isNaN(va)) return 1;\n if (isNaN(vb)) return -1;\n\n if (va < vb) return -1;\n if (va > vb) return 1;\n // Equal, continue to next key\n }\n return 0; // Stable sort - preserve original order\n });\n\n // Create result\n const result = ArrayStorage.zeros([n], 'int32');\n const resultData = result.data as Int32Array;\n for (let i = 0; i < n; i++) {\n resultData[i] = indices[i]!;\n }\n\n return result;\n}\n\n/**\n * Quickselect algorithm helper for number arrays\n * Partitions array so element at kth position is in sorted position\n */\nfunction quickselectNumbers(arr: number[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!;\n const b = arr[mid]!;\n const c = arr[right]!;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n const val = arr[j]!;\n // Handle NaN: NaN values go to the end\n const valIsNaN = isNaN(val);\n const pivotIsNaN = isNaN(pivot);\n\n if (!valIsNaN && (pivotIsNaN || val <= pivot)) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect algorithm helper for bigint arrays\n * Partitions array so element at kth position is in sorted position\n */\nfunction quickselectBigInts(arr: bigint[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!;\n const b = arr[mid]!;\n const c = arr[right]!;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! <= pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect for argpartition with number values\n * Partitions array of {value, idx} pairs by value\n */\nfunction quickselectNumberIndices(arr: { value: number; idx: number }[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!.value;\n const b = arr[mid]!.value;\n const c = arr[right]!.value;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!.value;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n const val = arr[j]!.value;\n // Handle NaN: NaN values go to the end\n const valIsNaN = isNaN(val);\n const pivotIsNaN = isNaN(pivot);\n\n if (!valIsNaN && (pivotIsNaN || val <= pivot)) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Quickselect for argpartition with bigint values\n * Partitions array of {value, idx} pairs by value\n */\nfunction quickselectBigIntIndices(arr: { value: bigint; idx: number }[], kth: number): void {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n // Choose pivot using median-of-three\n const mid = Math.floor((left + right) / 2);\n const a = arr[left]!.value;\n const b = arr[mid]!.value;\n const c = arr[right]!.value;\n\n // Sort three elements and use middle as pivot\n let pivotIdx: number;\n if ((a <= b && b <= c) || (c <= b && b <= a)) pivotIdx = mid;\n else if ((b <= a && a <= c) || (c <= a && a <= b)) pivotIdx = left;\n else pivotIdx = right;\n\n // Move pivot to end\n const pivot = arr[pivotIdx]!.value;\n [arr[pivotIdx], arr[right]] = [arr[right]!, arr[pivotIdx]!];\n\n // Partition: all elements <= pivot go to left\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]!.value <= pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n\n // Recurse on appropriate side\n if (i === kth) {\n return;\n } else if (i < kth) {\n left = i + 1;\n } else {\n right = i - 1;\n }\n }\n}\n\n/**\n * Partially sort an array\n * Returns array with element at kth position in sorted position,\n * all smaller elements before it, all larger after it (not fully sorted)\n * @param storage - Input array storage\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\nexport function partition(storage: ArrayStorage, kth: number, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return storage.copy();\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Normalize kth\n let normalizedKth = kth;\n if (normalizedKth < 0) {\n normalizedKth = axisSize + normalizedKth;\n }\n if (normalizedKth < 0 || normalizedKth >= axisSize) {\n throw new Error(`kth(=${kth}) out of bounds (${axisSize})`);\n }\n\n // Create output storage\n const result = storage.copy();\n const resultData = result.data;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Partition along axis using quickselect\n if (isBigIntDType(dtype)) {\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: bigint[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(resultTyped[linearIdx]!);\n }\n\n // Partition using quickselect\n quickselectBigInts(values, normalizedKth);\n\n // Write partitioned values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultTyped[linearIdx] = values[axisIdx]!;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis\n const values: number[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push(Number(resultData[linearIdx]!));\n }\n\n // Partition using quickselect\n quickselectNumbers(values, normalizedKth);\n\n // Write partitioned values back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Returns indices that would partition an array\n * @param storage - Input array storage\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\nexport function argpartition(storage: ArrayStorage, kth: number, axis: number = -1): ArrayStorage {\n const shape = storage.shape;\n const ndim = shape.length;\n const dtype = storage.dtype;\n const data = storage.data;\n\n // Handle 0-d arrays\n if (ndim === 0) {\n return ArrayStorage.zeros([0], 'int32');\n }\n\n // Normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n\n // Normalize kth\n let normalizedKth = kth;\n if (normalizedKth < 0) {\n normalizedKth = axisSize + normalizedKth;\n }\n if (normalizedKth < 0 || normalizedKth >= axisSize) {\n throw new Error(`kth(=${kth}) out of bounds (${axisSize})`);\n }\n\n // Create output storage with int32 dtype\n const result = ArrayStorage.zeros(Array.from(shape), 'int32');\n const resultData = result.data as Int32Array;\n\n // Compute outer iteration\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n const outerSize = outputShape.length === 0 ? 1 : outputShape.reduce((a, b) => a * b, 1);\n\n // Get argpartition along axis\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: bigint; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: typedData[linearIdx]!, idx: axisIdx });\n }\n\n // Partition using quickselect\n quickselectBigIntIndices(values, normalizedKth);\n\n // Write partitioned indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n } else {\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n // Collect values along axis with their indices\n const values: { value: number; idx: number }[] = [];\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n values.push({ value: Number(data[linearIdx]!), idx: axisIdx });\n }\n\n // Partition using quickselect\n quickselectNumberIndices(values, normalizedKth);\n\n // Write partitioned indices back\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n resultData[linearIdx] = values[axisIdx]!.idx;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Sort a complex array using the real part first, then the imaginary part\n * For real arrays, this is equivalent to sort\n * @param storage - Input array storage\n * @returns Sorted array\n */\nexport function sort_complex(storage: ArrayStorage): ArrayStorage {\n // For real arrays, just sort normally (1D flattened)\n const dtype = storage.dtype;\n const size = storage.size;\n const data = storage.data;\n\n // Flatten and sort\n const values: number[] = [];\n for (let i = 0; i < size; i++) {\n values.push(Number(data[i]!));\n }\n\n // Sort (NaN values go to end)\n values.sort((a, b) => {\n if (isNaN(a) && isNaN(b)) return 0;\n if (isNaN(a)) return 1;\n if (isNaN(b)) return -1;\n return a - b;\n });\n\n // Create result (1D sorted array)\n const result = ArrayStorage.zeros([size], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < size; i++) {\n resultData[i] = values[i]!;\n }\n\n return result;\n}\n\n// ============================================================================\n// Searching operations\n// ============================================================================\n\n/**\n * Return the indices of the elements that are non-zero\n * @param storage - Input array storage\n * @returns Tuple of arrays, one for each dimension\n */\nexport function nonzero(storage: ArrayStorage): ArrayStorage[] {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n const size = storage.size;\n\n // Find all non-zero indices\n const nonzeroIndices: number[][] = [];\n for (let dim = 0; dim < ndim; dim++) {\n nonzeroIndices.push([]);\n }\n\n // Calculate strides for index conversion\n const strides: number[] = [];\n let stride = 1;\n for (let i = ndim - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n\n // Find non-zero elements\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n // Convert linear index to multi-index\n let remaining = i;\n for (let dim = 0; dim < ndim; dim++) {\n const idx = Math.floor(remaining / strides[dim]!);\n remaining = remaining % strides[dim]!;\n nonzeroIndices[dim]!.push(idx);\n }\n }\n }\n\n // Create result arrays\n const numNonzero = nonzeroIndices[0]?.length ?? 0;\n const result: ArrayStorage[] = [];\n\n for (let dim = 0; dim < ndim; dim++) {\n const arr = ArrayStorage.zeros([numNonzero], 'int32');\n const arrData = arr.data as Int32Array;\n for (let i = 0; i < numNonzero; i++) {\n arrData[i] = nonzeroIndices[dim]![i]!;\n }\n result.push(arr);\n }\n\n return result;\n}\n\n/**\n * Return indices of non-zero elements in flattened array\n * @param storage - Input array storage\n * @returns Array of indices\n */\nexport function flatnonzero(storage: ArrayStorage): ArrayStorage {\n const data = storage.data;\n const size = storage.size;\n\n // Find all non-zero indices\n const indices: number[] = [];\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n indices.push(i);\n }\n }\n\n // Create result\n const result = ArrayStorage.zeros([indices.length], 'int32');\n const resultData = result.data as Int32Array;\n for (let i = 0; i < indices.length; i++) {\n resultData[i] = indices[i]!;\n }\n\n return result;\n}\n\n/**\n * Return elements from x or y depending on condition\n * @param condition - Boolean array or condition\n * @param x - Values where condition is true\n * @param y - Values where condition is false\n * @returns Array with elements chosen from x or y based on condition\n */\nexport function where(\n condition: ArrayStorage,\n x?: ArrayStorage,\n y?: ArrayStorage\n): ArrayStorage | ArrayStorage[] {\n // If only condition is given, return indices of true elements (like nonzero)\n if (x === undefined && y === undefined) {\n return nonzero(condition);\n }\n\n // Both x and y must be provided\n if (x === undefined || y === undefined) {\n throw new Error('either both or neither of x and y should be given');\n }\n\n const condShape = condition.shape;\n const xShape = x.shape;\n const yShape = y.shape;\n\n // For now, require same shapes (broadcasting could be added later)\n // Find maximum shape for broadcasting\n const maxNdim = Math.max(condShape.length, xShape.length, yShape.length);\n\n // Pad shapes with 1s at the front for broadcasting\n const padShape = (s: readonly number[]) => {\n const padded = Array(maxNdim).fill(1);\n for (let i = 0; i < s.length; i++) {\n padded[maxNdim - s.length + i] = s[i];\n }\n return padded;\n };\n\n const paddedCond = padShape(condShape);\n const paddedX = padShape(xShape);\n const paddedY = padShape(yShape);\n\n // Compute broadcast shape\n const resultShape: number[] = [];\n for (let i = 0; i < maxNdim; i++) {\n const dims = [paddedCond[i]!, paddedX[i]!, paddedY[i]!];\n const maxDim = Math.max(...dims);\n for (const d of dims) {\n if (d !== 1 && d !== maxDim) {\n throw new Error(`operands could not be broadcast together`);\n }\n }\n resultShape.push(maxDim);\n }\n\n // Use float64 for result dtype (could be improved to handle dtype promotion)\n const resultDtype = x.dtype as DType;\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n const resultData = result.data;\n const condData = condition.data;\n const xData = x.data;\n const yData = y.data;\n\n // Calculate strides for broadcasting\n const calcStrides = (shape: readonly number[], padded: number[]) => {\n const strides: number[] = [];\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides.unshift(stride);\n stride *= shape[i]!;\n }\n // Pad with zeros for dimensions that don't exist\n while (strides.length < padded.length) {\n strides.unshift(0);\n }\n // Set stride to 0 for broadcast dimensions\n for (let i = 0; i < padded.length; i++) {\n if (padded[i] === 1 && resultShape[i] !== 1) {\n strides[i] = 0;\n }\n }\n return strides;\n };\n\n const condStrides = calcStrides(condShape, paddedCond);\n const xStrides = calcStrides(xShape, paddedX);\n const yStrides = calcStrides(yShape, paddedY);\n\n // Calculate result strides\n const resultStrides: number[] = [];\n let stride = 1;\n for (let i = resultShape.length - 1; i >= 0; i--) {\n resultStrides.unshift(stride);\n stride *= resultShape[i]!;\n }\n\n const totalSize = resultShape.reduce((a, b) => a * b, 1);\n\n // Iterate over all elements\n for (let i = 0; i < totalSize; i++) {\n // Convert linear index to multi-index\n let remaining = i;\n let condIdx = 0;\n let xIdx = 0;\n let yIdx = 0;\n\n for (let dim = 0; dim < maxNdim; dim++) {\n const idx = Math.floor(remaining / resultStrides[dim]!);\n remaining = remaining % resultStrides[dim]!;\n\n condIdx += idx * condStrides[dim]!;\n xIdx += idx * xStrides[dim]!;\n yIdx += idx * yStrides[dim]!;\n }\n\n if (condData[condIdx]) {\n resultData[i] = xData[xIdx]!;\n } else {\n resultData[i] = yData[yIdx]!;\n }\n }\n\n return result;\n}\n\n/**\n * Find indices where elements should be inserted to maintain order\n * @param storage - Input array (must be sorted in ascending order)\n * @param values - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\nexport function searchsorted(\n storage: ArrayStorage,\n values: ArrayStorage,\n side: 'left' | 'right' = 'left'\n): ArrayStorage {\n // Input array must be 1D\n if (storage.ndim !== 1) {\n throw new Error('storage must be 1D');\n }\n\n const data = storage.data;\n const n = storage.size;\n const valuesData = values.data;\n const numValues = values.size;\n\n // Create result array\n const result = ArrayStorage.zeros([numValues], 'int32');\n const resultData = result.data as Int32Array;\n\n // Binary search for each value\n for (let i = 0; i < numValues; i++) {\n const v = Number(valuesData[i]);\n let lo = 0;\n let hi = n;\n\n if (side === 'left') {\n // Find leftmost position where v can be inserted\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (Number(data[mid]) < v) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n } else {\n // Find rightmost position where v can be inserted\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (Number(data[mid]) <= v) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n }\n\n resultData[i] = lo;\n }\n\n return result;\n}\n\n/**\n * Return the elements of an array that satisfy some condition\n * @param condition - Boolean array\n * @param storage - Input array storage\n * @returns 1D array of elements where condition is true\n */\nexport function extract(condition: ArrayStorage, storage: ArrayStorage): ArrayStorage {\n const condData = condition.data;\n const data = storage.data;\n const dtype = storage.dtype;\n\n // Both arrays should have same size\n const size = Math.min(condition.size, storage.size);\n\n // Count number of true values\n let count = 0;\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n count++;\n }\n }\n\n // Create result array\n const result = ArrayStorage.zeros([count], dtype as DType);\n const resultData = result.data;\n\n // Copy values where condition is true\n let idx = 0;\n if (isBigIntDType(dtype)) {\n const typedData = data as BigInt64Array | BigUint64Array;\n const resultTyped = resultData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n resultTyped[idx++] = typedData[i]!;\n }\n }\n } else {\n for (let i = 0; i < size; i++) {\n if (condData[i]) {\n resultData[idx++] = data[i]!;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Count number of non-zero values in the array\n * @param storage - Input array storage\n * @param axis - Axis along which to count (optional)\n * @returns Count of non-zero values\n */\nexport function count_nonzero(storage: ArrayStorage, axis?: number): ArrayStorage | number {\n const shape = storage.shape;\n const ndim = shape.length;\n const data = storage.data;\n const size = storage.size;\n\n if (axis === undefined) {\n // Count all non-zero elements\n let count = 0;\n for (let i = 0; i < size; i++) {\n if (data[i]) {\n count++;\n }\n }\n return count;\n }\n\n // Validate and normalize axis\n let normalizedAxis = axis;\n if (normalizedAxis < 0) {\n normalizedAxis = ndim + normalizedAxis;\n }\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Compute output shape\n const outputShape = Array.from(shape).filter((_, i) => i !== normalizedAxis);\n if (outputShape.length === 0) {\n return count_nonzero(storage);\n }\n\n // Create result storage\n const result = ArrayStorage.zeros(outputShape, 'int32');\n const resultData = result.data as Int32Array;\n\n const axisSize = shape[normalizedAxis]!;\n const outerSize = outputShape.reduce((a, b) => a * b, 1);\n\n for (let outerIdx = 0; outerIdx < outerSize; outerIdx++) {\n let count = 0;\n for (let axisIdx = 0; axisIdx < axisSize; axisIdx++) {\n const inputIndices = outerIndexToMultiIndex(outerIdx, normalizedAxis, axisIdx, shape);\n const linearIdx = multiIndexToLinear(inputIndices, shape);\n if (data[linearIdx]) {\n count++;\n }\n }\n resultData[outerIdx] = count;\n }\n\n return result;\n}\n", "/**\n * Rounding operations\n *\n * Pure functions for element-wise rounding operations:\n * around, ceil, fix, floor, rint, round, trunc\n */\n\nimport { ArrayStorage } from '../core/storage';\n\n/**\n * Round half to even (banker's rounding) - matches NumPy behavior\n */\nfunction roundHalfToEven(x: number): number {\n if (!isFinite(x)) return x;\n const floor = Math.floor(x);\n const decimal = x - floor;\n // If exactly 0.5, round to nearest even\n if (Math.abs(decimal - 0.5) < 1e-10) {\n return floor % 2 === 0 ? floor : floor + 1;\n }\n return Math.round(x);\n}\n\n/**\n * Round an array to the given number of decimals\n */\nexport function around(a: ArrayStorage, decimals: number = 0): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n const multiplier = Math.pow(10, decimals);\n\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n resultData[i] = roundHalfToEven(val * multiplier) / multiplier;\n }\n\n return result;\n}\n\n/**\n * Return the ceiling of the input, element-wise\n */\nexport function ceil(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.ceil(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Round to nearest integer towards zero\n */\nexport function fix(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.trunc(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Return the floor of the input, element-wise\n */\nexport function floor(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.floor(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Round elements of the array to the nearest integer (banker's rounding)\n */\nexport function rint(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n resultData[i] = roundHalfToEven(Number(data[i]!));\n }\n\n return result;\n}\n\n/**\n * Alias for around\n */\nexport function round(a: ArrayStorage, decimals: number = 0): ArrayStorage {\n return around(a, decimals);\n}\n\n/**\n * Return the truncated value of the input, element-wise\n */\nexport function trunc(a: ArrayStorage): ArrayStorage {\n const dtype = a.dtype;\n const shape = Array.from(a.shape);\n const data = a.data;\n const size = a.size;\n\n const resultDtype = dtype === 'float32' ? 'float32' : 'float64';\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < size; i++) {\n resultData[i] = Math.trunc(Number(data[i]!));\n }\n\n return result;\n}\n", "/**\n * Set operations\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { type DType } from '../core/dtype';\n\n/**\n * Find the unique elements of an array\n */\nexport function unique(\n a: ArrayStorage,\n returnIndex: boolean = false,\n returnInverse: boolean = false,\n returnCounts: boolean = false\n):\n | ArrayStorage\n | {\n values: ArrayStorage;\n indices?: ArrayStorage;\n inverse?: ArrayStorage;\n counts?: ArrayStorage;\n } {\n const dtype = a.dtype;\n const size = a.size;\n const data = a.data;\n\n // Collect values with original indices\n const values: { value: number; index: number }[] = [];\n for (let i = 0; i < size; i++) {\n values.push({ value: Number(data[i]!), index: i });\n }\n\n // Sort by value\n values.sort((x, y) => {\n if (isNaN(x.value) && isNaN(y.value)) return 0;\n if (isNaN(x.value)) return 1;\n if (isNaN(y.value)) return -1;\n return x.value - y.value;\n });\n\n // Find unique values\n const uniqueValues: number[] = [];\n const indices: number[] = [];\n const inverse: number[] = new Array(size);\n const counts: number[] = [];\n\n let lastValue: number | undefined = undefined;\n let currentCount = 0;\n\n for (let i = 0; i < values.length; i++) {\n const { value, index } = values[i]!;\n const isDifferent =\n lastValue === undefined ||\n (isNaN(value) && !isNaN(lastValue!)) ||\n (!isNaN(value) && isNaN(lastValue!)) ||\n (!isNaN(value) && !isNaN(lastValue!) && value !== lastValue);\n\n if (isDifferent) {\n if (lastValue !== undefined) {\n counts.push(currentCount);\n }\n uniqueValues.push(value);\n indices.push(index);\n currentCount = 1;\n lastValue = value;\n } else {\n currentCount++;\n }\n }\n if (currentCount > 0) {\n counts.push(currentCount);\n }\n\n // Build inverse mapping\n const valueToUniqueIdx = new Map<number, number>();\n let nanIdx = -1;\n for (let i = 0; i < uniqueValues.length; i++) {\n const v = uniqueValues[i]!;\n if (isNaN(v)) {\n nanIdx = i;\n } else {\n valueToUniqueIdx.set(v, i);\n }\n }\n for (let i = 0; i < size; i++) {\n const val = Number(data[i]!);\n if (isNaN(val)) {\n inverse[i] = nanIdx;\n } else {\n inverse[i] = valueToUniqueIdx.get(val)!;\n }\n }\n\n // Create result arrays\n const uniqueResult = ArrayStorage.zeros([uniqueValues.length], dtype as DType);\n const uniqueData = uniqueResult.data;\n for (let i = 0; i < uniqueValues.length; i++) {\n uniqueData[i] = uniqueValues[i]!;\n }\n\n if (!returnIndex && !returnInverse && !returnCounts) {\n return uniqueResult;\n }\n\n const result: {\n values: ArrayStorage;\n indices?: ArrayStorage;\n inverse?: ArrayStorage;\n counts?: ArrayStorage;\n } = { values: uniqueResult };\n\n if (returnIndex) {\n const indicesResult = ArrayStorage.zeros([indices.length], 'int32');\n const indicesData = indicesResult.data as Int32Array;\n for (let i = 0; i < indices.length; i++) {\n indicesData[i] = indices[i]!;\n }\n result.indices = indicesResult;\n }\n\n if (returnInverse) {\n const inverseResult = ArrayStorage.zeros([inverse.length], 'int32');\n const inverseData = inverseResult.data as Int32Array;\n for (let i = 0; i < inverse.length; i++) {\n inverseData[i] = inverse[i]!;\n }\n result.inverse = inverseResult;\n }\n\n if (returnCounts) {\n const countsResult = ArrayStorage.zeros([counts.length], 'int32');\n const countsData = countsResult.data as Int32Array;\n for (let i = 0; i < counts.length; i++) {\n countsData[i] = counts[i]!;\n }\n result.counts = countsResult;\n }\n\n return result;\n}\n\n/**\n * Test whether each element of a 1-D array is also present in a second array\n */\nexport function in1d(ar1: ArrayStorage, ar2: ArrayStorage): ArrayStorage {\n return isin(ar1, ar2);\n}\n\n/**\n * Find the intersection of two arrays\n */\nexport function intersect1d(ar1: ArrayStorage, ar2: ArrayStorage): ArrayStorage {\n const dtype = ar1.dtype;\n\n const unique1 = unique(ar1) as ArrayStorage;\n const unique2 = unique(ar2) as ArrayStorage;\n\n const set2 = new Set<number>();\n for (let i = 0; i < unique2.size; i++) {\n set2.add(Number(unique2.data[i]!));\n }\n\n const intersection: number[] = [];\n for (let i = 0; i < unique1.size; i++) {\n const val = Number(unique1.data[i]!);\n if (set2.has(val)) {\n intersection.push(val);\n }\n }\n\n intersection.sort((a, b) => a - b);\n\n const result = ArrayStorage.zeros([intersection.length], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < intersection.length; i++) {\n resultData[i] = intersection[i]!;\n }\n return result;\n}\n\n/**\n * Test whether each element of an ND array is also present in a second array\n */\nexport function isin(element: ArrayStorage, testElements: ArrayStorage): ArrayStorage {\n const shape = Array.from(element.shape);\n const size = element.size;\n\n const testSet = new Set<number>();\n for (let i = 0; i < testElements.size; i++) {\n testSet.add(Number(testElements.data[i]!));\n }\n\n const result = ArrayStorage.zeros(shape, 'bool');\n const resultData = result.data as Uint8Array;\n const elementData = element.data;\n\n for (let i = 0; i < size; i++) {\n const val = Number(elementData[i]!);\n resultData[i] = testSet.has(val) ? 1 : 0;\n }\n\n return result;\n}\n\n/**\n * Find the set difference of two arrays\n */\nexport function setdiff1d(ar1: ArrayStorage, ar2: ArrayStorage): ArrayStorage {\n const dtype = ar1.dtype;\n\n const unique1 = unique(ar1) as ArrayStorage;\n\n const set2 = new Set<number>();\n for (let i = 0; i < ar2.size; i++) {\n set2.add(Number(ar2.data[i]!));\n }\n\n const diff: number[] = [];\n for (let i = 0; i < unique1.size; i++) {\n const val = Number(unique1.data[i]!);\n if (!set2.has(val)) {\n diff.push(val);\n }\n }\n\n const result = ArrayStorage.zeros([diff.length], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < diff.length; i++) {\n resultData[i] = diff[i]!;\n }\n return result;\n}\n\n/**\n * Find the set exclusive-or of two arrays\n */\nexport function setxor1d(ar1: ArrayStorage, ar2: ArrayStorage): ArrayStorage {\n const dtype = ar1.dtype;\n\n const unique1 = unique(ar1) as ArrayStorage;\n const unique2 = unique(ar2) as ArrayStorage;\n\n const set1 = new Set<number>();\n const set2 = new Set<number>();\n\n for (let i = 0; i < unique1.size; i++) {\n set1.add(Number(unique1.data[i]!));\n }\n for (let i = 0; i < unique2.size; i++) {\n set2.add(Number(unique2.data[i]!));\n }\n\n const xor: number[] = [];\n for (const val of set1) {\n if (!set2.has(val)) {\n xor.push(val);\n }\n }\n for (const val of set2) {\n if (!set1.has(val)) {\n xor.push(val);\n }\n }\n\n xor.sort((a, b) => a - b);\n\n const result = ArrayStorage.zeros([xor.length], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < xor.length; i++) {\n resultData[i] = xor[i]!;\n }\n return result;\n}\n\n/**\n * Find the union of two arrays\n */\nexport function union1d(ar1: ArrayStorage, ar2: ArrayStorage): ArrayStorage {\n const dtype = ar1.dtype;\n\n const unique1 = unique(ar1) as ArrayStorage;\n const unique2 = unique(ar2) as ArrayStorage;\n\n const unionSet = new Set<number>();\n\n for (let i = 0; i < unique1.size; i++) {\n unionSet.add(Number(unique1.data[i]!));\n }\n for (let i = 0; i < unique2.size; i++) {\n unionSet.add(Number(unique2.data[i]!));\n }\n\n const unionArr = Array.from(unionSet);\n unionArr.sort((a, b) => a - b);\n\n const result = ArrayStorage.zeros([unionArr.length], dtype as DType);\n const resultData = result.data;\n for (let i = 0; i < unionArr.length; i++) {\n resultData[i] = unionArr[i]!;\n }\n return result;\n}\n", "/**\n * Gradient and difference operations\n *\n * Pure functions for computing gradients and differences:\n * gradient, diff, ediff1d, cross\n *\n * These functions are used by NDArray methods but are separated\n * to keep the codebase modular and testable.\n */\n\nimport { ArrayStorage } from '../core/storage';\nimport { isBigIntDType, promoteDTypes } from '../core/dtype';\n\n/**\n * Calculate the n-th discrete difference along the given axis.\n *\n * The first difference is given by out[i] = a[i+1] - a[i] along the given axis.\n * Higher differences are calculated by using diff recursively.\n *\n * @param a - Input array storage\n * @param n - Number of times values are differenced (default: 1)\n * @param axis - Axis along which to compute difference (default: -1, last axis)\n * @returns Result storage with differences\n */\nexport function diff(a: ArrayStorage, n: number = 1, axis: number = -1): ArrayStorage {\n if (n < 0) {\n throw new Error(`order must be non-negative but got ${n}`);\n }\n if (n === 0) {\n return a.copy();\n }\n\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n\n // Normalize axis\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n // Check if we can take n differences\n if (shape[normalizedAxis]! < n + 1) {\n throw new Error(\n `diff requires at least ${n + 1} elements along axis ${axis}, but got ${shape[normalizedAxis]}`\n );\n }\n\n let result = a;\n\n for (let i = 0; i < n; i++) {\n result = diffOnce(result, normalizedAxis);\n }\n\n return result;\n}\n\n/**\n * Helper function to compute one difference operation\n * @private\n */\nfunction diffOnce(a: ArrayStorage, axis: number): ArrayStorage {\n const shape = Array.from(a.shape);\n const ndim = shape.length;\n const axisSize = shape[axis]!;\n\n // Result shape has one less element along the axis\n const resultShape = [...shape];\n resultShape[axis] = axisSize - 1;\n\n // Determine result dtype - always float64 for non-float types\n const dtype = a.dtype;\n const resultDtype = isBigIntDType(dtype) ? 'float64' : dtype;\n\n const result = ArrayStorage.zeros(resultShape, resultDtype);\n const resultData = result.data;\n\n // Calculate strides for manual iteration\n const strides = a.strides;\n\n // Calculate total size excluding the axis\n const resultSize = result.size;\n\n // Iterate over all elements in the result\n for (let resultIdx = 0; resultIdx < resultSize; resultIdx++) {\n // Convert flat index to multi-dimensional indices\n let remaining = resultIdx;\n const indices: number[] = new Array(ndim);\n\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d] = remaining % resultShape[d]!;\n remaining = Math.floor(remaining / resultShape[d]!);\n }\n\n // Calculate source indices for a[i+1] and a[i] along the axis\n const idx1 = [...indices];\n const idx2 = [...indices];\n idx2[axis] = idx1[axis]! + 1;\n\n // Calculate flat indices in source array\n let flatIdx1 = 0;\n let flatIdx2 = 0;\n for (let d = 0; d < ndim; d++) {\n flatIdx1 += idx1[d]! * strides[d]!;\n flatIdx2 += idx2[d]! * strides[d]!;\n }\n\n // Compute difference\n const val1 = isBigIntDType(dtype) ? Number(a.data[flatIdx1]!) : Number(a.data[flatIdx1]!);\n const val2 = isBigIntDType(dtype) ? Number(a.data[flatIdx2]!) : Number(a.data[flatIdx2]!);\n\n resultData[resultIdx] = val2 - val1;\n }\n\n return result;\n}\n\n/**\n * The differences between consecutive elements of a flattened array.\n *\n * @param ary - Input array storage\n * @param to_end - Number(s) to append at the end of the returned differences\n * @param to_begin - Number(s) to prepend at the beginning of the returned differences\n * @returns Array of differences with optional prepend/append values\n */\nexport function ediff1d(\n ary: ArrayStorage,\n to_end: number[] | null = null,\n to_begin: number[] | null = null\n): ArrayStorage {\n // Flatten the array\n const flatSize = ary.size;\n const dtype = ary.dtype;\n const resultDtype = isBigIntDType(dtype) ? 'float64' : dtype;\n\n // Calculate result size\n const diffSize = Math.max(0, flatSize - 1);\n const beginSize = to_begin ? to_begin.length : 0;\n const endSize = to_end ? to_end.length : 0;\n const totalSize = beginSize + diffSize + endSize;\n\n const result = ArrayStorage.zeros([totalSize], resultDtype);\n const resultData = result.data;\n\n let idx = 0;\n\n // Add to_begin values\n if (to_begin) {\n for (const val of to_begin) {\n resultData[idx++] = val;\n }\n }\n\n // Calculate differences\n for (let i = 0; i < diffSize; i++) {\n const val1 = isBigIntDType(dtype) ? Number(ary.iget(i)) : Number(ary.iget(i));\n const val2 = isBigIntDType(dtype) ? Number(ary.iget(i + 1)) : Number(ary.iget(i + 1));\n resultData[idx++] = val2 - val1;\n }\n\n // Add to_end values\n if (to_end) {\n for (const val of to_end) {\n resultData[idx++] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Return the gradient of an N-dimensional array.\n *\n * The gradient is computed using second order accurate central differences in the interior\n * and first order accurate one-sided (forward or backwards) differences at the boundaries.\n *\n * @param f - Input array storage\n * @param varargs - Spacing between values (scalar or array per dimension)\n * @param axis - Axis or axes along which to compute gradient (default: all axes)\n * @returns Array of gradients (one per axis) or single gradient if one axis\n */\nexport function gradient(\n f: ArrayStorage,\n varargs: number | number[] = 1,\n axis: number | number[] | null = null\n): ArrayStorage | ArrayStorage[] {\n const shape = Array.from(f.shape);\n const ndim = shape.length;\n\n // Determine which axes to compute gradient for\n let axes: number[];\n if (axis === null) {\n axes = Array.from({ length: ndim }, (_, i) => i);\n } else if (typeof axis === 'number') {\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n axes = [normalizedAxis];\n } else {\n axes = axis.map((ax) => {\n const normalized = ax < 0 ? ndim + ax : ax;\n if (normalized < 0 || normalized >= ndim) {\n throw new Error(`axis ${ax} is out of bounds for array of dimension ${ndim}`);\n }\n return normalized;\n });\n }\n\n // Determine spacing for each axis\n let spacings: number[];\n if (typeof varargs === 'number') {\n spacings = axes.map(() => varargs);\n } else {\n if (varargs.length !== axes.length) {\n throw new Error(`Number of spacings must match number of axes`);\n }\n spacings = varargs;\n }\n\n // Compute gradient for each axis\n const results: ArrayStorage[] = [];\n for (let i = 0; i < axes.length; i++) {\n results.push(gradientAlongAxis(f, axes[i]!, spacings[i]!));\n }\n\n // Return single result if single axis\n if (results.length === 1) {\n return results[0]!;\n }\n return results;\n}\n\n/**\n * Compute gradient along a single axis\n * @private\n */\nfunction gradientAlongAxis(f: ArrayStorage, axis: number, spacing: number): ArrayStorage {\n const shape = Array.from(f.shape);\n const ndim = shape.length;\n const axisSize = shape[axis]!;\n\n if (axisSize < 2) {\n throw new Error(`Shape of array along axis ${axis} must be at least 2, but got ${axisSize}`);\n }\n\n // Result has same shape as input\n const dtype = f.dtype;\n const resultDtype = isBigIntDType(dtype)\n ? 'float64'\n : dtype === 'float32'\n ? 'float32'\n : 'float64';\n\n const result = ArrayStorage.zeros(shape, resultDtype);\n const resultData = result.data;\n const strides = f.strides;\n\n const h = spacing;\n const h2 = 2 * h;\n\n // Calculate total size\n const totalSize = f.size;\n\n // Iterate over all elements\n for (let flatIdx = 0; flatIdx < totalSize; flatIdx++) {\n // Convert flat index to multi-dimensional indices\n let remaining = flatIdx;\n const indices: number[] = new Array(ndim);\n\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d] = remaining % shape[d]!;\n remaining = Math.floor(remaining / shape[d]!);\n }\n\n const axisIdx = indices[axis]!;\n\n let gradientValue: number;\n\n if (axisIdx === 0) {\n // Forward difference at the beginning\n const idxPlus1 = [...indices];\n idxPlus1[axis] = 1;\n let flatIdxPlus1 = 0;\n for (let d = 0; d < ndim; d++) {\n flatIdxPlus1 += idxPlus1[d]! * strides[d]!;\n }\n\n const f0 = isBigIntDType(dtype) ? Number(f.data[flatIdx]!) : Number(f.data[flatIdx]!);\n const f1 = isBigIntDType(dtype)\n ? Number(f.data[flatIdxPlus1]!)\n : Number(f.data[flatIdxPlus1]!);\n\n gradientValue = (f1 - f0) / h;\n } else if (axisIdx === axisSize - 1) {\n // Backward difference at the end\n const idxMinus1 = [...indices];\n idxMinus1[axis] = axisSize - 2;\n let flatIdxMinus1 = 0;\n for (let d = 0; d < ndim; d++) {\n flatIdxMinus1 += idxMinus1[d]! * strides[d]!;\n }\n\n const fN = isBigIntDType(dtype) ? Number(f.data[flatIdx]!) : Number(f.data[flatIdx]!);\n const fNm1 = isBigIntDType(dtype)\n ? Number(f.data[flatIdxMinus1]!)\n : Number(f.data[flatIdxMinus1]!);\n\n gradientValue = (fN - fNm1) / h;\n } else {\n // Central difference in the interior\n const idxPlus1 = [...indices];\n const idxMinus1 = [...indices];\n idxPlus1[axis] = axisIdx + 1;\n idxMinus1[axis] = axisIdx - 1;\n\n let flatIdxPlus1 = 0;\n let flatIdxMinus1 = 0;\n for (let d = 0; d < ndim; d++) {\n flatIdxPlus1 += idxPlus1[d]! * strides[d]!;\n flatIdxMinus1 += idxMinus1[d]! * strides[d]!;\n }\n\n const fPlus = isBigIntDType(dtype)\n ? Number(f.data[flatIdxPlus1]!)\n : Number(f.data[flatIdxPlus1]!);\n const fMinus = isBigIntDType(dtype)\n ? Number(f.data[flatIdxMinus1]!)\n : Number(f.data[flatIdxMinus1]!);\n\n gradientValue = (fPlus - fMinus) / h2;\n }\n\n resultData[flatIdx] = gradientValue;\n }\n\n return result;\n}\n\n/**\n * Return the cross product of two (arrays of) vectors.\n *\n * The cross product of a and b in R^3 is a vector perpendicular to both a and b.\n *\n * @param a - First input array (components of first vector(s))\n * @param b - Second input array (components of second vector(s))\n * @param axisa - Axis of a that defines the vector(s) (default: -1)\n * @param axisb - Axis of b that defines the vector(s) (default: -1)\n * @param axisc - Axis of c containing the cross product vector(s) (default: -1)\n * @returns Cross product array\n */\nexport function cross(\n a: ArrayStorage,\n b: ArrayStorage,\n axisa: number = -1,\n axisb: number = -1,\n _axisc: number = -1\n): ArrayStorage {\n const shapeA = Array.from(a.shape);\n const shapeB = Array.from(b.shape);\n const ndimA = shapeA.length;\n const ndimB = shapeB.length;\n\n // Normalize axes\n const normalizedAxisA = axisa < 0 ? ndimA + axisa : axisa;\n const normalizedAxisB = axisb < 0 ? ndimB + axisb : axisb;\n\n if (normalizedAxisA < 0 || normalizedAxisA >= ndimA) {\n throw new Error(`axisa ${axisa} is out of bounds for array of dimension ${ndimA}`);\n }\n if (normalizedAxisB < 0 || normalizedAxisB >= ndimB) {\n throw new Error(`axisb ${axisb} is out of bounds for array of dimension ${ndimB}`);\n }\n\n const sizeA = shapeA[normalizedAxisA]!;\n const sizeB = shapeB[normalizedAxisB]!;\n\n // Validate vector sizes (must be 2 or 3)\n if (sizeA !== 2 && sizeA !== 3) {\n throw new Error(\n `incompatible dimensions for cross product (dimension must be 2 or 3, got ${sizeA})`\n );\n }\n if (sizeB !== 2 && sizeB !== 3) {\n throw new Error(\n `incompatible dimensions for cross product (dimension must be 2 or 3, got ${sizeB})`\n );\n }\n\n // Determine result dtype\n const resultDtype = promoteDTypes(a.dtype, b.dtype);\n\n // Handle simple 1D case for 3D vectors\n if (ndimA === 1 && ndimB === 1 && sizeA === 3 && sizeB === 3) {\n const result = ArrayStorage.zeros([3], resultDtype);\n const resultData = result.data;\n\n const a0 = Number(a.iget(0));\n const a1 = Number(a.iget(1));\n const a2 = Number(a.iget(2));\n const b0 = Number(b.iget(0));\n const b1 = Number(b.iget(1));\n const b2 = Number(b.iget(2));\n\n resultData[0] = a1 * b2 - a2 * b1;\n resultData[1] = a2 * b0 - a0 * b2;\n resultData[2] = a0 * b1 - a1 * b0;\n\n return result;\n }\n\n // Handle 1D case for 2D vectors (returns scalar)\n if (ndimA === 1 && ndimB === 1 && sizeA === 2 && sizeB === 2) {\n const result = ArrayStorage.zeros([], resultDtype);\n const a0 = Number(a.iget(0));\n const a1 = Number(a.iget(1));\n const b0 = Number(b.iget(0));\n const b1 = Number(b.iget(1));\n\n result.data[0] = a0 * b1 - a1 * b0;\n return result;\n }\n\n // Handle mixed 2D/3D case for 1D arrays\n if (ndimA === 1 && ndimB === 1) {\n // 2D x 3D or 3D x 2D\n if (sizeA === 2 && sizeB === 3) {\n // Treat 2D vector as [x, y, 0]\n const result = ArrayStorage.zeros([3], resultDtype);\n const resultData = result.data;\n\n const a0 = Number(a.iget(0));\n const a1 = Number(a.iget(1));\n const b0 = Number(b.iget(0));\n const b1 = Number(b.iget(1));\n const b2 = Number(b.iget(2));\n\n resultData[0] = a1 * b2;\n resultData[1] = -a0 * b2;\n resultData[2] = a0 * b1 - a1 * b0;\n\n return result;\n } else if (sizeA === 3 && sizeB === 2) {\n // 3D x 2D\n const result = ArrayStorage.zeros([3], resultDtype);\n const resultData = result.data;\n\n const a0 = Number(a.iget(0));\n const a1 = Number(a.iget(1));\n const a2 = Number(a.iget(2));\n const b0 = Number(b.iget(0));\n const b1 = Number(b.iget(1));\n\n resultData[0] = -a2 * b1;\n resultData[1] = a2 * b0;\n resultData[2] = a0 * b1 - a1 * b0;\n\n return result;\n }\n }\n\n // For higher-dimensional arrays, we need more complex logic\n // For now, handle 2D arrays where vectors are along the last axis\n if (ndimA === 2 && ndimB === 2 && normalizedAxisA === 1 && normalizedAxisB === 1) {\n const numVectors = shapeA[0]!;\n if (shapeB[0] !== numVectors) {\n throw new Error(`Shape mismatch: a has ${numVectors} vectors, b has ${shapeB[0]} vectors`);\n }\n\n if (sizeA === 3 && sizeB === 3) {\n const result = ArrayStorage.zeros([numVectors, 3], resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < numVectors; i++) {\n const a0 = Number(a.iget(i * 3));\n const a1 = Number(a.iget(i * 3 + 1));\n const a2 = Number(a.iget(i * 3 + 2));\n const b0 = Number(b.iget(i * 3));\n const b1 = Number(b.iget(i * 3 + 1));\n const b2 = Number(b.iget(i * 3 + 2));\n\n resultData[i * 3] = a1 * b2 - a2 * b1;\n resultData[i * 3 + 1] = a2 * b0 - a0 * b2;\n resultData[i * 3 + 2] = a0 * b1 - a1 * b0;\n }\n\n return result;\n }\n\n if (sizeA === 2 && sizeB === 2) {\n // Returns 1D array of scalar cross products\n const result = ArrayStorage.zeros([numVectors], resultDtype);\n const resultData = result.data;\n\n for (let i = 0; i < numVectors; i++) {\n const a0 = Number(a.iget(i * 2));\n const a1 = Number(a.iget(i * 2 + 1));\n const b0 = Number(b.iget(i * 2));\n const b1 = Number(b.iget(i * 2 + 1));\n\n resultData[i] = a0 * b1 - a1 * b0;\n }\n\n return result;\n }\n }\n\n throw new Error(\n `cross product not implemented for arrays with shapes ${JSON.stringify(shapeA)} and ${JSON.stringify(shapeB)}`\n );\n}\n", "/**\n * NDArray - NumPy-compatible multidimensional array\n *\n * Core array class providing NumPy-like API\n */\n\nimport { parseSlice, normalizeSlice } from './slicing';\nimport {\n type DType,\n type TypedArray,\n DEFAULT_DTYPE,\n getTypedArrayConstructor,\n isBigIntDType,\n} from './dtype';\nimport { ArrayStorage } from './storage';\nimport * as arithmeticOps from '../ops/arithmetic';\nimport * as comparisonOps from '../ops/comparison';\nimport * as reductionOps from '../ops/reduction';\nimport * as shapeOps from '../ops/shape';\nimport * as linalgOps from '../ops/linalg';\nimport * as exponentialOps from '../ops/exponential';\nimport * as trigOps from '../ops/trig';\nimport * as hyperbolicOps from '../ops/hyperbolic';\nimport * as advancedOps from '../ops/advanced';\nimport * as bitwiseOps from '../ops/bitwise';\nimport * as sortingOps from '../ops/sorting';\nimport * as roundingOps from '../ops/rounding';\nimport * as setOps from '../ops/sets';\nimport * as gradientOps from '../ops/gradient';\n\nexport class NDArray {\n // Internal storage\n private _storage: ArrayStorage;\n // Track if this array is a view of another array\n private _base?: NDArray;\n\n constructor(storage: ArrayStorage, base?: NDArray) {\n this._storage = storage;\n this._base = base;\n }\n\n /**\n * Get internal storage (for ops modules)\n * @internal\n */\n get storage(): ArrayStorage {\n return this._storage;\n }\n\n /**\n * Create NDArray from storage (for ops modules)\n * @internal\n */\n static _fromStorage(storage: ArrayStorage, base?: NDArray): NDArray {\n return new NDArray(storage, base);\n }\n\n // NumPy properties\n get shape(): readonly number[] {\n return this._storage.shape;\n }\n\n get ndim(): number {\n return this._storage.ndim;\n }\n\n get size(): number {\n return this._storage.size;\n }\n\n get dtype(): string {\n return this._storage.dtype;\n }\n\n get data(): TypedArray {\n return this._storage.data;\n }\n\n get strides(): readonly number[] {\n return this._storage.strides;\n }\n\n /**\n * Array flags (similar to NumPy's flags)\n * Provides information about memory layout\n */\n get flags(): {\n C_CONTIGUOUS: boolean;\n F_CONTIGUOUS: boolean;\n OWNDATA: boolean;\n } {\n return {\n C_CONTIGUOUS: this._storage.isCContiguous,\n F_CONTIGUOUS: this._storage.isFContiguous,\n OWNDATA: this._base === undefined, // True if we own data, false if we're a view\n };\n }\n\n /**\n * Base array if this is a view, null if this array owns its data\n * Similar to NumPy's base attribute\n */\n get base(): NDArray | null {\n return this._base ?? null;\n }\n\n /**\n * Get a single element from the array\n * @param indices - Array of indices, one per dimension (e.g., [0, 1] for 2D array)\n * @returns The element value (BigInt for int64/uint64, number otherwise)\n */\n get(indices: number[]): number | bigint {\n // Validate number of indices\n if (indices.length !== this.ndim) {\n throw new Error(\n `Index has ${indices.length} dimensions, but array has ${this.ndim} dimensions`\n );\n }\n\n // Normalize negative indices\n const normalizedIndices = indices.map((idx, dim) => {\n let normalized = idx;\n if (normalized < 0) {\n normalized = this.shape[dim]! + normalized;\n }\n // Validate bounds\n if (normalized < 0 || normalized >= this.shape[dim]!) {\n throw new Error(\n `Index ${idx} is out of bounds for axis ${dim} with size ${this.shape[dim]}`\n );\n }\n return normalized;\n });\n\n return this._storage.get(...normalizedIndices);\n }\n\n /**\n * Set a single element in the array\n * @param indices - Array of indices, one per dimension (e.g., [0, 1] for 2D array)\n * @param value - Value to set (will be converted to array's dtype)\n */\n set(indices: number[], value: number | bigint): void {\n // Validate number of indices\n if (indices.length !== this.ndim) {\n throw new Error(\n `Index has ${indices.length} dimensions, but array has ${this.ndim} dimensions`\n );\n }\n\n // Normalize negative indices\n const normalizedIndices = indices.map((idx, dim) => {\n let normalized = idx;\n if (normalized < 0) {\n normalized = this.shape[dim]! + normalized;\n }\n // Validate bounds\n if (normalized < 0 || normalized >= this.shape[dim]!) {\n throw new Error(\n `Index ${idx} is out of bounds for axis ${dim} with size ${this.shape[dim]}`\n );\n }\n return normalized;\n });\n\n // Convert value to appropriate type based on dtype\n const currentDtype = this.dtype as DType;\n let convertedValue: number | bigint;\n\n if (isBigIntDType(currentDtype)) {\n // Convert to BigInt for BigInt dtypes\n convertedValue = typeof value === 'bigint' ? value : BigInt(Math.round(value));\n } else if (currentDtype === 'bool') {\n // Convert to 0 or 1 for bool dtype\n convertedValue = value ? 1 : 0;\n } else {\n // Convert to number for all other dtypes\n convertedValue = Number(value);\n }\n\n this._storage.set(normalizedIndices, convertedValue);\n }\n\n /**\n * Return a deep copy of the array\n */\n copy(): NDArray {\n return new NDArray(this._storage.copy());\n }\n\n /**\n * Cast array to a different dtype\n * @param dtype - Target dtype\n * @param copy - If false and dtype matches, return self; otherwise create copy (default: true)\n * @returns Array with specified dtype\n */\n astype(dtype: DType, copy: boolean = true): NDArray {\n const currentDtype = this.dtype as DType;\n\n // If dtype matches and copy=false, return self\n if (currentDtype === dtype && !copy) {\n return this;\n }\n\n // If dtype matches and copy=true, create a copy\n if (currentDtype === dtype && copy) {\n return this.copy();\n }\n\n // Need to convert dtype\n const shape = Array.from(this.shape);\n const size = this.size;\n\n // Get TypedArray constructor for conversion\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot convert to dtype ${dtype}`);\n }\n const newData = new Constructor(size);\n const oldData = this.data;\n\n // Handle BigInt to other types\n if (isBigIntDType(currentDtype) && !isBigIntDType(dtype)) {\n const typedOldData = oldData as BigInt64Array | BigUint64Array;\n if (dtype === 'bool') {\n for (let i = 0; i < size; i++) {\n (newData as Uint8Array)[i] = typedOldData[i] !== BigInt(0) ? 1 : 0;\n }\n } else {\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(\n typedOldData[i]\n );\n }\n }\n }\n // Handle other types to BigInt\n else if (!isBigIntDType(currentDtype) && isBigIntDType(dtype)) {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as BigInt64Array | BigUint64Array)[i] = BigInt(\n Math.round(Number(typedOldData[i]))\n );\n }\n }\n // Handle other types to bool\n else if (dtype === 'bool') {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as Uint8Array)[i] = typedOldData[i] !== 0 ? 1 : 0;\n }\n }\n // Handle bool to other types\n else if (currentDtype === 'bool' && !isBigIntDType(dtype)) {\n const typedOldData = oldData as Uint8Array;\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = typedOldData[i]!;\n }\n }\n // Handle regular numeric conversions\n else if (!isBigIntDType(currentDtype) && !isBigIntDType(dtype)) {\n const typedOldData = oldData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n (newData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = typedOldData[i]!;\n }\n }\n // Handle BigInt to BigInt conversions (int64 <-> uint64)\n else {\n const typedOldData = oldData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n (newData as BigInt64Array | BigUint64Array)[i] = typedOldData[i]!;\n }\n }\n\n const storage = ArrayStorage.fromData(newData, shape, dtype);\n return new NDArray(storage);\n }\n\n // Arithmetic operations\n /**\n * Element-wise addition\n * @param other - Array or scalar to add\n * @returns Result of addition with broadcasting\n */\n add(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.add(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise subtraction\n * @param other - Array or scalar to subtract\n * @returns Result of subtraction with broadcasting\n */\n subtract(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.subtract(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise multiplication\n * @param other - Array or scalar to multiply\n * @returns Result of multiplication with broadcasting\n */\n multiply(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.multiply(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise division\n * @param other - Array or scalar to divide by\n * @returns Result of division with broadcasting\n */\n divide(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.divide(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise modulo operation\n * @param other - Array or scalar divisor\n * @returns Remainder after division\n */\n mod(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.mod(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise floor division\n * @param other - Array or scalar to divide by\n * @returns Floor of the quotient\n */\n floor_divide(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = arithmeticOps.floorDivide(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Numerical positive (element-wise +x)\n * @returns Copy of the array\n */\n positive(): NDArray {\n const resultStorage = arithmeticOps.positive(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise reciprocal (1/x)\n * @returns New array with reciprocals\n */\n reciprocal(): NDArray {\n const resultStorage = arithmeticOps.reciprocal(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Mathematical operations\n /**\n * Square root of each element\n * Promotes integer types to float64\n * @returns New array with square roots\n */\n sqrt(): NDArray {\n const resultStorage = exponentialOps.sqrt(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Raise elements to power\n * @param exponent - Power to raise to (array or scalar)\n * @returns New array with powered values\n */\n power(exponent: NDArray | number): NDArray {\n const exponentStorage = typeof exponent === 'number' ? exponent : exponent._storage;\n const resultStorage = exponentialOps.power(this._storage, exponentStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Natural exponential (e^x) of each element\n * Promotes integer types to float64\n * @returns New array with exp values\n */\n exp(): NDArray {\n const resultStorage = exponentialOps.exp(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Base-2 exponential (2^x) of each element\n * Promotes integer types to float64\n * @returns New array with exp2 values\n */\n exp2(): NDArray {\n const resultStorage = exponentialOps.exp2(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Exponential minus one (e^x - 1) of each element\n * More accurate than exp(x) - 1 for small x\n * Promotes integer types to float64\n * @returns New array with expm1 values\n */\n expm1(): NDArray {\n const resultStorage = exponentialOps.expm1(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Natural logarithm (ln) of each element\n * Promotes integer types to float64\n * @returns New array with log values\n */\n log(): NDArray {\n const resultStorage = exponentialOps.log(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Base-2 logarithm of each element\n * Promotes integer types to float64\n * @returns New array with log2 values\n */\n log2(): NDArray {\n const resultStorage = exponentialOps.log2(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Base-10 logarithm of each element\n * Promotes integer types to float64\n * @returns New array with log10 values\n */\n log10(): NDArray {\n const resultStorage = exponentialOps.log10(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Natural logarithm of (1 + x) of each element\n * More accurate than log(1 + x) for small x\n * Promotes integer types to float64\n * @returns New array with log1p values\n */\n log1p(): NDArray {\n const resultStorage = exponentialOps.log1p(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Logarithm of the sum of exponentials: log(exp(x1) + exp(x2))\n * More numerically stable than computing the expression directly\n * Promotes integer types to float64\n * @param x2 - Second operand (array or scalar)\n * @returns New array with logaddexp values\n */\n logaddexp(x2: NDArray | number): NDArray {\n const x2Storage = typeof x2 === 'number' ? x2 : x2._storage;\n const resultStorage = exponentialOps.logaddexp(this._storage, x2Storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Logarithm base 2 of the sum of exponentials: log2(2^x1 + 2^x2)\n * More numerically stable than computing the expression directly\n * Promotes integer types to float64\n * @param x2 - Second operand (array or scalar)\n * @returns New array with logaddexp2 values\n */\n logaddexp2(x2: NDArray | number): NDArray {\n const x2Storage = typeof x2 === 'number' ? x2 : x2._storage;\n const resultStorage = exponentialOps.logaddexp2(this._storage, x2Storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Absolute value of each element\n * @returns New array with absolute values\n */\n absolute(): NDArray {\n const resultStorage = arithmeticOps.absolute(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Numerical negative (element-wise negation)\n * @returns New array with negated values\n */\n negative(): NDArray {\n const resultStorage = arithmeticOps.negative(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Sign of each element (-1, 0, or 1)\n * @returns New array with signs\n */\n sign(): NDArray {\n const resultStorage = arithmeticOps.sign(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Rounding operations\n /**\n * Round an array to the given number of decimals\n * @param decimals - Number of decimal places to round to (default: 0)\n * @returns New array with rounded values\n */\n around(decimals: number = 0): NDArray {\n const resultStorage = roundingOps.around(this._storage, decimals);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Round an array to the given number of decimals (alias for around)\n * @param decimals - Number of decimal places to round to (default: 0)\n * @returns New array with rounded values\n */\n round(decimals: number = 0): NDArray {\n return this.around(decimals);\n }\n\n /**\n * Return the ceiling of the input, element-wise\n * @returns New array with ceiling values\n */\n ceil(): NDArray {\n const resultStorage = roundingOps.ceil(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Round to nearest integer towards zero\n * @returns New array with values truncated towards zero\n */\n fix(): NDArray {\n const resultStorage = roundingOps.fix(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Return the floor of the input, element-wise\n * @returns New array with floor values\n */\n floor(): NDArray {\n const resultStorage = roundingOps.floor(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Round elements to the nearest integer\n * @returns New array with rounded integer values\n */\n rint(): NDArray {\n const resultStorage = roundingOps.rint(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Return the truncated value of the input, element-wise\n * @returns New array with truncated values\n */\n trunc(): NDArray {\n const resultStorage = roundingOps.trunc(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Trigonometric operations\n /**\n * Sine of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with sine values\n */\n sin(): NDArray {\n const resultStorage = trigOps.sin(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Cosine of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with cosine values\n */\n cos(): NDArray {\n const resultStorage = trigOps.cos(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Tangent of each element (in radians)\n * Promotes integer types to float64\n * @returns New array with tangent values\n */\n tan(): NDArray {\n const resultStorage = trigOps.tan(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse sine of each element\n * Promotes integer types to float64\n * @returns New array with arcsin values (radians)\n */\n arcsin(): NDArray {\n const resultStorage = trigOps.arcsin(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse cosine of each element\n * Promotes integer types to float64\n * @returns New array with arccos values (radians)\n */\n arccos(): NDArray {\n const resultStorage = trigOps.arccos(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse tangent of each element\n * Promotes integer types to float64\n * @returns New array with arctan values (radians)\n */\n arctan(): NDArray {\n const resultStorage = trigOps.arctan(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise arc tangent of this/other choosing the quadrant correctly\n * @param other - x-coordinates (array or scalar)\n * @returns Angle in radians between -\u03C0 and \u03C0\n */\n arctan2(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = trigOps.arctan2(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Given the \"legs\" of a right triangle, return its hypotenuse\n * Equivalent to sqrt(this**2 + other**2), element-wise\n * @param other - Second leg (array or scalar)\n * @returns Hypotenuse values\n */\n hypot(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = trigOps.hypot(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Convert angles from radians to degrees\n * @returns New array with angles in degrees\n */\n degrees(): NDArray {\n const resultStorage = trigOps.degrees(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Convert angles from degrees to radians\n * @returns New array with angles in radians\n */\n radians(): NDArray {\n const resultStorage = trigOps.radians(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Hyperbolic operations\n /**\n * Hyperbolic sine of each element\n * Promotes integer types to float64\n * @returns New array with sinh values\n */\n sinh(): NDArray {\n const resultStorage = hyperbolicOps.sinh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Hyperbolic cosine of each element\n * Promotes integer types to float64\n * @returns New array with cosh values\n */\n cosh(): NDArray {\n const resultStorage = hyperbolicOps.cosh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Hyperbolic tangent of each element\n * Promotes integer types to float64\n * @returns New array with tanh values\n */\n tanh(): NDArray {\n const resultStorage = hyperbolicOps.tanh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic sine of each element\n * Promotes integer types to float64\n * @returns New array with arcsinh values\n */\n arcsinh(): NDArray {\n const resultStorage = hyperbolicOps.arcsinh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic cosine of each element\n * Promotes integer types to float64\n * @returns New array with arccosh values\n */\n arccosh(): NDArray {\n const resultStorage = hyperbolicOps.arccosh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Inverse hyperbolic tangent of each element\n * Promotes integer types to float64\n * @returns New array with arctanh values\n */\n arctanh(): NDArray {\n const resultStorage = hyperbolicOps.arctanh(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Comparison operations\n /**\n * Element-wise greater than comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n greater(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.greater(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise greater than or equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n greater_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.greaterEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise less than comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n less(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.less(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise less than or equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n less_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.lessEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise equality comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.equal(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise not equal comparison\n * @param other - Value or array to compare with\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n not_equal(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.notEqual(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise comparison with tolerance\n * Returns True where |a - b| <= (atol + rtol * |b|)\n * @param other - Value or array to compare with\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n isclose(other: NDArray | number, rtol: number = 1e-5, atol: number = 1e-8): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = comparisonOps.isclose(this._storage, otherStorage, rtol, atol);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise comparison with tolerance\n * Returns True where |a - b| <= (atol + rtol * |b|)\n * @param other - Value or array to compare with\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns Boolean array (represented as uint8: 1=true, 0=false)\n */\n allclose(other: NDArray | number, rtol: number = 1e-5, atol: number = 1e-8): boolean {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n return comparisonOps.allclose(this._storage, otherStorage, rtol, atol);\n }\n\n // Bitwise operations\n /**\n * Bitwise AND element-wise\n * @param other - Array or scalar for AND operation (must be integer type)\n * @returns Result of bitwise AND\n */\n bitwise_and(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_and(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise OR element-wise\n * @param other - Array or scalar for OR operation (must be integer type)\n * @returns Result of bitwise OR\n */\n bitwise_or(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_or(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise XOR element-wise\n * @param other - Array or scalar for XOR operation (must be integer type)\n * @returns Result of bitwise XOR\n */\n bitwise_xor(other: NDArray | number): NDArray {\n const otherStorage = typeof other === 'number' ? other : other._storage;\n const resultStorage = bitwiseOps.bitwise_xor(this._storage, otherStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Bitwise NOT (inversion) element-wise\n * @returns Result of bitwise NOT\n */\n bitwise_not(): NDArray {\n const resultStorage = bitwiseOps.bitwise_not(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Invert (bitwise NOT) element-wise - alias for bitwise_not\n * @returns Result of bitwise inversion\n */\n invert(): NDArray {\n const resultStorage = bitwiseOps.invert(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Left shift elements by positions\n * @param shift - Shift amount (array or scalar)\n * @returns Result of left shift\n */\n left_shift(shift: NDArray | number): NDArray {\n const shiftStorage = typeof shift === 'number' ? shift : shift._storage;\n const resultStorage = bitwiseOps.left_shift(this._storage, shiftStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Right shift elements by positions\n * @param shift - Shift amount (array or scalar)\n * @returns Result of right shift\n */\n right_shift(shift: NDArray | number): NDArray {\n const shiftStorage = typeof shift === 'number' ? shift : shift._storage;\n const resultStorage = bitwiseOps.right_shift(this._storage, shiftStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Reductions\n /**\n * Sum array elements over a given axis\n * @param axis - Axis along which to sum. If undefined, sum all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum of array elements, or array of sums along axis\n */\n sum(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.sum(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the arithmetic mean along the specified axis\n * @param axis - Axis along which to compute mean. If undefined, compute mean of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean of array elements, or array of means along axis\n *\n * Note: mean() returns float64 for integer dtypes, matching NumPy behavior\n */\n mean(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.mean(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the maximum along a given axis\n * @param axis - Axis along which to compute maximum. If undefined, compute maximum of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum of array elements, or array of maximums along axis\n */\n max(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.max(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the minimum along a given axis\n * @param axis - Axis along which to compute minimum. If undefined, compute minimum of all elements\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum of array elements, or array of minimums along axis\n */\n min(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.min(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Product of array elements over a given axis\n * @param axis - Axis along which to compute the product. If undefined, product of all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product of array elements, or array of products along axis\n */\n prod(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.prod(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Indices of the minimum values along an axis\n * @param axis - Axis along which to find minimum indices. If undefined, index of global minimum.\n * @returns Indices of minimum values\n */\n argmin(axis?: number): NDArray | number {\n const result = reductionOps.argmin(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Indices of the maximum values along an axis\n * @param axis - Axis along which to find maximum indices. If undefined, index of global maximum.\n * @returns Indices of maximum values\n */\n argmax(axis?: number): NDArray | number {\n const result = reductionOps.argmax(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute variance along the specified axis\n * @param axis - Axis along which to compute variance. If undefined, variance of all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance of array elements\n */\n var(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.variance(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute standard deviation along the specified axis\n * @param axis - Axis along which to compute std. If undefined, std of all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation of array elements\n */\n std(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.std(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Test whether all array elements along a given axis evaluate to True\n * @param axis - Axis along which to perform logical AND. If undefined, test all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Boolean or array of booleans\n */\n all(axis?: number, keepdims: boolean = false): NDArray | boolean {\n const result = reductionOps.all(this._storage, axis, keepdims);\n return typeof result === 'boolean' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Test whether any array elements along a given axis evaluate to True\n * @param axis - Axis along which to perform logical OR. If undefined, test all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Boolean or array of booleans\n */\n any(axis?: number, keepdims: boolean = false): NDArray | boolean {\n const result = reductionOps.any(this._storage, axis, keepdims);\n return typeof result === 'boolean' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the cumulative sum of elements along a given axis\n * @param axis - Axis along which to compute cumsum. If undefined, compute over flattened array.\n * @returns Array with cumulative sums\n */\n cumsum(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumsum(this._storage, axis));\n }\n\n /**\n * Return the cumulative product of elements along a given axis\n * @param axis - Axis along which to compute cumprod. If undefined, compute over flattened array.\n * @returns Array with cumulative products\n */\n cumprod(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumprod(this._storage, axis));\n }\n\n /**\n * Peak to peak (maximum - minimum) value along a given axis\n * @param axis - Axis along which to compute ptp. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Range of values\n */\n ptp(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.ptp(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the median along the specified axis\n * @param axis - Axis along which to compute median. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median of array elements\n */\n median(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.median(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the q-th percentile of the data along the specified axis\n * @param q - Percentile to compute (0-100)\n * @param axis - Axis along which to compute percentile. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Percentile of array elements\n */\n percentile(q: number, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.percentile(this._storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the q-th quantile of the data along the specified axis\n * @param q - Quantile to compute (0-1)\n * @param axis - Axis along which to compute quantile. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Quantile of array elements\n */\n quantile(q: number, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.quantile(this._storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the weighted average along the specified axis\n * @param weights - Array of weights (optional)\n * @param axis - Axis along which to compute average. If undefined, compute over all elements.\n * @returns Weighted average of array elements\n */\n average(weights?: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.average(this._storage, axis, weights?.storage);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the sum of array elements, treating NaNs as zero\n * @param axis - Axis along which to compute sum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum of array elements ignoring NaNs\n */\n nansum(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nansum(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the product of array elements, treating NaNs as ones\n * @param axis - Axis along which to compute product. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product of array elements ignoring NaNs\n */\n nanprod(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanprod(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the arithmetic mean, ignoring NaNs\n * @param axis - Axis along which to compute mean. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean of array elements ignoring NaNs\n */\n nanmean(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmean(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the variance, ignoring NaNs\n * @param axis - Axis along which to compute variance. If undefined, compute over all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance of array elements ignoring NaNs\n */\n nanvar(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanvar(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Compute the standard deviation, ignoring NaNs\n * @param axis - Axis along which to compute std. If undefined, compute over all elements.\n * @param ddof - Delta degrees of freedom (default: 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation of array elements ignoring NaNs\n */\n nanstd(axis?: number, ddof: number = 0, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanstd(this._storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return minimum of an array or minimum along an axis, ignoring NaNs\n * @param axis - Axis along which to compute minimum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum of array elements ignoring NaNs\n */\n nanmin(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmin(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return maximum of an array or maximum along an axis, ignoring NaNs\n * @param axis - Axis along which to compute maximum. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum of array elements ignoring NaNs\n */\n nanmax(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmax(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the indices of the minimum values, ignoring NaNs\n * @param axis - Axis along which to find minimum indices. If undefined, index of global minimum.\n * @returns Indices of minimum values ignoring NaNs\n */\n nanargmin(axis?: number): NDArray | number {\n const result = reductionOps.nanargmin(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the indices of the maximum values, ignoring NaNs\n * @param axis - Axis along which to find maximum indices. If undefined, index of global maximum.\n * @returns Indices of maximum values ignoring NaNs\n */\n nanargmax(axis?: number): NDArray | number {\n const result = reductionOps.nanargmax(this._storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n /**\n * Return the cumulative sum of elements, treating NaNs as zero\n * @param axis - Axis along which to compute cumsum. If undefined, compute over flattened array.\n * @returns Array with cumulative sums ignoring NaNs\n */\n nancumsum(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumsum(this._storage, axis));\n }\n\n /**\n * Return the cumulative product of elements, treating NaNs as one\n * @param axis - Axis along which to compute cumprod. If undefined, compute over flattened array.\n * @returns Array with cumulative products ignoring NaNs\n */\n nancumprod(axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumprod(this._storage, axis));\n }\n\n /**\n * Compute the median, ignoring NaNs\n * @param axis - Axis along which to compute median. If undefined, compute over all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median of array elements ignoring NaNs\n */\n nanmedian(axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmedian(this._storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n }\n\n // ========================================\n // Sorting and Searching\n // ========================================\n\n /**\n * Return a sorted copy of the array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\n sort(axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.sort(this._storage, axis));\n }\n\n /**\n * Returns the indices that would sort this array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the array\n */\n argsort(axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argsort(this._storage, axis));\n }\n\n /**\n * Partially sort the array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\n partition(kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.partition(this._storage, kth, axis));\n }\n\n /**\n * Returns indices that would partition the array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\n argpartition(kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argpartition(this._storage, kth, axis));\n }\n\n /**\n * Return the indices of non-zero elements\n * @returns Tuple of arrays, one for each dimension\n */\n nonzero(): NDArray[] {\n const storages = sortingOps.nonzero(this._storage);\n return storages.map((s) => NDArray._fromStorage(s));\n }\n\n /**\n * Find indices where elements should be inserted to maintain order\n * @param v - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\n searchsorted(v: NDArray, side: 'left' | 'right' = 'left'): NDArray {\n return NDArray._fromStorage(sortingOps.searchsorted(this._storage, v._storage, side));\n }\n\n // Gradient and difference operations\n /**\n * Calculate the n-th discrete difference along the given axis\n * @param n - Number of times values are differenced (default: 1)\n * @param axis - Axis along which to compute difference (default: -1)\n * @returns Array of differences\n */\n diff(n: number = 1, axis: number = -1): NDArray {\n return NDArray._fromStorage(gradientOps.diff(this._storage, n, axis));\n }\n\n // Shape manipulation\n /**\n * Reshape array to a new shape\n * Returns a new array with the specified shape\n * @param shape - New shape (must be compatible with current size)\n * @returns Reshaped array\n */\n reshape(...shape: number[]): NDArray {\n const newShape = shape.length === 1 && Array.isArray(shape[0]) ? shape[0] : shape;\n const resultStorage = shapeOps.reshape(this._storage, newShape);\n const isView = resultStorage.data === this.data;\n const base = isView ? (this._base ?? this) : undefined;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Return a flattened copy of the array\n * @returns 1D array containing all elements\n */\n flatten(): NDArray {\n const resultStorage = shapeOps.flatten(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Return a flattened array (view when possible, otherwise copy)\n * @returns 1D array containing all elements\n */\n ravel(): NDArray {\n const resultStorage = shapeOps.ravel(this._storage);\n const isView = resultStorage.data === this.data;\n const base = isView ? (this._base ?? this) : undefined;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Transpose array (permute dimensions)\n * @param axes - Permutation of axes. If undefined, reverse the dimensions\n * @returns Transposed array (always a view)\n */\n transpose(axes?: number[]): NDArray {\n const resultStorage = shapeOps.transpose(this._storage, axes);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Remove axes of length 1\n * @param axis - Axis to squeeze. If undefined, squeeze all axes of length 1\n * @returns Array with specified dimensions removed (always a view)\n */\n squeeze(axis?: number): NDArray {\n const resultStorage = shapeOps.squeeze(this._storage, axis);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Expand the shape by inserting a new axis of length 1\n * @param axis - Position where new axis is placed\n * @returns Array with additional dimension (always a view)\n */\n expand_dims(axis: number): NDArray {\n const resultStorage = shapeOps.expandDims(this._storage, axis);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Swap two axes of an array\n * @param axis1 - First axis\n * @param axis2 - Second axis\n * @returns Array with swapped axes (always a view)\n */\n swapaxes(axis1: number, axis2: number): NDArray {\n const resultStorage = shapeOps.swapaxes(this._storage, axis1, axis2);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Move axes to new positions\n * @param source - Original positions of axes to move\n * @param destination - New positions for axes\n * @returns Array with moved axes (always a view)\n */\n moveaxis(source: number | number[], destination: number | number[]): NDArray {\n const resultStorage = shapeOps.moveaxis(this._storage, source, destination);\n const base = this._base ?? this;\n return NDArray._fromStorage(resultStorage, base);\n }\n\n /**\n * Repeat elements of an array\n * @param repeats - Number of repetitions for each element\n * @param axis - Axis along which to repeat (if undefined, flattens first)\n * @returns New array with repeated elements\n */\n repeat(repeats: number | number[], axis?: number): NDArray {\n const resultStorage = shapeOps.repeat(this._storage, repeats, axis);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Take elements from array along an axis\n * @param indices - Indices of elements to take\n * @param axis - Axis along which to take (if undefined, flattens first)\n * @returns New array with selected elements\n */\n take(indices: number[], axis?: number): NDArray {\n const resultStorage = advancedOps.take(this._storage, indices, axis);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Put values at specified indices (modifies array in-place)\n * @param indices - Indices at which to place values\n * @param values - Values to put\n */\n put(indices: number[], values: NDArray | number | bigint): void {\n const valuesStorage = values instanceof NDArray ? values._storage : values;\n advancedOps.put(this._storage, indices, valuesStorage);\n }\n\n // Linear algebra operations\n /**\n * Matrix multiplication\n * @param other - Array to multiply with\n * @returns Result of matrix multiplication\n */\n matmul(other: NDArray): NDArray {\n const resultStorage = linalgOps.matmul(this._storage, other._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Dot product (matching NumPy behavior)\n * @param other - Array to dot with\n * @returns Result of dot product (scalar or array depending on dimensions)\n */\n dot(other: NDArray): NDArray | number | bigint {\n const result = linalgOps.dot(this._storage, other._storage);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n /**\n * Sum of diagonal elements (trace)\n * @returns Sum of diagonal elements\n */\n trace(): number | bigint {\n return linalgOps.trace(this._storage);\n }\n\n /**\n * Inner product (contracts over last axes of both arrays)\n * @param other - Array to compute inner product with\n * @returns Inner product result\n */\n inner(other: NDArray): NDArray | number | bigint {\n const result = linalgOps.inner(this._storage, other._storage);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n /**\n * Outer product (flattens inputs then computes a[i]*b[j])\n * @param other - Array to compute outer product with\n * @returns 2D outer product matrix\n */\n outer(other: NDArray): NDArray {\n const result = linalgOps.outer(this._storage, other._storage);\n return NDArray._fromStorage(result);\n }\n\n /**\n * Tensor dot product along specified axes\n * @param other - Array to contract with\n * @param axes - Axes to contract (integer or [a_axes, b_axes])\n * @returns Tensor dot product result\n */\n tensordot(other: NDArray, axes: number | [number[], number[]] = 2): NDArray | number | bigint {\n const result = linalgOps.tensordot(this._storage, other._storage, axes);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n }\n\n // Additional arithmetic operations\n\n /**\n * Element-wise cube root\n * Promotes integer types to float64\n * @returns New array with cube root values\n */\n cbrt(): NDArray {\n const resultStorage = arithmeticOps.cbrt(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise absolute value (always returns float)\n * @returns New array with absolute values as float\n */\n fabs(): NDArray {\n const resultStorage = arithmeticOps.fabs(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Returns both quotient and remainder (floor divide and modulo)\n * @param divisor - Array or scalar divisor\n * @returns Tuple of [quotient, remainder] arrays\n */\n divmod(divisor: NDArray | number): [NDArray, NDArray] {\n const divisorStorage = typeof divisor === 'number' ? divisor : divisor._storage;\n const [quotientStorage, remainderStorage] = arithmeticOps.divmod(this._storage, divisorStorage);\n return [NDArray._fromStorage(quotientStorage), NDArray._fromStorage(remainderStorage)];\n }\n\n /**\n * Element-wise square (x**2)\n * @returns New array with squared values\n */\n square(): NDArray {\n const resultStorage = arithmeticOps.square(this._storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Element-wise remainder (same as mod)\n * @param divisor - Array or scalar divisor\n * @returns New array with remainder values\n */\n remainder(divisor: NDArray | number): NDArray {\n const divisorStorage = typeof divisor === 'number' ? divisor : divisor._storage;\n const resultStorage = arithmeticOps.remainder(this._storage, divisorStorage);\n return NDArray._fromStorage(resultStorage);\n }\n\n /**\n * Heaviside step function\n * @param x2 - Value to use when this array element is 0\n * @returns New array with heaviside values\n */\n heaviside(x2: NDArray | number): NDArray {\n const x2Storage = typeof x2 === 'number' ? x2 : x2._storage;\n const resultStorage = arithmeticOps.heaviside(this._storage, x2Storage);\n return NDArray._fromStorage(resultStorage);\n }\n\n // Slicing\n /**\n * Slice the array using NumPy-style string syntax\n *\n * @param sliceStrs - Slice specifications, one per dimension\n * @returns Sliced view of the array\n */\n slice(...sliceStrs: string[]): NDArray {\n if (sliceStrs.length === 0) {\n return this;\n }\n\n if (sliceStrs.length > this.ndim) {\n throw new Error(\n `Too many indices for array: array is ${this.ndim}-dimensional, but ${sliceStrs.length} were indexed`\n );\n }\n\n // Parse slice strings and normalize them\n const sliceSpecs = sliceStrs.map((str, i) => {\n const spec = parseSlice(str);\n const normalized = normalizeSlice(spec, this.shape[i]!);\n return normalized;\n });\n\n // Pad with full slices for remaining dimensions\n while (sliceSpecs.length < this.ndim) {\n sliceSpecs.push({\n start: 0,\n stop: this.shape[sliceSpecs.length]!,\n step: 1,\n isIndex: false,\n });\n }\n\n // Calculate new shape and strides\n const newShape: number[] = [];\n const newStrides: number[] = [];\n let newOffset = this._storage.offset;\n\n for (let i = 0; i < sliceSpecs.length; i++) {\n const spec = sliceSpecs[i]!;\n const stride = this._storage.strides[i]!;\n\n // Update offset based on start position\n newOffset += spec.start * stride;\n\n if (!spec.isIndex) {\n // Calculate size of this dimension\n // For positive step: (stop - start) / step\n // For negative step: (start - stop) / |step| (since we go from high to low)\n let dimSize: number;\n if (spec.step > 0) {\n dimSize = Math.max(0, Math.ceil((spec.stop - spec.start) / spec.step));\n } else {\n // Negative step: iterate from start down to (but not including) stop\n dimSize = Math.max(0, Math.ceil((spec.start - spec.stop) / Math.abs(spec.step)));\n }\n newShape.push(dimSize);\n newStrides.push(stride * spec.step);\n }\n // If isIndex is true, this dimension is removed (scalar indexing)\n }\n\n // Create sliced view\n const slicedStorage = ArrayStorage.fromData(\n this._storage.data,\n newShape,\n this._storage.dtype,\n newStrides,\n newOffset\n );\n\n const base = this._base ?? this;\n return new NDArray(slicedStorage, base);\n }\n\n // Convenience methods\n /**\n * Get a single row (convenience method)\n * @param i - Row index\n * @returns Row as 1D or (n-1)D array\n */\n\n row(i: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('row() requires at least 2 dimensions');\n }\n return this.slice(String(i), ':');\n }\n\n /**\n * Get a single column (convenience method)\n * @param j - Column index\n * @returns Column as 1D or (n-1)D array\n */\n col(j: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('col() requires at least 2 dimensions');\n }\n return this.slice(':', String(j));\n }\n\n /**\n * Get a range of rows (convenience method)\n * @param start - Start row index\n * @param stop - Stop row index (exclusive)\n * @returns Rows as array\n */\n rows(start: number, stop: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('rows() requires at least 2 dimensions');\n }\n return this.slice(`${start}:${stop}`, ':');\n }\n\n /**\n * Get a range of columns (convenience method)\n * @param start - Start column index\n * @param stop - Stop column index (exclusive)\n * @returns Columns as array\n */\n cols(start: number, stop: number): NDArray {\n if (this.ndim < 2) {\n throw new Error('cols() requires at least 2 dimensions');\n }\n return this.slice(':', `${start}:${stop}`);\n }\n\n // String representation\n /**\n * String representation of the array\n * @returns String describing the array shape and dtype\n */\n toString(): string {\n return `NDArray(shape=${JSON.stringify(this.shape)}, dtype=${this.dtype})`;\n }\n\n /**\n * Convert to nested JavaScript array\n * @returns Nested JavaScript array representation\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toArray(): any {\n // Handle 0-dimensional arrays (scalars)\n if (this.ndim === 0) {\n return this._storage.iget(0);\n }\n\n const shape = this.shape;\n const ndim = shape.length;\n\n // Recursive function to build nested array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildNestedArray = (indices: number[], dim: number): any => {\n if (dim === ndim) {\n return this._storage.get(...indices);\n }\n\n const arr = [];\n for (let i = 0; i < shape[dim]!; i++) {\n indices[dim] = i;\n arr.push(buildNestedArray(indices, dim + 1));\n }\n return arr;\n };\n\n return buildNestedArray(new Array(ndim), 0);\n }\n}\n\n// Creation functions\n\n/**\n * Create array of zeros\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Array filled with zeros\n */\nexport function zeros(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n const storage = ArrayStorage.zeros(shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array of ones\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Array filled with ones\n */\nexport function ones(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n const storage = ArrayStorage.ones(shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Helper to infer shape from nested arrays\n */\nfunction inferShape(data: unknown): number[] {\n const shape: number[] = [];\n let current = data;\n while (Array.isArray(current)) {\n shape.push(current.length);\n current = current[0];\n }\n return shape;\n}\n\n/**\n * Helper to check if data contains BigInt values\n */\nfunction containsBigInt(data: unknown): boolean {\n if (typeof data === 'bigint') return true;\n if (Array.isArray(data)) {\n return data.some((item) => containsBigInt(item));\n }\n return false;\n}\n\n/**\n * Helper to flatten nested arrays keeping BigInt values\n */\nfunction flattenKeepBigInt(data: unknown): unknown[] {\n const result: unknown[] = [];\n function flatten(arr: unknown): void {\n if (Array.isArray(arr)) {\n arr.forEach((item) => flatten(item));\n } else {\n result.push(arr);\n }\n }\n flatten(data);\n return result;\n}\n\n/**\n * Create array from nested JavaScript arrays\n * @param data - Nested arrays or existing NDArray\n * @param dtype - Data type (optional, will be inferred if not provided)\n * @returns New NDArray\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function array(data: any, dtype?: DType): NDArray {\n // If data is already an NDArray, optionally convert dtype\n if (data instanceof NDArray) {\n if (!dtype || data.dtype === dtype) {\n return data.copy();\n }\n return data.astype(dtype);\n }\n\n const hasBigInt = containsBigInt(data);\n\n // Infer shape from nested arrays\n const shape = inferShape(data);\n const size = shape.reduce((a: number, b: number) => a * b, 1);\n\n // Determine dtype\n let actualDtype = dtype;\n if (!actualDtype) {\n if (hasBigInt) {\n actualDtype = 'int64';\n } else {\n actualDtype = DEFAULT_DTYPE;\n }\n }\n\n // Get TypedArray constructor\n const Constructor = getTypedArrayConstructor(actualDtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${actualDtype}`);\n }\n\n const typedData = new Constructor(size);\n const flatData = flattenKeepBigInt(data);\n\n // Fill the typed array\n if (isBigIntDType(actualDtype)) {\n const bigintData = typedData as BigInt64Array | BigUint64Array;\n for (let i = 0; i < size; i++) {\n const val = flatData[i];\n bigintData[i] = typeof val === 'bigint' ? val : BigInt(Math.round(Number(val)));\n }\n } else if (actualDtype === 'bool') {\n const boolData = typedData as Uint8Array;\n for (let i = 0; i < size; i++) {\n boolData[i] = flatData[i] ? 1 : 0;\n }\n } else {\n const numData = typedData as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < size; i++) {\n const val = flatData[i];\n numData[i] = typeof val === 'bigint' ? Number(val) : Number(val);\n }\n }\n\n const storage = ArrayStorage.fromData(typedData, shape, actualDtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with evenly spaced values within a given interval\n * Similar to Python's range() but returns array\n * @param start - Start value (or stop if only one argument)\n * @param stop - Stop value (exclusive)\n * @param step - Step between values (default: 1)\n * @param dtype - Data type (default: float64)\n * @returns Array of evenly spaced values\n */\nexport function arange(\n start: number,\n stop?: number,\n step: number = 1,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n let actualStart = start;\n let actualStop = stop;\n\n if (stop === undefined) {\n actualStart = 0;\n actualStop = start;\n }\n\n if (actualStop === undefined) {\n throw new Error('stop is required');\n }\n\n const length = Math.max(0, Math.ceil((actualStop - actualStart) / step));\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create arange array with dtype ${dtype}`);\n }\n\n const data = new Constructor(length);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < length; i++) {\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(actualStart + i * step));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < length; i++) {\n (data as Uint8Array)[i] = actualStart + i * step !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < length; i++) {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = actualStart + i * step;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [length], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with evenly spaced values over a specified interval\n * @param start - Starting value\n * @param stop - Ending value (inclusive)\n * @param num - Number of samples (default: 50)\n * @param dtype - Data type (default: float64)\n * @returns Array of evenly spaced values\n */\nexport function linspace(\n start: number,\n stop: number,\n num: number = 50,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([start], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create linspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const step = (stop - start) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(start + i * step));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n (data as Uint8Array)[i] = start + i * step !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = start + i * step;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with logarithmically spaced values\n * Returns num samples, equally spaced on a log scale from base^start to base^stop\n * @param start - base^start is the starting value\n * @param stop - base^stop is the ending value\n * @param num - Number of samples (default: 50)\n * @param base - Base of the log space (default: 10.0)\n * @param dtype - Data type (default: float64)\n * @returns Array of logarithmically spaced values\n */\nexport function logspace(\n start: number,\n stop: number,\n num: number = 50,\n base: number = 10.0,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([Math.pow(base, start)], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create logspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const step = (stop - start) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(Math.pow(base, exponent)));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as Uint8Array)[i] = Math.pow(base, exponent) !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n const exponent = start + i * step;\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Math.pow(base, exponent);\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create array with geometrically spaced values\n * Returns num samples, equally spaced on a log scale (geometric progression)\n * @param start - Starting value\n * @param stop - Ending value\n * @param num - Number of samples (default: 50)\n * @param dtype - Data type (default: float64)\n * @returns Array of geometrically spaced values\n */\nexport function geomspace(\n start: number,\n stop: number,\n num: number = 50,\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n if (num < 0) {\n throw new Error('num must be non-negative');\n }\n\n if (start === 0 || stop === 0) {\n throw new Error('Geometric sequence cannot include zero');\n }\n\n if (num === 0) {\n return array([], dtype);\n }\n\n if (num === 1) {\n return array([start], dtype);\n }\n\n const signStart = Math.sign(start);\n const signStop = Math.sign(stop);\n\n if (signStart !== signStop) {\n throw new Error('Geometric sequence cannot contain both positive and negative values');\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create geomspace array with dtype ${dtype}`);\n }\n\n const data = new Constructor(num);\n const logStart = Math.log(Math.abs(start));\n const logStop = Math.log(Math.abs(stop));\n const step = (logStop - logStart) / (num - 1);\n\n if (isBigIntDType(dtype)) {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as BigInt64Array | BigUint64Array)[i] = BigInt(Math.round(value));\n }\n } else if (dtype === 'bool') {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as Uint8Array)[i] = value !== 0 ? 1 : 0;\n }\n } else {\n for (let i = 0; i < num; i++) {\n const value = signStart * Math.exp(logStart + i * step);\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = value;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [num], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Create identity matrix\n * @param n - Number of rows\n * @param m - Number of columns (default: n)\n * @param k - Index of diagonal (0 for main diagonal, positive for upper, negative for lower)\n * @param dtype - Data type (default: float64)\n * @returns Identity matrix\n */\nexport function eye(n: number, m?: number, k: number = 0, dtype: DType = DEFAULT_DTYPE): NDArray {\n const cols = m ?? n;\n const result = zeros([n, cols], dtype);\n const data = result.data;\n\n if (isBigIntDType(dtype)) {\n const typedData = data as unknown as BigInt64Array | BigUint64Array;\n for (let i = 0; i < n; i++) {\n const j = i + k;\n if (j >= 0 && j < cols) {\n typedData[i * cols + j] = BigInt(1);\n }\n }\n } else {\n const typedData = data as unknown as Exclude<TypedArray, BigInt64Array | BigUint64Array>;\n for (let i = 0; i < n; i++) {\n const j = i + k;\n if (j >= 0 && j < cols) {\n typedData[i * cols + j] = 1;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Create an uninitialized array\n * Note: TypedArrays are zero-initialized by default in JavaScript\n * @param shape - Shape of the array\n * @param dtype - Data type (default: float64)\n * @returns Uninitialized array\n */\nexport function empty(shape: number[], dtype: DType = DEFAULT_DTYPE): NDArray {\n return zeros(shape, dtype);\n}\n\n/**\n * Create array filled with a constant value\n * @param shape - Shape of the array\n * @param fill_value - Value to fill the array with\n * @param dtype - Data type (optional, inferred from fill_value if not provided)\n * @returns Array filled with the constant value\n */\nexport function full(\n shape: number[],\n fill_value: number | bigint | boolean,\n dtype?: DType\n): NDArray {\n let actualDtype = dtype;\n if (!actualDtype) {\n if (typeof fill_value === 'bigint') {\n actualDtype = 'int64';\n } else if (typeof fill_value === 'boolean') {\n actualDtype = 'bool';\n } else if (Number.isInteger(fill_value)) {\n actualDtype = 'int32';\n } else {\n actualDtype = DEFAULT_DTYPE;\n }\n }\n\n const Constructor = getTypedArrayConstructor(actualDtype);\n if (!Constructor) {\n throw new Error(`Cannot create full array with dtype ${actualDtype}`);\n }\n const size = shape.reduce((a, b) => a * b, 1);\n const data = new Constructor(size);\n\n if (isBigIntDType(actualDtype)) {\n const bigintValue =\n typeof fill_value === 'bigint' ? fill_value : BigInt(Math.round(Number(fill_value)));\n (data as BigInt64Array | BigUint64Array).fill(bigintValue);\n } else if (actualDtype === 'bool') {\n (data as Uint8Array).fill(fill_value ? 1 : 0);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(Number(fill_value));\n }\n\n const storage = ArrayStorage.fromData(data, shape, actualDtype);\n return new NDArray(storage);\n}\n\n/**\n * Create a square identity matrix\n * @param n - Size of the square matrix\n * @param dtype - Data type (default: float64)\n * @returns n\u00D7n identity matrix\n */\nexport function identity(n: number, dtype: DType = DEFAULT_DTYPE): NDArray {\n return eye(n, n, 0, dtype);\n}\n\n/**\n * Convert input to an ndarray\n * @param a - Input data (array-like or NDArray)\n * @param dtype - Data type (optional)\n * @returns NDArray representation of the input\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asarray(a: NDArray | any, dtype?: DType): NDArray {\n if (a instanceof NDArray) {\n if (!dtype || a.dtype === dtype) {\n return a;\n }\n return a.astype(dtype);\n }\n return array(a, dtype);\n}\n\n/**\n * Create a deep copy of an array\n * @param a - Array to copy\n * @returns Deep copy of the array\n */\nexport function copy(a: NDArray): NDArray {\n return a.copy();\n}\n\n/**\n * Create array of zeros with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Array of zeros\n */\nexport function zeros_like(a: NDArray, dtype?: DType): NDArray {\n return zeros(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create array of ones with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Array of ones\n */\nexport function ones_like(a: NDArray, dtype?: DType): NDArray {\n return ones(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create uninitialized array with the same shape as another array\n * @param a - Array to match shape from\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Uninitialized array\n */\nexport function empty_like(a: NDArray, dtype?: DType): NDArray {\n return empty(Array.from(a.shape), dtype ?? (a.dtype as DType));\n}\n\n/**\n * Create array filled with a constant value, same shape as another array\n * @param a - Array to match shape from\n * @param fill_value - Value to fill with\n * @param dtype - Data type (optional, uses a's dtype if not provided)\n * @returns Filled array\n */\nexport function full_like(\n a: NDArray,\n fill_value: number | bigint | boolean,\n dtype?: DType\n): NDArray {\n return full(Array.from(a.shape), fill_value, dtype ?? (a.dtype as DType));\n}\n\n/**\n * Convert input to an ndarray (alias for asarray for compatibility)\n * In numpy-ts, this behaves the same as asarray since we don't have subclasses\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns NDArray\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asanyarray(a: NDArray | any, dtype?: DType): NDArray {\n return asarray(a, dtype);\n}\n\n/**\n * Return a contiguous array (ndim >= 1) in memory (C order)\n * Since our arrays are already C-contiguous in memory, this either\n * returns the input unchanged or creates a contiguous copy\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns Contiguous array in C order\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ascontiguousarray(a: NDArray | any, dtype?: DType): NDArray {\n const arr = asarray(a, dtype);\n if (arr.flags.C_CONTIGUOUS) {\n return arr;\n }\n return arr.copy();\n}\n\n/**\n * Return an array laid out in Fortran order in memory\n * Note: numpy-ts uses C-order internally, so this creates a copy\n * that is equivalent to the Fortran-ordered layout\n * @param a - Input data\n * @param dtype - Data type (optional)\n * @returns Array (copy in C order, as Fortran order is not supported)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asfortranarray(a: NDArray | any, dtype?: DType): NDArray {\n const arr = asarray(a, dtype);\n // We always return C-contiguous arrays, so just return a copy\n return arr.copy();\n}\n\n/**\n * Extract a diagonal or construct a diagonal array\n * @param v - Input array (if 2D, extract diagonal; if 1D, construct diagonal matrix)\n * @param k - Diagonal offset (default 0 is main diagonal, positive above, negative below)\n * @returns Diagonal elements as 1D array, or 2D diagonal matrix\n */\nexport function diag(v: NDArray, k: number = 0): NDArray {\n if (v.ndim === 1) {\n // Construct diagonal matrix from 1D array\n const n = v.size;\n const size = n + Math.abs(k);\n const result = zeros([size, size], v.dtype as DType);\n\n for (let i = 0; i < n; i++) {\n const row = k >= 0 ? i : i - k;\n const col = k >= 0 ? i + k : i;\n result.set([row, col], v.get([i]) as number);\n }\n return result;\n } else if (v.ndim === 2) {\n // Extract diagonal from 2D array\n const [rows, cols] = v.shape;\n let startRow: number, startCol: number, diagLength: number;\n\n if (k >= 0) {\n startRow = 0;\n startCol = k;\n diagLength = Math.min(rows!, cols! - k);\n } else {\n startRow = -k;\n startCol = 0;\n diagLength = Math.min(rows! + k, cols!);\n }\n\n if (diagLength <= 0) {\n return zeros([0], v.dtype as DType);\n }\n\n const Constructor = getTypedArrayConstructor(v.dtype as DType);\n const data = new Constructor!(diagLength);\n\n for (let i = 0; i < diagLength; i++) {\n const val = v.get([startRow + i, startCol + i]);\n if (isBigIntDType(v.dtype as DType)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof val === 'bigint' ? val : BigInt(val as number);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = val as number;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [diagLength], v.dtype as DType);\n return new NDArray(storage);\n } else {\n throw new Error('Input must be 1-D or 2-D');\n }\n}\n\n/**\n * Create a 2-D array with the flattened input as a diagonal\n * @param v - Input array (will be flattened)\n * @param k - Diagonal offset (default 0)\n * @returns 2D diagonal matrix\n */\nexport function diagflat(v: NDArray, k: number = 0): NDArray {\n const flat = v.flatten();\n return diag(flat, k);\n}\n\n/**\n * Construct an array by executing a function over each coordinate\n * @param fn - Function that takes coordinate indices and returns value\n * @param shape - Shape of output array\n * @param dtype - Data type (default: float64)\n * @returns Array with values computed from function\n */\nexport function fromfunction(\n fn: (...indices: number[]) => number | bigint | boolean,\n shape: number[],\n dtype: DType = DEFAULT_DTYPE\n): NDArray {\n const size = shape.reduce((a, b) => a * b, 1);\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Cannot create array with dtype ${dtype}`);\n }\n const data = new Constructor(size);\n const ndim = shape.length;\n const indices = new Array(ndim).fill(0);\n\n for (let i = 0; i < size; i++) {\n const value = fn(...indices);\n\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof value === 'bigint' ? value : BigInt(Number(value));\n } else if (dtype === 'bool') {\n (data as Uint8Array)[i] = value ? 1 : 0;\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(value);\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n indices[d]++;\n if (indices[d]! < shape[d]!) {\n break;\n }\n indices[d] = 0;\n }\n }\n\n const storage = ArrayStorage.fromData(data, shape, dtype);\n return new NDArray(storage);\n}\n\n/**\n * Return coordinate matrices from coordinate vectors\n * @param arrays - 1D coordinate arrays\n * @param indexing - 'xy' (Cartesian, default) or 'ij' (matrix indexing)\n * @returns Array of coordinate grids\n */\nexport function meshgrid(...args: (NDArray | { indexing?: 'xy' | 'ij' })[]): NDArray[] {\n // Parse arguments - last arg might be options\n let arrays: NDArray[] = [];\n let indexing: 'xy' | 'ij' = 'xy';\n\n for (const arg of args) {\n if (arg instanceof NDArray) {\n arrays.push(arg);\n } else if (typeof arg === 'object' && 'indexing' in arg) {\n indexing = arg.indexing || 'xy';\n }\n }\n\n if (arrays.length === 0) {\n return [];\n }\n\n if (arrays.length === 1) {\n return [arrays[0]!.copy()];\n }\n\n // Get sizes\n const sizes = arrays.map((a) => a.size);\n\n // For 'xy' indexing, swap first two dimensions\n if (indexing === 'xy' && arrays.length >= 2) {\n arrays = [arrays[1]!, arrays[0]!, ...arrays.slice(2)];\n [sizes[0], sizes[1]] = [sizes[1]!, sizes[0]!];\n }\n\n // Output shape is the combination of all input sizes\n const outputShape = sizes;\n const ndim = outputShape.length;\n\n const results: NDArray[] = [];\n\n for (let i = 0; i < arrays.length; i++) {\n const inputArr = arrays[i]!;\n const inputSize = inputArr.size;\n\n // Build the shape for broadcasting this array\n const broadcastShape: number[] = new Array(ndim).fill(1);\n broadcastShape[i] = inputSize;\n\n // Reshape and broadcast\n const reshaped = inputArr.reshape(...broadcastShape);\n const resultStorage = advancedOps.broadcast_to(reshaped.storage, outputShape);\n const result = NDArray._fromStorage(resultStorage.copy()); // copy to make contiguous\n results.push(result);\n }\n\n // For 'xy' indexing, swap back the first two results\n if (indexing === 'xy' && results.length >= 2) {\n [results[0], results[1]] = [results[1]!, results[0]!];\n }\n\n return results;\n}\n\n/**\n * An array with ones at and below the given diagonal and zeros elsewhere\n * @param N - Number of rows\n * @param M - Number of columns (default: N)\n * @param k - Diagonal offset (default 0)\n * @param dtype - Data type (default: float64)\n * @returns Triangular array\n */\nexport function tri(N: number, M?: number, k: number = 0, dtype: DType = DEFAULT_DTYPE): NDArray {\n const cols = M ?? N;\n const result = zeros([N, cols], dtype);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j <= i + k && j < cols; j++) {\n if (j >= 0) {\n result.set([i, j], 1);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Lower triangle of an array\n * @param m - Input array\n * @param k - Diagonal above which to zero elements (default 0)\n * @returns Copy with upper triangle zeroed\n */\nexport function tril(m: NDArray, k: number = 0): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must have at least 2 dimensions');\n }\n\n const result = m.copy();\n const shape = result.shape;\n const rows = shape[shape.length - 2]!;\n const cols = shape[shape.length - 1]!;\n\n // Handle multi-dimensional arrays\n const outerSize = shape.slice(0, -2).reduce((a, b) => a * b, 1);\n\n for (let outer = 0; outer < outerSize; outer++) {\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n if (j > i + k) {\n // Build the indices array\n const indices: number[] = [];\n let temp = outer;\n for (let d = shape.length - 3; d >= 0; d--) {\n indices.unshift(temp % shape[d]!);\n temp = Math.floor(temp / shape[d]!);\n }\n indices.push(i, j);\n result.set(indices, 0);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Upper triangle of an array\n * @param m - Input array\n * @param k - Diagonal below which to zero elements (default 0)\n * @returns Copy with lower triangle zeroed\n */\nexport function triu(m: NDArray, k: number = 0): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must have at least 2 dimensions');\n }\n\n const result = m.copy();\n const shape = result.shape;\n const rows = shape[shape.length - 2]!;\n const cols = shape[shape.length - 1]!;\n\n // Handle multi-dimensional arrays\n const outerSize = shape.slice(0, -2).reduce((a, b) => a * b, 1);\n\n for (let outer = 0; outer < outerSize; outer++) {\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n if (j < i + k) {\n // Build the indices array\n const indices: number[] = [];\n let temp = outer;\n for (let d = shape.length - 3; d >= 0; d--) {\n indices.unshift(temp % shape[d]!);\n temp = Math.floor(temp / shape[d]!);\n }\n indices.push(i, j);\n result.set(indices, 0);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Generate a Vandermonde matrix\n * @param x - Input 1D array\n * @param N - Number of columns (default: length of x)\n * @param increasing - Order of powers (default: false, highest powers first)\n * @returns Vandermonde matrix\n */\nexport function vander(x: NDArray, N?: number, increasing: boolean = false): NDArray {\n if (x.ndim !== 1) {\n throw new Error('Input must be 1-D');\n }\n\n const len = x.size;\n const cols = N ?? len;\n\n if (cols < 0) {\n throw new Error('N must be non-negative');\n }\n\n const result = zeros([len, cols], x.dtype as DType);\n\n for (let i = 0; i < len; i++) {\n const val = x.get([i]) as number;\n for (let j = 0; j < cols; j++) {\n const power = increasing ? j : cols - 1 - j;\n result.set([i, j], Math.pow(val, power));\n }\n }\n\n return result;\n}\n\n/**\n * Interpret a buffer as a 1-dimensional array\n * @param buffer - Buffer-like object (ArrayBuffer, TypedArray, or DataView)\n * @param dtype - Data type (default: float64)\n * @param count - Number of items to read (-1 means all)\n * @param offset - Start reading from this byte offset\n * @returns NDArray from buffer data\n */\nexport function frombuffer(\n buffer: ArrayBuffer | ArrayBufferView,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1,\n offset: number = 0\n): NDArray {\n let arrayBuffer: ArrayBufferLike;\n let byteOffset = offset;\n\n if (buffer instanceof ArrayBuffer) {\n arrayBuffer = buffer;\n } else {\n // It's a TypedArray or DataView\n arrayBuffer = buffer.buffer;\n byteOffset += buffer.byteOffset;\n }\n\n const bytesPerElement = getBytesPerElement(dtype);\n const availableBytes = arrayBuffer.byteLength - byteOffset;\n const maxElements = Math.floor(availableBytes / bytesPerElement);\n const numElements = count < 0 ? maxElements : Math.min(count, maxElements);\n\n if (numElements <= 0) {\n return array([], dtype);\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new Error(`Unsupported dtype: ${dtype}`);\n }\n\n // Create a view into the buffer\n const data = new Constructor(arrayBuffer as ArrayBuffer, byteOffset, numElements);\n const storage = ArrayStorage.fromData(data as TypedArray, [numElements], dtype);\n return new NDArray(storage);\n}\n\n/**\n * Construct an array by executing a function over each coordinate.\n * Note: This is a JS implementation - fromfile for actual files isn't directly applicable in browser JS.\n * This function creates an array from an iterable or callable.\n * @param file - In JS context, this is an iterable yielding values\n * @param dtype - Data type\n * @param count - Number of items to read (-1 means all)\n * @returns NDArray from the iterable\n */\nexport function fromfile(\n file: Iterable<number | bigint>,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1\n): NDArray {\n // In JavaScript, we interpret this as reading from an iterable\n const values: Array<number | bigint> = [];\n let i = 0;\n\n for (const val of file) {\n if (count >= 0 && i >= count) break;\n values.push(val);\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Create a new 1-dimensional array from an iterable object\n * @param iter - Iterable object\n * @param dtype - Data type\n * @param count - Number of items to read (-1 means all)\n * @returns NDArray from the iterable\n */\nexport function fromiter(\n iter: Iterable<number | bigint>,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1\n): NDArray {\n const values: Array<number | bigint> = [];\n let i = 0;\n\n for (const val of iter) {\n if (count >= 0 && i >= count) break;\n values.push(val);\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Create a new 1-dimensional array from text string\n * @param string - Input string containing numbers separated by whitespace or separator\n * @param dtype - Data type (default: float64)\n * @param count - Number of items to read (-1 means all)\n * @param sep - Separator between values (default: any whitespace)\n * @returns NDArray from parsed string\n */\nexport function fromstring(\n string: string,\n dtype: DType = DEFAULT_DTYPE,\n count: number = -1,\n sep: string = ''\n): NDArray {\n // Split the string by separator (or whitespace if sep is empty)\n let parts: string[];\n if (sep === '') {\n parts = string.trim().split(/\\s+/);\n } else {\n parts = string.split(sep);\n }\n\n // Parse values\n const values: Array<number | bigint> = [];\n let i = 0;\n for (const part of parts) {\n if (count >= 0 && i >= count) break;\n const trimmed = part.trim();\n if (trimmed === '') continue;\n\n if (isBigIntDType(dtype)) {\n values.push(BigInt(trimmed));\n } else {\n values.push(parseFloat(trimmed));\n }\n i++;\n }\n\n return array(values, dtype);\n}\n\n/**\n * Helper to get bytes per element for a dtype\n */\nfunction getBytesPerElement(dtype: DType): number {\n switch (dtype) {\n case 'int8':\n case 'uint8':\n case 'bool':\n return 1;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return 4;\n case 'int64':\n case 'uint64':\n case 'float64':\n return 8;\n default:\n return 8;\n }\n}\n\n// Mathematical functions (standalone)\n\n/**\n * Element-wise square root\n * @param x - Input array\n * @returns Array of square roots\n */\nexport function sqrt(x: NDArray): NDArray {\n return x.sqrt();\n}\n\n/**\n * Element-wise power\n * @param x - Base array\n * @param exponent - Exponent (array or scalar)\n * @returns Array of x raised to exponent\n */\nexport function power(x: NDArray, exponent: NDArray | number): NDArray {\n return x.power(exponent);\n}\n\n/**\n * Element-wise natural exponential (e^x)\n * @param x - Input array\n * @returns Array of e^x values\n */\nexport function exp(x: NDArray): NDArray {\n return x.exp();\n}\n\n/**\n * Element-wise base-2 exponential (2^x)\n * @param x - Input array\n * @returns Array of 2^x values\n */\nexport function exp2(x: NDArray): NDArray {\n return x.exp2();\n}\n\n/**\n * Element-wise exponential minus one (e^x - 1)\n * More accurate than exp(x) - 1 for small x\n * @param x - Input array\n * @returns Array of expm1 values\n */\nexport function expm1(x: NDArray): NDArray {\n return x.expm1();\n}\n\n/**\n * Element-wise natural logarithm (ln)\n * @param x - Input array\n * @returns Array of log values\n */\nexport function log(x: NDArray): NDArray {\n return x.log();\n}\n\n/**\n * Element-wise base-2 logarithm\n * @param x - Input array\n * @returns Array of log2 values\n */\nexport function log2(x: NDArray): NDArray {\n return x.log2();\n}\n\n/**\n * Element-wise base-10 logarithm\n * @param x - Input array\n * @returns Array of log10 values\n */\nexport function log10(x: NDArray): NDArray {\n return x.log10();\n}\n\n/**\n * Element-wise natural logarithm of (1 + x)\n * More accurate than log(1 + x) for small x\n * @param x - Input array\n * @returns Array of log1p values\n */\nexport function log1p(x: NDArray): NDArray {\n return x.log1p();\n}\n\n/**\n * Logarithm of the sum of exponentials: log(exp(x1) + exp(x2))\n * More numerically stable than computing the expression directly\n * @param x1 - First input array\n * @param x2 - Second input array or scalar\n * @returns Array of logaddexp values\n */\nexport function logaddexp(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.logaddexp(x2);\n}\n\n/**\n * Logarithm base 2 of the sum of exponentials: log2(2^x1 + 2^x2)\n * More numerically stable than computing the expression directly\n * @param x1 - First input array\n * @param x2 - Second input array or scalar\n * @returns Array of logaddexp2 values\n */\nexport function logaddexp2(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.logaddexp2(x2);\n}\n\n/**\n * Element-wise absolute value\n * @param x - Input array\n * @returns Array of absolute values\n */\nexport function absolute(x: NDArray): NDArray {\n return x.absolute();\n}\n\n/**\n * Element-wise negation\n * @param x - Input array\n * @returns Array of negated values\n */\nexport function negative(x: NDArray): NDArray {\n return x.negative();\n}\n\n/**\n * Element-wise sign (-1, 0, or 1)\n * @param x - Input array\n * @returns Array of signs\n */\nexport function sign(x: NDArray): NDArray {\n return x.sign();\n}\n\n/**\n * Element-wise modulo\n * @param x - Dividend array\n * @param divisor - Divisor (array or scalar)\n * @returns Remainder after division\n */\nexport function mod(x: NDArray, divisor: NDArray | number): NDArray {\n return x.mod(divisor);\n}\n\n/**\n * Element-wise floor division\n * @param x - Dividend array\n * @param divisor - Divisor (array or scalar)\n * @returns Floor of the quotient\n */\nexport function floor_divide(x: NDArray, divisor: NDArray | number): NDArray {\n return x.floor_divide(divisor);\n}\n\n/**\n * Element-wise positive (unary +)\n * @param x - Input array\n * @returns Copy of the array\n */\nexport function positive(x: NDArray): NDArray {\n return x.positive();\n}\n\n/**\n * Element-wise reciprocal (1/x)\n * @param x - Input array\n * @returns Array of reciprocals\n */\nexport function reciprocal(x: NDArray): NDArray {\n return x.reciprocal();\n}\n\n/**\n * Dot product of two arrays\n *\n * Fully NumPy-compatible. Behavior depends on input dimensions:\n * - 0D \u00B7 0D: Multiply scalars \u2192 scalar\n * - 0D \u00B7 ND or ND \u00B7 0D: Element-wise multiply \u2192 ND\n * - 1D \u00B7 1D: Inner product \u2192 scalar\n * - 2D \u00B7 2D: Matrix multiplication \u2192 2D\n * - 2D \u00B7 1D: Matrix-vector product \u2192 1D\n * - 1D \u00B7 2D: Vector-matrix product \u2192 1D\n * - ND \u00B7 1D (N>2): Sum over last axis \u2192 (N-1)D\n * - 1D \u00B7 ND (N>2): Sum over first axis \u2192 (N-1)D\n * - ND \u00B7 MD (N,M\u22652): Tensor contraction \u2192 (N+M-2)D\n *\n * @param a - First array\n * @param b - Second array\n * @returns Result of dot product\n */\nexport function dot(a: NDArray, b: NDArray): NDArray | number | bigint {\n return a.dot(b);\n}\n\n/**\n * Sum of diagonal elements\n *\n * @param a - Input 2D array\n * @returns Sum of diagonal elements\n */\nexport function trace(a: NDArray): number | bigint {\n return a.trace();\n}\n\n/**\n * Extract a diagonal from a matrix or N-D array\n *\n * @param a - Input array (must be at least 2D)\n * @param offset - Offset of the diagonal from the main diagonal (default: 0)\n * @param axis1 - First axis (default: 0)\n * @param axis2 - Second axis (default: 1)\n * @returns Array containing the diagonal elements\n */\nexport function diagonal(\n a: NDArray,\n offset: number = 0,\n axis1: number = 0,\n axis2: number = 1\n): NDArray {\n const resultStorage = linalgOps.diagonal(a.storage, offset, axis1, axis2);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Kronecker product of two arrays\n *\n * @param a - First input array\n * @param b - Second input array\n * @returns Kronecker product of a and b\n */\nexport function kron(a: NDArray, b: NDArray): NDArray {\n const resultStorage = linalgOps.kron(a.storage, b.storage);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Permute array dimensions\n *\n * @param a - Input array\n * @param axes - Optional permutation of axes (defaults to reverse order)\n * @returns Transposed view\n */\nexport function transpose(a: NDArray, axes?: number[]): NDArray {\n return a.transpose(axes);\n}\n\n/**\n * Inner product of two arrays\n *\n * Contracts over last axes of both arrays.\n * Result shape: (*a.shape[:-1], *b.shape[:-1])\n *\n * @param a - First array\n * @param b - Second array\n * @returns Inner product result\n */\nexport function inner(a: NDArray, b: NDArray): NDArray | number | bigint {\n return a.inner(b);\n}\n\n/**\n * Outer product of two arrays\n *\n * Flattens inputs then computes result[i,j] = a[i] * b[j]\n *\n * @param a - First array\n * @param b - Second array\n * @returns 2D outer product matrix\n */\nexport function outer(a: NDArray, b: NDArray): NDArray {\n return a.outer(b);\n}\n\n/**\n * Tensor dot product along specified axes\n *\n * @param a - First array\n * @param b - Second array\n * @param axes - Axes to contract (integer or [a_axes, b_axes])\n * @returns Tensor dot product\n */\nexport function tensordot(\n a: NDArray,\n b: NDArray,\n axes: number | [number[], number[]] = 2\n): NDArray | number | bigint {\n return a.tensordot(b, axes);\n}\n\n// Trigonometric functions (standalone)\n\n/**\n * Element-wise sine\n * @param x - Input array (angles in radians)\n * @returns Array of sine values\n */\nexport function sin(x: NDArray): NDArray {\n return x.sin();\n}\n\n/**\n * Element-wise cosine\n * @param x - Input array (angles in radians)\n * @returns Array of cosine values\n */\nexport function cos(x: NDArray): NDArray {\n return x.cos();\n}\n\n/**\n * Element-wise tangent\n * @param x - Input array (angles in radians)\n * @returns Array of tangent values\n */\nexport function tan(x: NDArray): NDArray {\n return x.tan();\n}\n\n/**\n * Element-wise inverse sine\n * @param x - Input array (values in range [-1, 1])\n * @returns Array of angles in radians\n */\nexport function arcsin(x: NDArray): NDArray {\n return x.arcsin();\n}\n\n/**\n * Element-wise inverse cosine\n * @param x - Input array (values in range [-1, 1])\n * @returns Array of angles in radians\n */\nexport function arccos(x: NDArray): NDArray {\n return x.arccos();\n}\n\n/**\n * Element-wise inverse tangent\n * @param x - Input array\n * @returns Array of angles in radians\n */\nexport function arctan(x: NDArray): NDArray {\n return x.arctan();\n}\n\n/**\n * Element-wise arc tangent of x1/x2 choosing the quadrant correctly\n * @param x1 - y-coordinates\n * @param x2 - x-coordinates (array or scalar)\n * @returns Angles in radians between -\u03C0 and \u03C0\n */\nexport function arctan2(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.arctan2(x2);\n}\n\n/**\n * Given the \"legs\" of a right triangle, return its hypotenuse\n * Equivalent to sqrt(x1**2 + x2**2), element-wise\n * @param x1 - First leg\n * @param x2 - Second leg (array or scalar)\n * @returns Hypotenuse values\n */\nexport function hypot(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.hypot(x2);\n}\n\n/**\n * Convert angles from radians to degrees\n * @param x - Input array (angles in radians)\n * @returns Angles in degrees\n */\nexport function degrees(x: NDArray): NDArray {\n return x.degrees();\n}\n\n/**\n * Convert angles from degrees to radians\n * @param x - Input array (angles in degrees)\n * @returns Angles in radians\n */\nexport function radians(x: NDArray): NDArray {\n return x.radians();\n}\n\n/**\n * Convert angles from degrees to radians (alias for radians)\n * @param x - Input array (angles in degrees)\n * @returns Angles in radians\n */\nexport function deg2rad(x: NDArray): NDArray {\n return x.radians();\n}\n\n/**\n * Convert angles from radians to degrees (alias for degrees)\n * @param x - Input array (angles in radians)\n * @returns Angles in degrees\n */\nexport function rad2deg(x: NDArray): NDArray {\n return x.degrees();\n}\n\n// Hyperbolic functions (standalone)\n\n/**\n * Element-wise hyperbolic sine\n * @param x - Input array\n * @returns Array of sinh values\n */\nexport function sinh(x: NDArray): NDArray {\n return x.sinh();\n}\n\n/**\n * Element-wise hyperbolic cosine\n * @param x - Input array\n * @returns Array of cosh values\n */\nexport function cosh(x: NDArray): NDArray {\n return x.cosh();\n}\n\n/**\n * Element-wise hyperbolic tangent\n * @param x - Input array\n * @returns Array of tanh values\n */\nexport function tanh(x: NDArray): NDArray {\n return x.tanh();\n}\n\n/**\n * Element-wise inverse hyperbolic sine\n * @param x - Input array\n * @returns Array of arcsinh values\n */\nexport function arcsinh(x: NDArray): NDArray {\n return x.arcsinh();\n}\n\n/**\n * Element-wise inverse hyperbolic cosine\n * @param x - Input array (values >= 1)\n * @returns Array of arccosh values\n */\nexport function arccosh(x: NDArray): NDArray {\n return x.arccosh();\n}\n\n/**\n * Element-wise inverse hyperbolic tangent\n * @param x - Input array (values in range (-1, 1))\n * @returns Array of arctanh values\n */\nexport function arctanh(x: NDArray): NDArray {\n return x.arctanh();\n}\n\n// ========================================\n// Array Manipulation Functions\n// ========================================\n\n/**\n * Swap two axes of an array\n *\n * @param a - Input array\n * @param axis1 - First axis\n * @param axis2 - Second axis\n * @returns View with axes swapped\n */\nexport function swapaxes(a: NDArray, axis1: number, axis2: number): NDArray {\n return a.swapaxes(axis1, axis2);\n}\n\n/**\n * Move axes to new positions\n *\n * @param a - Input array\n * @param source - Original positions of axes to move\n * @param destination - New positions for axes\n * @returns View with axes moved\n */\nexport function moveaxis(\n a: NDArray,\n source: number | number[],\n destination: number | number[]\n): NDArray {\n return a.moveaxis(source, destination);\n}\n\n/**\n * Concatenate arrays along an existing axis\n *\n * @param arrays - Arrays to concatenate\n * @param axis - Axis along which to concatenate (default: 0)\n * @returns Concatenated array\n */\nexport function concatenate(arrays: NDArray[], axis: number = 0): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to concatenate');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.concatenate(storages, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays along a new axis\n *\n * @param arrays - Arrays to stack (must have same shape)\n * @param axis - Axis in the result array along which to stack (default: 0)\n * @returns Stacked array\n */\nexport function stack(arrays: NDArray[], axis: number = 0): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.stack(storages, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays vertically (row-wise)\n *\n * @param arrays - Arrays to stack\n * @returns Vertically stacked array\n */\nexport function vstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.vstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays horizontally (column-wise)\n *\n * @param arrays - Arrays to stack\n * @returns Horizontally stacked array\n */\nexport function hstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.hstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays depth-wise (along third axis)\n *\n * @param arrays - Arrays to stack\n * @returns Depth-stacked array\n */\nexport function dstack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.dstack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Split array into multiple sub-arrays\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of equal sections or indices where to split\n * @param axis - Axis along which to split (default: 0)\n * @returns List of sub-arrays\n */\nexport function split(\n a: NDArray,\n indicesOrSections: number | number[],\n axis: number = 0\n): NDArray[] {\n const storages = shapeOps.split(a.storage, indicesOrSections, axis);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array into multiple sub-arrays (allows unequal splits)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @param axis - Axis along which to split (default: 0)\n * @returns List of sub-arrays\n */\nexport function array_split(\n a: NDArray,\n indicesOrSections: number | number[],\n axis: number = 0\n): NDArray[] {\n const storages = shapeOps.arraySplit(a.storage, indicesOrSections, axis);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array vertically (row-wise)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function vsplit(a: NDArray, indicesOrSections: number | number[]): NDArray[] {\n const storages = shapeOps.vsplit(a.storage, indicesOrSections);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Split array horizontally (column-wise)\n *\n * @param a - Array to split\n * @param indicesOrSections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function hsplit(a: NDArray, indicesOrSections: number | number[]): NDArray[] {\n const storages = shapeOps.hsplit(a.storage, indicesOrSections);\n return storages.map((s) => NDArray._fromStorage(s, a.base ?? a));\n}\n\n/**\n * Tile array by repeating along each axis\n *\n * @param a - Input array\n * @param reps - Number of repetitions along each axis\n * @returns Tiled array\n */\nexport function tile(a: NDArray, reps: number | number[]): NDArray {\n const resultStorage = shapeOps.tile(a.storage, reps);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Repeat elements of an array\n *\n * @param a - Input array\n * @param repeats - Number of repetitions for each element\n * @param axis - Axis along which to repeat (if undefined, flattens first)\n * @returns Array with repeated elements\n */\nexport function repeat(a: NDArray, repeats: number | number[], axis?: number): NDArray {\n return a.repeat(repeats, axis);\n}\n\n/**\n * Return a contiguous flattened array\n *\n * @param a - Input array\n * @returns Flattened 1-D array (view if possible)\n */\nexport function ravel(a: NDArray): NDArray {\n return a.ravel();\n}\n\n/**\n * Reshape array to new shape\n *\n * @param a - Input array\n * @param newShape - New shape\n * @returns Reshaped array (view if possible)\n */\nexport function reshape(a: NDArray, newShape: number[]): NDArray {\n return a.reshape(...newShape);\n}\n\n/**\n * Remove axes of length 1\n *\n * @param a - Input array\n * @param axis - Axis to squeeze (optional, squeezes all if not specified)\n * @returns Squeezed array (view)\n */\nexport function squeeze(a: NDArray, axis?: number): NDArray {\n return a.squeeze(axis);\n}\n\n/**\n * Expand the shape of an array by inserting a new axis\n *\n * @param a - Input array\n * @param axis - Position where new axis should be inserted\n * @returns Array with expanded shape (view)\n */\nexport function expand_dims(a: NDArray, axis: number): NDArray {\n return a.expand_dims(axis);\n}\n\n/**\n * Reverse the order of elements along the given axis\n *\n * @param m - Input array\n * @param axis - Axis or axes to flip (flips all if undefined)\n * @returns Flipped array\n */\nexport function flip(m: NDArray, axis?: number | number[]): NDArray {\n const resultStorage = shapeOps.flip(m.storage, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Flip array in the left/right direction (reverse along axis 1)\n *\n * @param m - Input array (must be at least 2-D)\n * @returns Flipped array\n */\nexport function fliplr(m: NDArray): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n return flip(m, 1);\n}\n\n/**\n * Flip array in the up/down direction (reverse along axis 0)\n *\n * @param m - Input array (must be at least 2-D)\n * @returns Flipped array\n */\nexport function flipud(m: NDArray): NDArray {\n if (m.ndim < 2) {\n throw new Error('Input must be at least 2-D');\n }\n return flip(m, 0);\n}\n\n/**\n * Rotate array by 90 degrees\n *\n * @param m - Input array\n * @param k - Number of times to rotate (default 1)\n * @param axes - The axes to rotate in (default [0, 1])\n * @returns Rotated array\n */\nexport function rot90(m: NDArray, k: number = 1, axes: [number, number] = [0, 1]): NDArray {\n const resultStorage = shapeOps.rot90(m.storage, k, axes);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Roll array elements along a given axis\n *\n * @param a - Input array\n * @param shift - Number of positions to shift\n * @param axis - Axis along which to roll (rolls flattened array if undefined)\n * @returns Rolled array\n */\nexport function roll(a: NDArray, shift: number | number[], axis?: number | number[]): NDArray {\n const resultStorage = shapeOps.roll(a.storage, shift, axis);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Roll the specified axis backwards until it lies in a given position\n *\n * @param a - Input array\n * @param axis - The axis to roll backwards\n * @param start - Position to roll to (default 0)\n * @returns Array with rolled axis (view)\n */\nexport function rollaxis(a: NDArray, axis: number, start: number = 0): NDArray {\n const resultStorage = shapeOps.rollaxis(a.storage, axis, start);\n return NDArray._fromStorage(resultStorage, a.base ?? a);\n}\n\n/**\n * Convert inputs to arrays with at least 1 dimension\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 1 dimension\n */\nexport function atleast_1d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast1d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Convert inputs to arrays with at least 2 dimensions\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 2 dimensions\n */\nexport function atleast_2d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast2d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Convert inputs to arrays with at least 3 dimensions\n *\n * @param arrays - Input arrays\n * @returns Arrays with at least 3 dimensions\n */\nexport function atleast_3d(...arrays: NDArray[]): NDArray | NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = shapeOps.atleast3d(storages);\n const results = resultStorages.map((s, i) => {\n if (s === storages[i]) {\n return arrays[i]!;\n }\n return NDArray._fromStorage(s);\n });\n return results.length === 1 ? results[0]! : results;\n}\n\n/**\n * Split array along third axis (depth)\n *\n * @param ary - Input array (must be at least 3-D)\n * @param indices_or_sections - Number of sections or indices where to split\n * @returns List of sub-arrays\n */\nexport function dsplit(ary: NDArray, indices_or_sections: number | number[]): NDArray[] {\n const storages = shapeOps.dsplit(ary.storage, indices_or_sections);\n return storages.map((s) => NDArray._fromStorage(s, ary.base ?? ary));\n}\n\n/**\n * Stack 1-D arrays as columns into a 2-D array\n *\n * @param arrays - 1-D arrays to stack\n * @returns 2-D array with inputs as columns\n */\nexport function column_stack(arrays: NDArray[]): NDArray {\n if (arrays.length === 0) {\n throw new Error('need at least one array to stack');\n }\n const storages = arrays.map((a) => a.storage);\n const resultStorage = shapeOps.columnStack(storages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Stack arrays in sequence vertically (alias for vstack)\n *\n * @param arrays - Arrays to stack\n * @returns Vertically stacked array\n */\nexport function row_stack(arrays: NDArray[]): NDArray {\n return vstack(arrays);\n}\n\n/**\n * Return a new array with the given shape (repeating data if needed)\n *\n * @param a - Input array\n * @param new_shape - New shape\n * @returns Resized array\n */\nexport function resize(a: NDArray, new_shape: number[]): NDArray {\n const resultStorage = shapeOps.resize(a.storage, new_shape);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Append values to the end of an array\n *\n * @param arr - Input array\n * @param values - Values to append\n * @param axis - Axis along which to append (flattens if undefined)\n * @returns Array with values appended\n */\nexport function append(\n arr: NDArray,\n values: NDArray | ArrayLike<number | bigint> | number,\n axis?: number\n): NDArray {\n // Convert values to NDArray if needed\n const valArray =\n values instanceof NDArray\n ? values\n : array(values as ArrayLike<number | bigint> | number, arr.dtype as DType);\n\n if (axis === undefined) {\n // Flatten both and concatenate\n const flatArr = arr.flatten();\n const flatValues = valArray.flatten();\n return concatenate([flatArr, flatValues]);\n }\n\n // Concatenate along specified axis\n return concatenate([arr, valArray], axis);\n}\n\n/**\n * Return a new array with sub-arrays along an axis deleted\n *\n * @param arr - Input array\n * @param obj - Indices to delete\n * @param axis - Axis along which to delete (flattens if undefined)\n * @returns Array with elements deleted\n */\n\nexport function delete_(arr: NDArray, obj: number | number[], axis?: number): NDArray {\n const dtype = arr.dtype as DType;\n\n if (axis === undefined) {\n // Delete from flattened array\n const flat = arr.flatten();\n const indices = Array.isArray(obj) ? obj : [obj];\n const normalizedIndices = indices.map((i) => (i < 0 ? flat.size + i : i));\n const keepIndices: number[] = [];\n\n for (let i = 0; i < flat.size; i++) {\n if (!normalizedIndices.includes(i)) {\n keepIndices.push(i);\n }\n }\n\n const Constructor = getTypedArrayConstructor(dtype);\n const data = new Constructor!(keepIndices.length);\n\n for (let i = 0; i < keepIndices.length; i++) {\n const val = flat.get([keepIndices[i]!]);\n if (isBigIntDType(dtype)) {\n (data as BigInt64Array | BigUint64Array)[i] =\n typeof val === 'bigint' ? val : BigInt(val as number);\n } else {\n (data as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = val as number;\n }\n }\n\n const storage = ArrayStorage.fromData(data, [keepIndices.length], dtype);\n return new NDArray(storage);\n }\n\n // Delete along specified axis\n const shape = arr.shape;\n const ndim = shape.length;\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const indices = Array.isArray(obj) ? obj : [obj];\n const normalizedIndices = new Set(indices.map((i) => (i < 0 ? axisSize + i : i)));\n\n // Build slices to keep\n const keepRanges: [number, number][] = [];\n let start = 0;\n\n for (let i = 0; i <= axisSize; i++) {\n if (normalizedIndices.has(i) || i === axisSize) {\n if (i > start) {\n keepRanges.push([start, i]);\n }\n start = i + 1;\n }\n }\n\n if (keepRanges.length === 0) {\n // Delete all elements along this axis\n const newShape = [...shape];\n newShape[normalizedAxis] = 0;\n return zeros(newShape, dtype);\n }\n\n // Split and concatenate the kept parts\n const parts: NDArray[] = [];\n for (const [rangeStart, rangeEnd] of keepRanges) {\n // Create a slice for this range\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `${rangeStart}:${rangeEnd}`;\n parts.push(arr.slice(...slices));\n }\n\n return concatenate(parts, normalizedAxis);\n}\n\n/**\n * Insert values along the given axis before the given indices\n *\n * @param arr - Input array\n * @param obj - Index before which to insert\n * @param values - Values to insert\n * @param axis - Axis along which to insert (flattens if undefined)\n * @returns Array with values inserted\n */\nexport function insert(\n arr: NDArray,\n obj: number,\n values: NDArray | ArrayLike<number | bigint> | number,\n axis?: number\n): NDArray {\n // Convert values to NDArray if needed\n const valArray =\n values instanceof NDArray\n ? values\n : array(values as ArrayLike<number | bigint> | number, arr.dtype as DType);\n\n if (axis === undefined) {\n // Insert into flattened array\n const flat = arr.flatten();\n const flatValues = valArray.flatten();\n const idx = obj < 0 ? flat.size + obj : obj;\n\n if (idx < 0 || idx > flat.size) {\n throw new Error(`index ${obj} is out of bounds for array of size ${flat.size}`);\n }\n\n const before = idx > 0 ? flat.slice(`0:${idx}`) : null;\n const after = idx < flat.size ? flat.slice(`${idx}:`) : null;\n\n const parts: NDArray[] = [];\n if (before) parts.push(before);\n parts.push(flatValues);\n if (after) parts.push(after);\n\n return concatenate(parts);\n }\n\n // Insert along specified axis\n const shape = arr.shape;\n const ndim = shape.length;\n const normalizedAxis = axis < 0 ? ndim + axis : axis;\n\n if (normalizedAxis < 0 || normalizedAxis >= ndim) {\n throw new Error(`axis ${axis} is out of bounds for array of dimension ${ndim}`);\n }\n\n const axisSize = shape[normalizedAxis]!;\n const idx = obj < 0 ? axisSize + obj : obj;\n\n if (idx < 0 || idx > axisSize) {\n throw new Error(`index ${obj} is out of bounds for axis ${axis} with size ${axisSize}`);\n }\n\n const parts: NDArray[] = [];\n\n if (idx > 0) {\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `0:${idx}`;\n parts.push(arr.slice(...slices));\n }\n\n parts.push(valArray);\n\n if (idx < axisSize) {\n const slices: string[] = shape.map(() => ':');\n slices[normalizedAxis] = `${idx}:`;\n parts.push(arr.slice(...slices));\n }\n\n return concatenate(parts, normalizedAxis);\n}\n\n/**\n * Pad an array\n *\n * @param array - Input array\n * @param pad_width - Number of values padded to edges of each axis\n * @param mode - Padding mode ('constant', 'edge', 'reflect', 'symmetric', 'wrap')\n * @param constant_values - Value for constant padding (default 0)\n * @returns Padded array\n */\nexport function pad(\n arr: NDArray,\n pad_width: number | [number, number] | Array<[number, number]>,\n mode: 'constant' | 'edge' | 'reflect' | 'symmetric' | 'wrap' = 'constant',\n constant_values: number = 0\n): NDArray {\n const shape = arr.shape;\n const ndim = shape.length;\n const dtype = arr.dtype as DType;\n\n // Normalize pad_width to [[before, after], ...] for each axis\n let padWidths: Array<[number, number]>;\n if (typeof pad_width === 'number') {\n padWidths = shape.map(() => [pad_width, pad_width] as [number, number]);\n } else if (Array.isArray(pad_width) && typeof pad_width[0] === 'number') {\n // Single [before, after] pair for all axes\n padWidths = shape.map(() => pad_width as [number, number]);\n } else {\n padWidths = pad_width as Array<[number, number]>;\n }\n\n if (padWidths.length !== ndim) {\n throw new Error(`pad_width must have ${ndim} elements`);\n }\n\n // Calculate new shape\n const newShape = shape.map((s, i) => s + padWidths[i]![0] + padWidths[i]![1]);\n const newSize = newShape.reduce((a, b) => a * b, 1);\n\n const Constructor = getTypedArrayConstructor(dtype);\n const outputData = new Constructor!(newSize);\n const isBigInt = isBigIntDType(dtype);\n\n // Initialize with constant value for constant mode\n if (mode === 'constant') {\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array).fill(BigInt(constant_values));\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>).fill(constant_values);\n }\n }\n\n // Copy original data to center\n const outputIndices = new Array(ndim).fill(0);\n\n for (let i = 0; i < newSize; i++) {\n // Check if this position is in the original data region\n let inOriginal = true;\n const sourceIndices: number[] = [];\n\n for (let d = 0; d < ndim; d++) {\n const [padBefore] = padWidths[d]!;\n const srcIdx = outputIndices[d]! - padBefore;\n if (srcIdx < 0 || srcIdx >= shape[d]!) {\n inOriginal = false;\n break;\n }\n sourceIndices.push(srcIdx);\n }\n\n let value: number | bigint;\n\n if (inOriginal) {\n // Get from original array\n value = arr.get(sourceIndices) as number | bigint;\n } else if (mode === 'constant') {\n // Already filled with constant\n // Increment indices and continue\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < newShape[d]!) break;\n outputIndices[d] = 0;\n }\n continue;\n } else {\n // Calculate source index based on mode\n const mappedIndices: number[] = [];\n for (let d = 0; d < ndim; d++) {\n const [padBefore] = padWidths[d]!;\n let srcIdx = outputIndices[d]! - padBefore;\n const axisSize = shape[d]!;\n\n if (srcIdx < 0) {\n if (mode === 'edge') {\n srcIdx = 0;\n } else if (mode === 'reflect') {\n srcIdx = -srcIdx;\n if (srcIdx >= axisSize) srcIdx = axisSize - 1;\n } else if (mode === 'symmetric') {\n srcIdx = -srcIdx - 1;\n if (srcIdx >= axisSize) srcIdx = axisSize - 1;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'wrap') {\n srcIdx = ((srcIdx % axisSize) + axisSize) % axisSize;\n }\n } else if (srcIdx >= axisSize) {\n if (mode === 'edge') {\n srcIdx = axisSize - 1;\n } else if (mode === 'reflect') {\n srcIdx = 2 * axisSize - srcIdx - 2;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'symmetric') {\n srcIdx = 2 * axisSize - srcIdx - 1;\n if (srcIdx < 0) srcIdx = 0;\n } else if (mode === 'wrap') {\n srcIdx = srcIdx % axisSize;\n }\n }\n\n mappedIndices.push(Math.max(0, Math.min(axisSize - 1, srcIdx)));\n }\n value = arr.get(mappedIndices) as number | bigint;\n }\n\n // Write to output\n if (isBigInt) {\n (outputData as BigInt64Array | BigUint64Array)[i] =\n typeof value === 'bigint' ? value : BigInt(Number(value));\n } else {\n (outputData as Exclude<TypedArray, BigInt64Array | BigUint64Array>)[i] = Number(value);\n }\n\n // Increment indices\n for (let d = ndim - 1; d >= 0; d--) {\n outputIndices[d]++;\n if (outputIndices[d]! < newShape[d]!) break;\n outputIndices[d] = 0;\n }\n }\n\n const storage = ArrayStorage.fromData(outputData, newShape, dtype);\n return new NDArray(storage);\n}\n\n// ========================================\n// Advanced Functions\n// ========================================\n\n/**\n * Broadcast an array to a given shape\n *\n * @param a - Input array\n * @param shape - Target shape\n * @returns View broadcast to target shape\n */\nexport function broadcast_to(a: NDArray, shape: number[]): NDArray {\n const resultStorage = advancedOps.broadcast_to(a.storage, shape);\n return NDArray._fromStorage(resultStorage, a.base ?? a);\n}\n\n/**\n * Broadcast arrays to a common shape\n *\n * @param arrays - Arrays to broadcast\n * @returns Arrays broadcast to common shape\n */\nexport function broadcast_arrays(...arrays: NDArray[]): NDArray[] {\n const storages = arrays.map((a) => a.storage);\n const resultStorages = advancedOps.broadcast_arrays(storages);\n return resultStorages.map((s, i) => NDArray._fromStorage(s, arrays[i]!.base ?? arrays[i]!));\n}\n\n/**\n * Compute the broadcast shape for multiple shapes\n *\n * Returns the resulting shape if all shapes are broadcast-compatible.\n * Throws an error if shapes are not broadcast-compatible.\n *\n * @param shapes - Variable number of shapes to broadcast\n * @returns The broadcast output shape\n * @throws Error if shapes are not broadcast-compatible\n */\nexport function broadcast_shapes(...shapes: number[][]): number[] {\n return advancedOps.broadcast_shapes(...shapes);\n}\n\n/**\n * Take elements from an array along an axis\n *\n * @param a - Input array\n * @param indices - Indices of elements to take\n * @param axis - Axis along which to take (if undefined, flattens first)\n * @returns Array with selected elements\n */\nexport function take(a: NDArray, indices: number[], axis?: number): NDArray {\n return a.take(indices, axis);\n}\n\n/**\n * Put values at specified indices (modifies array in-place)\n *\n * @param a - Target array\n * @param indices - Indices at which to place values\n * @param values - Values to put\n */\nexport function put(a: NDArray, indices: number[], values: NDArray | number | bigint): void {\n a.put(indices, values);\n}\n\n/**\n * Construct array from index array and choices\n *\n * @param a - Index array (integer indices into choices)\n * @param choices - Arrays to choose from\n * @returns Array constructed from choices\n */\nexport function choose(a: NDArray, choices: NDArray[]): NDArray {\n const choiceStorages = choices.map((c) => c.storage);\n const resultStorage = advancedOps.choose(a.storage, choiceStorages);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Check if two arrays are element-wise equal\n *\n * @param a - First array\n * @param b - Second array\n * @param equal_nan - Whether to consider NaN equal to NaN (default: false)\n * @returns True if arrays are equal element-wise\n */\nexport function array_equal(a: NDArray, b: NDArray, equal_nan: boolean = false): boolean {\n return advancedOps.array_equal(a.storage, b.storage, equal_nan);\n}\n\n/**\n * Returns True if two arrays are element-wise equal within a tolerance.\n * Unlike array_equal, this function broadcasts the arrays before comparison.\n *\n * @param a1 - First input array\n * @param a2 - Second input array\n * @returns True if arrays are equivalent (after broadcasting)\n */\nexport function array_equiv(a1: NDArray, a2: NDArray): boolean {\n return comparisonOps.arrayEquiv(a1.storage, a2.storage);\n}\n\n// ============================================================================\n// Top-level Reduction Functions\n// ============================================================================\n\n/**\n * Return the cumulative sum of the elements along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, flattened array is used.\n * @returns Array with cumulative sums\n */\nexport function cumsum(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumsum(a.storage, axis));\n}\n\n/**\n * Return the cumulative product of the elements along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, flattened array is used.\n * @returns Array with cumulative products\n */\nexport function cumprod(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.cumprod(a.storage, axis));\n}\n\n/**\n * Peak to peak (maximum - minimum) value along a given axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Peak to peak value(s)\n */\nexport function ptp(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.ptp(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the median along the specified axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median value(s)\n */\nexport function median(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.median(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the q-th percentile of the data along the specified axis.\n * @param a - Input array\n * @param q - Percentile (0-100)\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Percentile value(s)\n */\nexport function percentile(\n a: NDArray,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.percentile(a.storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the q-th quantile of the data along the specified axis.\n * @param a - Input array\n * @param q - Quantile (0-1)\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Quantile value(s)\n */\nexport function quantile(\n a: NDArray,\n q: number,\n axis?: number,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.quantile(a.storage, q, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the weighted average along the specified axis.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param weights - Array of weights (must be same shape as array along specified axis)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Weighted average value(s)\n */\nexport function average(\n a: NDArray,\n axis?: number,\n weights?: NDArray,\n keepdims: boolean = false\n): NDArray | number {\n const weightsStorage = weights ? weights.storage : undefined;\n const result = reductionOps.average(a.storage, axis, weightsStorage, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n// ============================================================================\n// NaN-aware Reduction Functions\n// ============================================================================\n\n/**\n * Return the sum of array elements over a given axis, treating NaNs as zero.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Sum value(s)\n */\nexport function nansum(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nansum(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return the product of array elements over a given axis, treating NaNs as one.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Product value(s)\n */\nexport function nanprod(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanprod(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the arithmetic mean along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Mean value(s)\n */\nexport function nanmean(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmean(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the variance along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param ddof - Delta degrees of freedom (default 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Variance value(s)\n */\nexport function nanvar(\n a: NDArray,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.nanvar(a.storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Compute the standard deviation along the specified axis, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param ddof - Delta degrees of freedom (default 0)\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Standard deviation value(s)\n */\nexport function nanstd(\n a: NDArray,\n axis?: number,\n ddof: number = 0,\n keepdims: boolean = false\n): NDArray | number {\n const result = reductionOps.nanstd(a.storage, axis, ddof, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return minimum of an array, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Minimum value(s)\n */\nexport function nanmin(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmin(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return maximum of an array, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Maximum value(s)\n */\nexport function nanmax(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmax(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return indices of the minimum value, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Index/indices of minimum value(s)\n */\nexport function nanargmin(a: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.nanargmin(a.storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return indices of the maximum value, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Index/indices of maximum value(s)\n */\nexport function nanargmax(a: NDArray, axis?: number): NDArray | number {\n const result = reductionOps.nanargmax(a.storage, axis);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n/**\n * Return cumulative sum of elements, treating NaNs as zero.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Array with cumulative sums\n */\nexport function nancumsum(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumsum(a.storage, axis));\n}\n\n/**\n * Return cumulative product of elements, treating NaNs as one.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use flattened array.\n * @returns Array with cumulative products\n */\nexport function nancumprod(a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(reductionOps.nancumprod(a.storage, axis));\n}\n\n/**\n * Compute the median, ignoring NaNs.\n * @param a - Input array\n * @param axis - Axis along which to compute. If undefined, use all elements.\n * @param keepdims - If true, reduced axes are left as dimensions with size 1\n * @returns Median value(s)\n */\nexport function nanmedian(a: NDArray, axis?: number, keepdims: boolean = false): NDArray | number {\n const result = reductionOps.nanmedian(a.storage, axis, keepdims);\n return typeof result === 'number' ? result : NDArray._fromStorage(result);\n}\n\n// ========================================\n// Arithmetic Functions (Additional)\n// ========================================\n\n/**\n * Element-wise cube root\n *\n * @param x - Input array\n * @returns Array with cube root of each element\n */\nexport function cbrt(x: NDArray): NDArray {\n return x.cbrt();\n}\n\n/**\n * Element-wise absolute value (always returns float)\n *\n * @param x - Input array\n * @returns Array with absolute values as float\n */\nexport function fabs(x: NDArray): NDArray {\n return x.fabs();\n}\n\n/**\n * Returns both quotient and remainder (floor divide and modulo)\n *\n * @param x - Dividend array\n * @param y - Divisor (array or scalar)\n * @returns Tuple of [quotient, remainder] arrays\n */\nexport function divmod(x: NDArray, y: NDArray | number): [NDArray, NDArray] {\n return x.divmod(y);\n}\n\n/**\n * Element-wise square (x**2)\n *\n * @param x - Input array\n * @returns Array with squared values\n */\nexport function square(x: NDArray): NDArray {\n return x.square();\n}\n\n/**\n * Element-wise remainder (same as mod)\n *\n * @param x - Dividend array\n * @param y - Divisor (array or scalar)\n * @returns Array with remainder values\n */\nexport function remainder(x: NDArray, y: NDArray | number): NDArray {\n return x.remainder(y);\n}\n\n/**\n * Heaviside step function\n *\n * @param x1 - Input array\n * @param x2 - Value to use when x1 is 0\n * @returns Array with heaviside values (0 if x1 < 0, x2 if x1 == 0, 1 if x1 > 0)\n */\nexport function heaviside(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.heaviside(x2);\n}\n\n// ========================================\n// Bitwise Functions\n// ========================================\n\n/**\n * Bitwise AND element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise AND\n */\nexport function bitwise_and(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_and(x2);\n}\n\n/**\n * Bitwise OR element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise OR\n */\nexport function bitwise_or(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_or(x2);\n}\n\n/**\n * Bitwise XOR element-wise\n *\n * @param x1 - First input array (must be integer type)\n * @param x2 - Second input array or scalar (must be integer type)\n * @returns Result of bitwise XOR\n */\nexport function bitwise_xor(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.bitwise_xor(x2);\n}\n\n/**\n * Bitwise NOT (inversion) element-wise\n *\n * @param x - Input array (must be integer type)\n * @returns Result of bitwise NOT\n */\nexport function bitwise_not(x: NDArray): NDArray {\n return x.bitwise_not();\n}\n\n/**\n * Invert (bitwise NOT) element-wise\n * Alias for bitwise_not\n *\n * @param x - Input array (must be integer type)\n * @returns Result of bitwise inversion\n */\nexport function invert(x: NDArray): NDArray {\n return x.invert();\n}\n\n/**\n * Left shift elements by positions\n *\n * @param x1 - Input array (must be integer type)\n * @param x2 - Shift amount (array or scalar)\n * @returns Result of left shift\n */\nexport function left_shift(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.left_shift(x2);\n}\n\n/**\n * Right shift elements by positions\n *\n * @param x1 - Input array (must be integer type)\n * @param x2 - Shift amount (array or scalar)\n * @returns Result of right shift\n */\nexport function right_shift(x1: NDArray, x2: NDArray | number): NDArray {\n return x1.right_shift(x2);\n}\n\n/**\n * Pack binary values into uint8 array\n *\n * Packs the elements of a binary-valued array into bits in a uint8 array.\n *\n * @param a - Input array (values are interpreted as binary: 0 or non-zero)\n * @param axis - The dimension over which bit-packing is done (default: -1)\n * @param bitorder - Order of bits: 'big' or 'little' (default: 'big')\n * @returns Packed uint8 array\n */\nexport function packbits(\n a: NDArray,\n axis: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): NDArray {\n const resultStorage = bitwiseOps.packbits(a.storage, axis, bitorder);\n return NDArray._fromStorage(resultStorage);\n}\n\n/**\n * Unpack uint8 array into binary values\n *\n * Unpacks elements of a uint8 array into a binary-valued output array.\n *\n * @param a - Input uint8 array\n * @param axis - The dimension over which bit-unpacking is done (default: -1)\n * @param count - Number of elements to unpack, or -1 for all (default: -1)\n * @param bitorder - Order of bits: 'big' or 'little' (default: 'big')\n * @returns Unpacked uint8 array of 0s and 1s\n */\nexport function unpackbits(\n a: NDArray,\n axis: number = -1,\n count: number = -1,\n bitorder: 'big' | 'little' = 'big'\n): NDArray {\n const resultStorage = bitwiseOps.unpackbits(a.storage, axis, count, bitorder);\n return NDArray._fromStorage(resultStorage);\n}\n\n// ========================================\n// Linear Algebra Functions (Additional)\n// ========================================\n\n/**\n * Einstein summation convention\n *\n * Performs tensor contractions and reductions using Einstein notation.\n *\n * @param subscripts - Einstein summation subscripts (e.g., 'ij,jk->ik')\n * @param operands - Input arrays\n * @returns Result of the Einstein summation\n *\n * @example\n * // Matrix multiplication\n * einsum('ij,jk->ik', a, b)\n *\n * @example\n * // Inner product\n * einsum('i,i->', a, b)\n *\n * @example\n * // Trace\n * einsum('ii->', a)\n */\nexport function einsum(subscripts: string, ...operands: NDArray[]): NDArray | number | bigint {\n const storages = operands.map((op) => op.storage);\n const result = linalgOps.einsum(subscripts, ...storages);\n if (typeof result === 'number' || typeof result === 'bigint') {\n return result;\n }\n return NDArray._fromStorage(result);\n}\n\n// ============================================================================\n// numpy.linalg Module\n// ============================================================================\n\n/**\n * numpy.linalg module - Linear algebra functions\n */\nexport const linalg = {\n /**\n * Cross product of two vectors.\n */\n cross: (\n a: NDArray,\n b: NDArray,\n axisa: number = -1,\n axisb: number = -1,\n axisc: number = -1,\n axis?: number\n ): NDArray | number => {\n const result = linalgOps.cross(a.storage, b.storage, axisa, axisb, axisc, axis);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n },\n\n /**\n * Compute the norm of a vector or matrix.\n */\n norm: (\n x: NDArray,\n ord: number | 'fro' | 'nuc' | null = null,\n axis: number | [number, number] | null = null,\n keepdims: boolean = false\n ): NDArray | number => {\n const result = linalgOps.norm(x.storage, ord, axis, keepdims);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n },\n\n /**\n * Compute the vector norm.\n */\n vector_norm: (\n x: NDArray,\n ord: number = 2,\n axis?: number | null,\n keepdims: boolean = false\n ): NDArray | number => {\n const result = linalgOps.vector_norm(x.storage, ord, axis, keepdims);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n },\n\n /**\n * Compute the matrix norm.\n */\n matrix_norm: (\n x: NDArray,\n ord: number | 'fro' | 'nuc' = 'fro',\n keepdims: boolean = false\n ): NDArray | number => {\n const result = linalgOps.matrix_norm(x.storage, ord, keepdims);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n },\n\n /**\n * QR decomposition.\n */\n qr: (\n a: NDArray,\n mode: 'reduced' | 'complete' | 'r' | 'raw' = 'reduced'\n ): { q: NDArray; r: NDArray } | NDArray | { h: NDArray; tau: NDArray } => {\n const result = linalgOps.qr(a.storage, mode);\n if (result instanceof ArrayStorage) {\n // 'r' mode returns just R\n return NDArray._fromStorage(result);\n } else if ('q' in result && 'r' in result) {\n return {\n q: NDArray._fromStorage(result.q),\n r: NDArray._fromStorage(result.r),\n };\n } else {\n // 'raw' mode returns h and tau\n return {\n h: NDArray._fromStorage(result.h),\n tau: NDArray._fromStorage(result.tau),\n };\n }\n },\n\n /**\n * Cholesky decomposition.\n */\n cholesky: (a: NDArray, upper: boolean = false): NDArray => {\n return NDArray._fromStorage(linalgOps.cholesky(a.storage, upper));\n },\n\n /**\n * Singular Value Decomposition.\n */\n svd: (\n a: NDArray,\n full_matrices: boolean = true,\n compute_uv: boolean = true\n ): { u: NDArray; s: NDArray; vt: NDArray } | NDArray => {\n const result = linalgOps.svd(a.storage, full_matrices, compute_uv);\n if ('u' in result) {\n return {\n u: NDArray._fromStorage(result.u),\n s: NDArray._fromStorage(result.s),\n vt: NDArray._fromStorage(result.vt),\n };\n }\n return NDArray._fromStorage(result);\n },\n\n /**\n * Compute the determinant of a matrix.\n */\n det: (a: NDArray): number => {\n return linalgOps.det(a.storage);\n },\n\n /**\n * Compute the matrix inverse.\n */\n inv: (a: NDArray): NDArray => {\n return NDArray._fromStorage(linalgOps.inv(a.storage));\n },\n\n /**\n * Solve a linear system.\n */\n solve: (a: NDArray, b: NDArray): NDArray => {\n return NDArray._fromStorage(linalgOps.solve(a.storage, b.storage));\n },\n\n /**\n * Least-squares solution to a linear matrix equation.\n */\n lstsq: (\n a: NDArray,\n b: NDArray,\n rcond: number | null = null\n ): { x: NDArray; residuals: NDArray; rank: number; s: NDArray } => {\n const result = linalgOps.lstsq(a.storage, b.storage, rcond);\n return {\n x: NDArray._fromStorage(result.x),\n residuals: NDArray._fromStorage(result.residuals),\n rank: result.rank,\n s: NDArray._fromStorage(result.s),\n };\n },\n\n /**\n * Compute the condition number.\n */\n cond: (a: NDArray, p: number | 'fro' | 'nuc' = 2): number => {\n return linalgOps.cond(a.storage, p);\n },\n\n /**\n * Compute the matrix rank.\n */\n matrix_rank: (a: NDArray, tol?: number): number => {\n return linalgOps.matrix_rank(a.storage, tol);\n },\n\n /**\n * Raise a square matrix to an integer power.\n */\n matrix_power: (a: NDArray, n: number): NDArray => {\n return NDArray._fromStorage(linalgOps.matrix_power(a.storage, n));\n },\n\n /**\n * Compute the Moore-Penrose pseudo-inverse.\n */\n pinv: (a: NDArray, rcond: number = 1e-15): NDArray => {\n return NDArray._fromStorage(linalgOps.pinv(a.storage, rcond));\n },\n\n /**\n * Compute eigenvalues and eigenvectors.\n */\n eig: (a: NDArray): { w: NDArray; v: NDArray } => {\n const result = linalgOps.eig(a.storage);\n return {\n w: NDArray._fromStorage(result.w),\n v: NDArray._fromStorage(result.v),\n };\n },\n\n /**\n * Compute eigenvalues and eigenvectors of a Hermitian matrix.\n */\n eigh: (a: NDArray, UPLO: 'L' | 'U' = 'L'): { w: NDArray; v: NDArray } => {\n const result = linalgOps.eigh(a.storage, UPLO);\n return {\n w: NDArray._fromStorage(result.w),\n v: NDArray._fromStorage(result.v),\n };\n },\n\n /**\n * Compute eigenvalues of a matrix.\n */\n eigvals: (a: NDArray): NDArray => {\n return NDArray._fromStorage(linalgOps.eigvals(a.storage));\n },\n\n /**\n * Compute eigenvalues of a Hermitian matrix.\n */\n eigvalsh: (a: NDArray, UPLO: 'L' | 'U' = 'L'): NDArray => {\n return NDArray._fromStorage(linalgOps.eigvalsh(a.storage, UPLO));\n },\n};\n\n// ============================================================================\n// Indexing Functions\n// ============================================================================\n\n/**\n * Take values from the input array by matching 1d index and data slices along axis.\n *\n * @param arr - Input array\n * @param indices - Index array with same ndim as arr\n * @param axis - The axis along which to select values\n * @returns Array of values taken along the axis\n */\nexport function take_along_axis(arr: NDArray, indices: NDArray, axis: number): NDArray {\n return NDArray._fromStorage(advancedOps.take_along_axis(arr.storage, indices.storage, axis));\n}\n\n/**\n * Put values into the destination array using 1d index and data slices along axis.\n *\n * @param arr - Destination array (modified in-place)\n * @param indices - Index array with same ndim as arr\n * @param values - Values to put\n * @param axis - The axis along which to put values\n */\nexport function put_along_axis(\n arr: NDArray,\n indices: NDArray,\n values: NDArray,\n axis: number\n): void {\n advancedOps.put_along_axis(arr.storage, indices.storage, values.storage, axis);\n}\n\n/**\n * Change elements of array based on conditional mask.\n *\n * @param a - Array to modify (in-place)\n * @param mask - Boolean mask array\n * @param values - Values to put where mask is True\n */\nexport function putmask(a: NDArray, mask: NDArray, values: NDArray | number | bigint): void {\n const valuesArg = values instanceof NDArray ? values.storage : values;\n advancedOps.putmask(a.storage, mask.storage, valuesArg);\n}\n\n/**\n * Return selected slices of array along given axis.\n *\n * @param condition - Boolean array for selecting\n * @param a - Array from which to select\n * @param axis - Axis along which to select (if undefined, works on flattened array)\n * @returns Compressed array\n */\nexport function compress(condition: NDArray, a: NDArray, axis?: number): NDArray {\n return NDArray._fromStorage(advancedOps.compress(condition.storage, a.storage, axis));\n}\n\n/**\n * Return an array drawn from elements in choicelist, depending on conditions.\n *\n * @param condlist - List of boolean arrays (conditions)\n * @param choicelist - List of arrays to choose from\n * @param defaultVal - Default value when no condition is met (default 0)\n * @returns Array with selected values\n */\nexport function select(\n condlist: NDArray[],\n choicelist: NDArray[],\n defaultVal: number | bigint = 0\n): NDArray {\n const condStorages = condlist.map((c) => c.storage);\n const choiceStorages = choicelist.map((c) => c.storage);\n return NDArray._fromStorage(advancedOps.select(condStorages, choiceStorages, defaultVal));\n}\n\n/**\n * Change elements of an array based on conditional and input values.\n *\n * @param arr - Array to modify (in-place)\n * @param mask - Boolean mask array\n * @param vals - Values to place where mask is True (cycles if shorter)\n */\nexport function place(arr: NDArray, mask: NDArray, vals: NDArray): void {\n advancedOps.place(arr.storage, mask.storage, vals.storage);\n}\n\n/**\n * Return the indices to access the main diagonal of an array.\n *\n * @param n - Size of arrays for which indices are returned\n * @param ndim - Number of dimensions (default 2)\n * @returns Tuple of index arrays\n */\nexport function diag_indices(n: number, ndim: number = 2): NDArray[] {\n const storages = advancedOps.diag_indices(n, ndim);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices to access the main diagonal of an n-dimensional array.\n *\n * @param arr - Input array (must have all equal dimensions)\n * @returns Tuple of index arrays\n */\nexport function diag_indices_from(arr: NDArray): NDArray[] {\n const storages = advancedOps.diag_indices_from(arr.storage);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the lower-triangle of an (n, m) array.\n *\n * @param n - Number of rows\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @param m - Number of columns (default n)\n * @returns Tuple of row and column index arrays\n */\nexport function tril_indices(n: number, k: number = 0, m?: number): NDArray[] {\n const storages = advancedOps.tril_indices(n, k, m);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the lower-triangle of arr.\n *\n * @param arr - Input 2-D array\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @returns Tuple of row and column index arrays\n */\nexport function tril_indices_from(arr: NDArray, k: number = 0): NDArray[] {\n const storages = advancedOps.tril_indices_from(arr.storage, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the upper-triangle of an (n, m) array.\n *\n * @param n - Number of rows\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @param m - Number of columns (default n)\n * @returns Tuple of row and column index arrays\n */\nexport function triu_indices(n: number, k: number = 0, m?: number): NDArray[] {\n const storages = advancedOps.triu_indices(n, k, m);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices for the upper-triangle of arr.\n *\n * @param arr - Input 2-D array\n * @param k - Diagonal offset (0 = main, positive = above, negative = below)\n * @returns Tuple of row and column index arrays\n */\nexport function triu_indices_from(arr: NDArray, k: number = 0): NDArray[] {\n const storages = advancedOps.triu_indices_from(arr.storage, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return the indices to access (n, n) arrays, given a masking function.\n *\n * @param n - The returned indices will be valid to access arrays of shape (n, n)\n * @param mask_func - A function that generates an (n, n) boolean mask\n * @param k - Optional diagonal offset passed to mask_func\n * @returns Tuple of row and column index arrays\n */\nexport function mask_indices(\n n: number,\n mask_func: (n: number, k: number) => NDArray,\n k: number = 0\n): NDArray[] {\n // Wrap the function to work with storage\n const storageMaskFunc = (n: number, k: number) => mask_func(n, k).storage;\n const storages = advancedOps.mask_indices(n, storageMaskFunc, k);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return an array representing the indices of a grid.\n *\n * @param dimensions - The shape of the grid\n * @param dtype - Data type of result (default 'int32')\n * @returns Array of shape (len(dimensions), *dimensions)\n */\nexport function indices(\n dimensions: number[],\n dtype: 'int32' | 'int64' | 'float64' = 'int32'\n): NDArray {\n return NDArray._fromStorage(advancedOps.indices(dimensions, dtype));\n}\n\n/**\n * Construct an open mesh from multiple sequences.\n *\n * This function returns a list of arrays with shapes suitable for broadcasting.\n *\n * @param args - 1-D sequences\n * @returns Tuple of arrays for open mesh\n */\nexport function ix_(...args: NDArray[]): NDArray[] {\n const storages = advancedOps.ix_(...args.map((a) => a.storage));\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Convert a tuple of index arrays into an array of flat indices.\n *\n * @param multi_index - Tuple of index arrays\n * @param dims - Shape of array into which indices apply\n * @param mode - How to handle out-of-bounds indices ('raise', 'wrap', 'clip')\n * @returns Flattened indices\n */\nexport function ravel_multi_index(\n multi_index: NDArray[],\n dims: number[],\n mode: 'raise' | 'wrap' | 'clip' = 'raise'\n): NDArray {\n const storages = multi_index.map((a) => a.storage);\n return NDArray._fromStorage(advancedOps.ravel_multi_index(storages, dims, mode));\n}\n\n/**\n * Convert a flat index or array of flat indices into a tuple of coordinate arrays.\n *\n * @param indices - Array of indices or single index\n * @param shape - Shape of the array to index into\n * @param order - Row-major ('C') or column-major ('F') order\n * @returns Tuple of coordinate arrays\n */\nexport function unravel_index(\n indices: NDArray | number,\n shape: number[],\n order: 'C' | 'F' = 'C'\n): NDArray[] {\n const indicesArg = indices instanceof NDArray ? indices.storage : indices;\n const storages = advancedOps.unravel_index(indicesArg, shape, order);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n// ========================================\n// Sorting and Searching Functions\n// ========================================\n\n/**\n * Return a sorted copy of an array\n * @param a - Input array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Sorted array\n */\nexport function sort(a: NDArray, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.sort(a.storage, axis));\n}\n\n/**\n * Returns the indices that would sort an array\n * @param a - Input array\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices that sort the input array\n */\nexport function argsort(a: NDArray, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argsort(a.storage, axis));\n}\n\n/**\n * Perform an indirect stable sort using a sequence of keys\n * @param keys - Array of NDArrays, the last key is the primary sort key\n * @returns Array of indices that would sort the keys\n */\nexport function lexsort(keys: NDArray[]): NDArray {\n const storages = keys.map((k) => k.storage);\n return NDArray._fromStorage(sortingOps.lexsort(storages));\n}\n\n/**\n * Partially sort an array\n * @param a - Input array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Partitioned array\n */\nexport function partition(a: NDArray, kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.partition(a.storage, kth, axis));\n}\n\n/**\n * Returns indices that would partition an array\n * @param a - Input array\n * @param kth - Element index to partition by\n * @param axis - Axis along which to sort. Default is -1 (last axis)\n * @returns Array of indices\n */\nexport function argpartition(a: NDArray, kth: number, axis: number = -1): NDArray {\n return NDArray._fromStorage(sortingOps.argpartition(a.storage, kth, axis));\n}\n\n/**\n * Sort a complex array using the real part first, then the imaginary part\n * For real arrays, returns a sorted 1D array\n * @param a - Input array\n * @returns Sorted 1D array\n */\nexport function sort_complex(a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.sort_complex(a.storage));\n}\n\n/**\n * Return the indices of the elements that are non-zero\n * @param a - Input array\n * @returns Tuple of arrays, one for each dimension\n */\nexport function nonzero(a: NDArray): NDArray[] {\n const storages = sortingOps.nonzero(a.storage);\n return storages.map((s) => NDArray._fromStorage(s));\n}\n\n/**\n * Return indices of non-zero elements in flattened array\n * @param a - Input array\n * @returns Array of indices\n */\nexport function flatnonzero(a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.flatnonzero(a.storage));\n}\n\n/**\n * Return elements from x or y depending on condition\n * If only condition is given, returns indices where condition is true (like nonzero)\n * @param condition - Boolean array or condition\n * @param x - Values where condition is true (optional)\n * @param y - Values where condition is false (optional)\n * @returns Array with elements chosen from x or y, or indices if only condition given\n */\nexport function where(condition: NDArray, x?: NDArray, y?: NDArray): NDArray | NDArray[] {\n const result = sortingOps.where(condition.storage, x?.storage, y?.storage);\n if (Array.isArray(result)) {\n return result.map((s) => NDArray._fromStorage(s));\n }\n return NDArray._fromStorage(result);\n}\n\n/**\n * Find indices where elements should be inserted to maintain order\n * @param a - Input array (must be sorted in ascending order)\n * @param v - Values to insert\n * @param side - 'left' or 'right' side to insert\n * @returns Indices where values should be inserted\n */\nexport function searchsorted(a: NDArray, v: NDArray, side: 'left' | 'right' = 'left'): NDArray {\n return NDArray._fromStorage(sortingOps.searchsorted(a.storage, v.storage, side));\n}\n\n/**\n * Return the elements of an array that satisfy some condition\n * @param condition - Boolean array\n * @param a - Input array\n * @returns 1D array of elements where condition is true\n */\nexport function extract(condition: NDArray, a: NDArray): NDArray {\n return NDArray._fromStorage(sortingOps.extract(condition.storage, a.storage));\n}\n\n/**\n * Count number of non-zero values in the array\n * @param a - Input array\n * @param axis - Axis along which to count (optional)\n * @returns Count of non-zero values\n */\nexport function count_nonzero(a: NDArray, axis?: number): NDArray | number {\n const result = sortingOps.count_nonzero(a.storage, axis);\n if (typeof result === 'number') {\n return result;\n }\n return NDArray._fromStorage(result);\n}\n\n// ============================================================================\n// Rounding Functions\n// ============================================================================\n\n/**\n * Round an array to the given number of decimals\n * @param a - Input array\n * @param decimals - Number of decimal places to round to (default: 0)\n * @returns Rounded array\n */\nexport function around(a: NDArray, decimals: number = 0): NDArray {\n return NDArray._fromStorage(roundingOps.around(a.storage, decimals));\n}\n\n/**\n * Return the ceiling of the input, element-wise\n * @param x - Input array\n * @returns Element-wise ceiling\n */\nexport function ceil(x: NDArray): NDArray {\n return NDArray._fromStorage(roundingOps.ceil(x.storage));\n}\n\n/**\n * Round to nearest integer towards zero\n * @param x - Input array\n * @returns Array with values truncated towards zero\n */\nexport function fix(x: NDArray): NDArray {\n return NDArray._fromStorage(roundingOps.fix(x.storage));\n}\n\n/**\n * Return the floor of the input, element-wise\n * @param x - Input array\n * @returns Element-wise floor\n */\nexport function floor(x: NDArray): NDArray {\n return NDArray._fromStorage(roundingOps.floor(x.storage));\n}\n\n/**\n * Round elements of the array to the nearest integer\n * @param x - Input array\n * @returns Array with rounded integer values\n */\nexport function rint(x: NDArray): NDArray {\n return NDArray._fromStorage(roundingOps.rint(x.storage));\n}\n\n/**\n * Evenly round to the given number of decimals (alias for around)\n * @param a - Input array\n * @param decimals - Number of decimal places to round to (default: 0)\n * @returns Rounded array\n */\nexport { around as round };\n\n/**\n * Return the truncated value of the input, element-wise\n * @param x - Input array\n * @returns Element-wise truncated values\n */\nexport function trunc(x: NDArray): NDArray {\n return NDArray._fromStorage(roundingOps.trunc(x.storage));\n}\n\n// ============================================================================\n// Set Operations\n// ============================================================================\n\n/**\n * Find the unique elements of an array\n * @param ar - Input array\n * @param returnIndex - If True, also return the indices of the first occurrences\n * @param returnInverse - If True, also return the indices to reconstruct the original array\n * @param returnCounts - If True, also return the number of times each unique value appears\n * @returns Unique sorted values, and optionally indices/inverse/counts\n */\nexport function unique(\n ar: NDArray,\n returnIndex: boolean = false,\n returnInverse: boolean = false,\n returnCounts: boolean = false\n): NDArray | { values: NDArray; indices?: NDArray; inverse?: NDArray; counts?: NDArray } {\n const result = setOps.unique(ar.storage, returnIndex, returnInverse, returnCounts);\n if (result instanceof ArrayStorage) {\n return NDArray._fromStorage(result);\n }\n const out: { values: NDArray; indices?: NDArray; inverse?: NDArray; counts?: NDArray } = {\n values: NDArray._fromStorage(result.values),\n };\n if (result.indices) {\n out.indices = NDArray._fromStorage(result.indices);\n }\n if (result.inverse) {\n out.inverse = NDArray._fromStorage(result.inverse);\n }\n if (result.counts) {\n out.counts = NDArray._fromStorage(result.counts);\n }\n return out;\n}\n\n/**\n * Test whether each element of a 1-D array is also present in a second array\n * @param ar1 - Input array\n * @param ar2 - Test values\n * @returns Boolean array indicating membership\n */\nexport function in1d(ar1: NDArray, ar2: NDArray): NDArray {\n return NDArray._fromStorage(setOps.in1d(ar1.storage, ar2.storage));\n}\n\n/**\n * Find the intersection of two arrays\n * @param ar1 - First input array\n * @param ar2 - Second input array\n * @returns Sorted 1D array of common and unique elements\n */\nexport function intersect1d(ar1: NDArray, ar2: NDArray): NDArray {\n return NDArray._fromStorage(setOps.intersect1d(ar1.storage, ar2.storage));\n}\n\n/**\n * Test whether each element of an ND array is also present in a second array\n * @param element - Input array\n * @param testElements - Test values\n * @returns Boolean array indicating membership (same shape as element)\n */\nexport function isin(element: NDArray, testElements: NDArray): NDArray {\n return NDArray._fromStorage(setOps.isin(element.storage, testElements.storage));\n}\n\n/**\n * Find the set difference of two arrays\n * @param ar1 - First input array\n * @param ar2 - Second input array\n * @returns Sorted 1D array of values in ar1 that are not in ar2\n */\nexport function setdiff1d(ar1: NDArray, ar2: NDArray): NDArray {\n return NDArray._fromStorage(setOps.setdiff1d(ar1.storage, ar2.storage));\n}\n\n/**\n * Find the set exclusive-or of two arrays\n * @param ar1 - First input array\n * @param ar2 - Second input array\n * @returns Sorted 1D array of values that are in only one array\n */\nexport function setxor1d(ar1: NDArray, ar2: NDArray): NDArray {\n return NDArray._fromStorage(setOps.setxor1d(ar1.storage, ar2.storage));\n}\n\n/**\n * Find the union of two arrays\n * @param ar1 - First input array\n * @param ar2 - Second input array\n * @returns Sorted 1D array of unique values from both arrays\n */\nexport function union1d(ar1: NDArray, ar2: NDArray): NDArray {\n return NDArray._fromStorage(setOps.union1d(ar1.storage, ar2.storage));\n}\n\n// Gradient and difference functions\n\n/**\n * Calculate the n-th discrete difference along the given axis\n * @param a - Input array\n * @param n - Number of times values are differenced (default: 1)\n * @param axis - Axis along which to compute difference (default: -1)\n * @returns Array of differences\n */\nexport function diff(a: NDArray, n: number = 1, axis: number = -1): NDArray {\n return NDArray._fromStorage(gradientOps.diff(a.storage, n, axis));\n}\n\n/**\n * The differences between consecutive elements of a flattened array\n * @param ary - Input array\n * @param to_end - Number(s) to append at the end\n * @param to_begin - Number(s) to prepend at the beginning\n * @returns Array of differences\n */\nexport function ediff1d(\n ary: NDArray,\n to_end: number[] | null = null,\n to_begin: number[] | null = null\n): NDArray {\n return NDArray._fromStorage(gradientOps.ediff1d(ary.storage, to_end, to_begin));\n}\n\n/**\n * Return the gradient of an N-dimensional array\n * The gradient is computed using second order accurate central differences\n * in the interior and first order accurate one-sided differences at the boundaries.\n * @param f - Input array\n * @param varargs - Spacing between values (scalar or array per dimension)\n * @param axis - Axis or axes along which to compute gradient\n * @returns Array of gradients (one per axis) or single gradient\n */\nexport function gradient(\n f: NDArray,\n varargs: number | number[] = 1,\n axis: number | number[] | null = null\n): NDArray | NDArray[] {\n const result = gradientOps.gradient(f.storage, varargs, axis);\n if (Array.isArray(result)) {\n return result.map((s) => NDArray._fromStorage(s));\n }\n return NDArray._fromStorage(result);\n}\n\n/**\n * Return the cross product of two (arrays of) vectors\n * @param a - First input array\n * @param b - Second input array\n * @param axisa - Axis of a that defines the vector(s) (default: -1)\n * @param axisb - Axis of b that defines the vector(s) (default: -1)\n * @param axisc - Axis of c containing the cross product (default: -1)\n * @returns Cross product array\n */\nexport function cross(\n a: NDArray,\n b: NDArray,\n axisa: number = -1,\n axisb: number = -1,\n axisc: number = -1\n): NDArray {\n return NDArray._fromStorage(gradientOps.cross(a.storage, b.storage, axisa, axisb, axisc));\n}\n", "/**\n * NPY file format constants and type definitions\n *\n * NPY is NumPy's native binary format for storing arrays.\n * Spec: https://numpy.org/doc/stable/reference/generated/numpy.lib.format.html\n */\n\nimport type { DType } from '../../core/dtype';\n\n/**\n * NPY magic number: \\x93NUMPY (6 bytes)\n */\nexport const NPY_MAGIC = new Uint8Array([0x93, 0x4e, 0x55, 0x4d, 0x50, 0x59]);\n\n/**\n * Supported NPY format versions\n * - v1.0: 2-byte header length (max 65535 bytes)\n * - v2.0: 4-byte header length (max 4GB)\n * - v3.0: allows UTF-8 in description (same as v2 otherwise)\n *\n * We read v1, v2, and v3; we write v2 only\n */\nexport interface NpyVersion {\n major: number;\n minor: number;\n}\n\n/**\n * NPY header information\n */\nexport interface NpyHeader {\n /** Data type descriptor (e.g., '<f8', '>i4') */\n descr: string;\n /** Whether array is Fortran-contiguous (column-major) */\n fortran_order: boolean;\n /** Array shape */\n shape: number[];\n}\n\n/**\n * Parsed NPY metadata including version\n */\nexport interface NpyMetadata {\n version: NpyVersion;\n header: NpyHeader;\n /** Byte offset where data starts */\n dataOffset: number;\n}\n\n/**\n * Result of parsing an NPY header descriptor to our DType\n */\nexport interface DTypeParseResult {\n dtype: DType;\n /** Whether the data needs byte swapping (big-endian on little-endian or vice versa) */\n needsByteSwap: boolean;\n /** Element size in bytes */\n itemsize: number;\n}\n\n/**\n * All dtypes we support\n */\nexport const SUPPORTED_DTYPES: DType[] = [\n 'float64',\n 'float32',\n 'int64',\n 'int32',\n 'int16',\n 'int8',\n 'uint64',\n 'uint32',\n 'uint16',\n 'uint8',\n 'bool',\n];\n\n/**\n * Detect system endianness\n */\nexport function isSystemLittleEndian(): boolean {\n const buffer = new ArrayBuffer(2);\n new DataView(buffer).setInt16(0, 256, true);\n return new Int16Array(buffer)[0] === 256;\n}\n\n/**\n * NPY descriptor to DType mapping\n *\n * NumPy descriptors follow the format: <endian><type><size>\n * - Endian: '<' little, '>' big, '=' native, '|' not applicable (1-byte types)\n * - Type: 'f' float, 'i' signed int, 'u' unsigned int, 'b' bool, 'c' complex, etc.\n * - Size: byte size (1, 2, 4, 8)\n */\nconst DESCR_TO_DTYPE: Record<string, DType> = {\n // Float types\n f8: 'float64',\n f4: 'float32',\n // Signed integer types\n i8: 'int64',\n i4: 'int32',\n i2: 'int16',\n i1: 'int8',\n // Unsigned integer types\n u8: 'uint64',\n u4: 'uint32',\n u2: 'uint16',\n u1: 'uint8',\n // Boolean\n b1: 'bool',\n};\n\n/**\n * DType to NPY descriptor mapping (for serialization)\n * We always write little-endian\n */\nexport const DTYPE_TO_DESCR: Record<DType, string> = {\n float64: '<f8',\n float32: '<f4',\n int64: '<i8',\n int32: '<i4',\n int16: '<i2',\n int8: '|i1',\n uint64: '<u8',\n uint32: '<u4',\n uint16: '<u2',\n uint8: '|u1',\n bool: '|b1',\n};\n\n/**\n * Unsupported dtype types (for error messages)\n */\nexport const UNSUPPORTED_DTYPE_PATTERNS: Record<string, string> = {\n c: 'complex numbers',\n S: 'byte strings',\n U: 'Unicode strings',\n O: 'Python objects',\n V: 'structured arrays (void)',\n M: 'datetime64',\n m: 'timedelta64',\n};\n\n/**\n * Parse a NumPy dtype descriptor string to our DType\n *\n * @param descr - NumPy descriptor like '<f8', '>i4', '|b1'\n * @returns Parsed result with dtype and byte order info\n * @throws Error if dtype is not supported\n */\nexport function parseDescriptor(descr: string): DTypeParseResult {\n // Handle structured dtypes (tuples/lists) - not supported\n if (descr.startsWith('[') || descr.startsWith('(')) {\n throw new UnsupportedDTypeError(`Structured/compound dtypes are not supported: ${descr}`);\n }\n\n // Extract endianness, type, and size\n let endian = '';\n let typeAndSize = descr;\n\n // Check for endian prefix\n if (descr[0] === '<' || descr[0] === '>' || descr[0] === '=' || descr[0] === '|') {\n endian = descr[0];\n typeAndSize = descr.slice(1);\n }\n\n // Check for unsupported types\n const typeChar = typeAndSize[0];\n if (typeChar && typeChar in UNSUPPORTED_DTYPE_PATTERNS) {\n throw new UnsupportedDTypeError(\n `Unsupported dtype: ${UNSUPPORTED_DTYPE_PATTERNS[typeChar]} (${descr}). ` +\n `Use the 'force' parameter to skip arrays with unsupported dtypes.`\n );\n }\n\n // Look up in our mapping\n const dtype = DESCR_TO_DTYPE[typeAndSize];\n if (!dtype) {\n throw new UnsupportedDTypeError(\n `Unknown or unsupported dtype descriptor: ${descr}. ` +\n `Supported types: ${SUPPORTED_DTYPES.join(', ')}. ` +\n `Use the 'force' parameter to skip arrays with unsupported dtypes.`\n );\n }\n\n // Determine if byte swapping is needed\n const isLittleEndian = isSystemLittleEndian();\n const dataIsLittleEndian = endian === '<' || endian === '|' || (endian === '=' && isLittleEndian);\n const dataIsBigEndian = endian === '>' || (endian === '=' && !isLittleEndian);\n\n // We need to byte swap if:\n // - Data is big-endian and system is little-endian\n // - Data is little-endian and system is big-endian\n // But only for multi-byte types\n const itemsize = parseInt(typeAndSize.slice(1), 10);\n const needsByteSwap =\n itemsize > 1 &&\n ((dataIsBigEndian && isLittleEndian) || (dataIsLittleEndian && !isLittleEndian));\n\n return {\n dtype,\n needsByteSwap,\n itemsize,\n };\n}\n\n/**\n * Custom error for unsupported dtypes\n */\nexport class UnsupportedDTypeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedDTypeError';\n }\n}\n\n/**\n * Custom error for invalid NPY format\n */\nexport class InvalidNpyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidNpyError';\n }\n}\n", "/**\n * NPY file parser\n *\n * Parses NumPy .npy files (both v1 and v2/v3 formats) into NDArray objects.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { ArrayStorage } from '../../core/storage';\nimport { getTypedArrayConstructor, isBigIntDType, type DType } from '../../core/dtype';\nimport {\n NPY_MAGIC,\n parseDescriptor,\n InvalidNpyError,\n type NpyHeader,\n type NpyMetadata,\n} from './format';\n\n/**\n * Parse an NPY file from a Uint8Array or ArrayBuffer\n *\n * @param buffer - The NPY file contents\n * @returns An NDArray containing the parsed data\n * @throws InvalidNpyError if the file format is invalid\n * @throws UnsupportedDTypeError if the dtype is not supported\n */\nexport function parseNpy(buffer: ArrayBuffer | Uint8Array): NDArray {\n const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const metadata = parseNpyHeader(bytes);\n return parseNpyData(bytes, metadata);\n}\n\n/**\n * Parse just the NPY header without reading the data\n *\n * @param bytes - The NPY file bytes\n * @returns Parsed metadata including version, header, and data offset\n */\nexport function parseNpyHeader(bytes: Uint8Array): NpyMetadata {\n // Check minimum size\n if (bytes.length < 10) {\n throw new InvalidNpyError('File too small to be a valid NPY file');\n }\n\n // Verify magic number\n for (let i = 0; i < NPY_MAGIC.length; i++) {\n if (bytes[i] !== NPY_MAGIC[i]) {\n throw new InvalidNpyError('Invalid NPY magic number');\n }\n }\n\n // Read version\n const major = bytes[6]!;\n const minor = bytes[7]!;\n\n if (major !== 1 && major !== 2 && major !== 3) {\n throw new InvalidNpyError(`Unsupported NPY version: ${major}.${minor}`);\n }\n\n // Read header length\n let headerLen: number;\n let headerStart: number;\n\n if (major === 1) {\n // v1.0: 2-byte little-endian header length\n headerLen = bytes[8]! | (bytes[9]! << 8);\n headerStart = 10;\n } else {\n // v2.0 and v3.0: 4-byte little-endian header length\n headerLen = bytes[8]! | (bytes[9]! << 8) | (bytes[10]! << 16) | (bytes[11]! << 24);\n headerStart = 12;\n }\n\n // Read header string\n const headerEnd = headerStart + headerLen;\n if (bytes.length < headerEnd) {\n throw new InvalidNpyError('File truncated: header extends beyond file');\n }\n\n const headerBytes = bytes.slice(headerStart, headerEnd);\n const headerStr = new TextDecoder('utf-8').decode(headerBytes).trim();\n\n // Parse header dictionary\n const header = parseHeaderDict(headerStr);\n\n return {\n version: { major, minor },\n header,\n dataOffset: headerEnd,\n };\n}\n\n/**\n * Parse the data section of an NPY file given parsed metadata\n */\nexport function parseNpyData(bytes: Uint8Array, metadata: NpyMetadata): NDArray {\n const { header, dataOffset } = metadata;\n\n // Parse dtype descriptor\n const { dtype, needsByteSwap, itemsize } = parseDescriptor(header.descr);\n\n // Calculate expected data size\n const numElements = header.shape.reduce((a, b) => a * b, 1);\n const expectedBytes = numElements * itemsize;\n const actualBytes = bytes.length - dataOffset;\n\n if (actualBytes < expectedBytes) {\n throw new InvalidNpyError(\n `File truncated: expected ${expectedBytes} bytes of data, got ${actualBytes}`\n );\n }\n\n // Extract data buffer - create a copy to ensure we have a plain ArrayBuffer\n const dataBuffer = new ArrayBuffer(expectedBytes);\n const dataView = new Uint8Array(dataBuffer);\n dataView.set(bytes.subarray(dataOffset, dataOffset + expectedBytes));\n\n // Create typed array from data\n const typedData = createTypedArray(dataBuffer, dtype, numElements, needsByteSwap, itemsize);\n\n // Handle Fortran order (column-major)\n // NumPy stores data in row-major (C order) by default\n // If fortran_order is true, we need to adjust\n let shape = header.shape;\n let storage: ArrayStorage;\n\n if (header.fortran_order && shape.length > 1) {\n // For Fortran order, we can either:\n // 1. Transpose the shape and data (requires copy)\n // 2. Use column-major strides (creates a view)\n // We'll transpose to convert to C-order for consistency\n const reversedShape = [...shape].reverse();\n const tempStorage = ArrayStorage.fromData(typedData, reversedShape, dtype);\n\n // Transpose to get correct C-order layout\n storage = transposeStorage(tempStorage, reversedShape);\n shape = header.shape; // Use original shape after transpose\n } else {\n storage = ArrayStorage.fromData(typedData, [...shape], dtype);\n }\n\n return new NDArray(storage);\n}\n\n/**\n * Parse the Python dictionary header string\n */\nfunction parseHeaderDict(headerStr: string): NpyHeader {\n // Header is a Python dict literal like:\n // {'descr': '<f8', 'fortran_order': False, 'shape': (3, 4), }\n\n // Simple regex-based parser for the specific format\n const descrMatch = headerStr.match(/'descr'\\s*:\\s*'([^']+)'/);\n const fortranMatch = headerStr.match(/'fortran_order'\\s*:\\s*(True|False)/);\n const shapeMatch = headerStr.match(/'shape'\\s*:\\s*\\(([^)]*)\\)/);\n\n if (!descrMatch || !fortranMatch || !shapeMatch) {\n throw new InvalidNpyError(`Failed to parse NPY header: ${headerStr}`);\n }\n\n const descr = descrMatch[1]!;\n const fortran_order = fortranMatch[1] === 'True';\n\n // Parse shape tuple\n const shapeStr = shapeMatch[1]!.trim();\n let shape: number[];\n\n if (shapeStr === '') {\n // Scalar: shape is ()\n shape = [];\n } else {\n // Parse comma-separated integers\n shape = shapeStr\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s !== '')\n .map((s) => {\n const n = parseInt(s, 10);\n if (isNaN(n)) {\n throw new InvalidNpyError(`Invalid shape value: ${s}`);\n }\n return n;\n });\n }\n\n return { descr, fortran_order, shape };\n}\n\n/**\n * Create a typed array from raw bytes with optional byte swapping\n */\nfunction createTypedArray(\n buffer: ArrayBuffer,\n dtype: DType,\n numElements: number,\n needsByteSwap: boolean,\n itemsize: number\n):\n | Float64Array\n | Float32Array\n | BigInt64Array\n | Int32Array\n | Int16Array\n | Int8Array\n | BigUint64Array\n | Uint32Array\n | Uint16Array\n | Uint8Array {\n const Constructor = getTypedArrayConstructor(dtype);\n if (!Constructor) {\n throw new InvalidNpyError(`Cannot create array for dtype: ${dtype}`);\n }\n\n if (!needsByteSwap) {\n // Fast path: no byte swapping needed\n return new Constructor(buffer, 0, numElements);\n }\n\n // Slow path: need to byte swap\n const bytes = new Uint8Array(buffer);\n const swapped = new Uint8Array(buffer.byteLength);\n\n for (let i = 0; i < numElements; i++) {\n const start = i * itemsize;\n // Reverse bytes for this element\n for (let j = 0; j < itemsize; j++) {\n swapped[start + j] = bytes[start + itemsize - 1 - j]!;\n }\n }\n\n return new Constructor(swapped.buffer, 0, numElements);\n}\n\n/**\n * Transpose storage to convert from Fortran to C order\n */\nfunction transposeStorage(storage: ArrayStorage, shape: readonly number[]): ArrayStorage {\n const ndim = shape.length;\n const size = storage.size;\n const dtype = storage.dtype;\n const Constructor = getTypedArrayConstructor(dtype);\n\n if (!Constructor) {\n throw new InvalidNpyError(`Cannot create array for dtype: ${dtype}`);\n }\n\n const newData = new Constructor(size);\n const newShape = [...shape].reverse();\n\n // Compute strides for both orderings\n const oldStrides = computeStrides(shape);\n const newStrides = computeStrides(newShape);\n\n // Copy data with transposition\n const indices = new Array(ndim).fill(0);\n\n for (let linearIdx = 0; linearIdx < size; linearIdx++) {\n // Get multi-index in old layout\n let remaining = linearIdx;\n for (let i = 0; i < ndim; i++) {\n const dimSize = oldStrides[i]!;\n indices[i] = Math.floor(remaining / dimSize);\n remaining = remaining % dimSize;\n }\n\n // Compute new linear index (reverse indices for transpose)\n let newLinearIdx = 0;\n for (let i = 0; i < ndim; i++) {\n newLinearIdx += indices[ndim - 1 - i]! * newStrides[i]!;\n }\n\n // Copy value\n if (isBigIntDType(dtype)) {\n (newData as BigInt64Array | BigUint64Array)[newLinearIdx] = storage.iget(linearIdx) as bigint;\n } else {\n (newData as Exclude<typeof newData, BigInt64Array | BigUint64Array>)[newLinearIdx] =\n storage.iget(linearIdx) as number;\n }\n }\n\n return ArrayStorage.fromData(newData, newShape, dtype);\n}\n\n/**\n * Compute C-order strides for a shape\n */\nfunction computeStrides(shape: readonly number[]): number[] {\n const strides = new Array(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i]!;\n }\n return strides;\n}\n", "/**\n * NPY file serializer\n *\n * Serializes NDArray objects to NumPy .npy format (v3.0).\n * Always writes in little-endian, C-contiguous order.\n *\n * v3.0 is identical to v2.0 but allows UTF-8 in dtype descriptions.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { getDTypeSize, isBigIntDType, type DType } from '../../core/dtype';\nimport { NPY_MAGIC, DTYPE_TO_DESCR, isSystemLittleEndian } from './format';\n\n/**\n * Serialize an NDArray to NPY format (v3.0)\n *\n * @param arr - The NDArray to serialize\n * @returns A Uint8Array containing the NPY file data\n */\nexport function serializeNpy(arr: NDArray): Uint8Array {\n const shape = arr.shape;\n const dtype = arr.dtype as DType;\n\n // Build header dictionary string\n const descr = DTYPE_TO_DESCR[dtype];\n const shapeStr =\n shape.length === 0 ? '()' : shape.length === 1 ? `(${shape[0]},)` : `(${shape.join(', ')})`;\n\n // Python dict format: {'descr': '<f8', 'fortran_order': False, 'shape': (3, 4), }\n let headerDict = `{'descr': '${descr}', 'fortran_order': False, 'shape': ${shapeStr}, }`;\n\n // Header must be padded to 64-byte alignment (including magic, version, header_len)\n // v3.0 uses 4 bytes for header length (same as v2.0)\n // Total prefix is 6 (magic) + 2 (version) + 4 (header_len) = 12 bytes\n // Header string + newline should make total divisible by 64\n const PREFIX_LEN = 12;\n const totalBeforeData = PREFIX_LEN + headerDict.length + 1; // +1 for trailing newline\n const padding = (64 - (totalBeforeData % 64)) % 64;\n headerDict = headerDict + ' '.repeat(padding) + '\\n';\n\n const headerBytes = new TextEncoder().encode(headerDict);\n const headerLen = headerBytes.length;\n\n // Calculate data size\n const numElements = arr.size;\n const itemsize = getDTypeSize(dtype);\n const dataSize = numElements * itemsize;\n\n // Allocate output buffer\n const totalSize = PREFIX_LEN + headerLen + dataSize;\n const output = new Uint8Array(totalSize);\n\n // Write magic number\n output.set(NPY_MAGIC, 0);\n\n // Write version (3.0)\n output[6] = 3;\n output[7] = 0;\n\n // Write header length (4-byte little-endian)\n output[8] = headerLen & 0xff;\n output[9] = (headerLen >> 8) & 0xff;\n output[10] = (headerLen >> 16) & 0xff;\n output[11] = (headerLen >> 24) & 0xff;\n\n // Write header string\n output.set(headerBytes, PREFIX_LEN);\n\n // Write data\n const dataOffset = PREFIX_LEN + headerLen;\n writeArrayData(arr, output.subarray(dataOffset), itemsize);\n\n return output;\n}\n\n/**\n * Write array data to the output buffer\n */\nfunction writeArrayData(arr: NDArray, output: Uint8Array, itemsize: number): void {\n const dtype = arr.dtype as DType;\n const size = arr.size;\n const isLittleEndian = isSystemLittleEndian();\n const isBigInt = isBigIntDType(dtype);\n\n // Get raw data - need to handle non-contiguous arrays\n const storage = arr['_storage']; // Access private member\n const isCContiguous = storage.isCContiguous && storage.offset === 0;\n\n if (isCContiguous && isLittleEndian) {\n // Fast path: just copy the underlying buffer\n const srcData = storage.data;\n const srcBytes = new Uint8Array(srcData.buffer, srcData.byteOffset, size * itemsize);\n output.set(srcBytes);\n } else {\n // Slow path: element by element copy with potential byte swapping\n const dataView = new DataView(output.buffer, output.byteOffset, output.byteLength);\n\n for (let i = 0; i < size; i++) {\n const value = storage.iget(i);\n const offset = i * itemsize;\n\n if (isBigInt) {\n // Write BigInt as little-endian\n writeBigInt64LE(dataView, offset, value as bigint, dtype === 'uint64');\n } else {\n // Write number as little-endian\n writeNumberLE(dataView, offset, value as number, dtype);\n }\n }\n }\n}\n\n/**\n * Write a BigInt as little-endian\n */\nfunction writeBigInt64LE(view: DataView, offset: number, value: bigint, unsigned: boolean): void {\n if (unsigned) {\n view.setBigUint64(offset, value, true);\n } else {\n view.setBigInt64(offset, value, true);\n }\n}\n\n/**\n * Write a number as little-endian\n */\nfunction writeNumberLE(view: DataView, offset: number, value: number, dtype: DType): void {\n switch (dtype) {\n case 'float64':\n view.setFloat64(offset, value, true);\n break;\n case 'float32':\n view.setFloat32(offset, value, true);\n break;\n case 'int32':\n view.setInt32(offset, value, true);\n break;\n case 'int16':\n view.setInt16(offset, value, true);\n break;\n case 'int8':\n view.setInt8(offset, value);\n break;\n case 'uint32':\n view.setUint32(offset, value, true);\n break;\n case 'uint16':\n view.setUint16(offset, value, true);\n break;\n case 'uint8':\n case 'bool':\n view.setUint8(offset, value);\n break;\n default:\n throw new Error(`Unsupported dtype for serialization: ${dtype}`);\n }\n}\n", "/**\n * ZIP file format types and constants\n */\n\n/**\n * ZIP local file header signature\n */\nexport const ZIP_LOCAL_SIGNATURE = 0x04034b50;\n\n/**\n * ZIP central directory header signature\n */\nexport const ZIP_CENTRAL_SIGNATURE = 0x02014b50;\n\n/**\n * ZIP end of central directory signature\n */\nexport const ZIP_END_SIGNATURE = 0x06054b50;\n\n/**\n * Compression methods\n */\nexport const ZIP_STORED = 0; // No compression\nexport const ZIP_DEFLATED = 8; // DEFLATE compression\n\n/**\n * Entry in a ZIP file\n */\nexport interface ZipEntry {\n /** File name */\n name: string;\n /** Uncompressed data */\n data: Uint8Array;\n /** Compression method used */\n compressionMethod: number;\n /** CRC-32 checksum */\n crc32: number;\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n}\n\n/**\n * Raw entry as read from ZIP (before decompression)\n */\nexport interface RawZipEntry {\n /** File name */\n name: string;\n /** Compressed data */\n compressedData: Uint8Array;\n /** Compression method */\n compressionMethod: number;\n /** CRC-32 checksum */\n crc32: number;\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n}\n\n/**\n * CRC-32 lookup table\n */\nconst CRC32_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let j = 0; j < 8; j++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[i] = c;\n }\n return table;\n})();\n\n/**\n * Calculate CRC-32 checksum\n */\nexport function crc32(data: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = CRC32_TABLE[(crc ^ data[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n", "/**\n * Minimal ZIP file reader\n *\n * Reads ZIP files with STORED or DEFLATE compression.\n * Uses the Compression Streams API (built into modern browsers and Node.js 18+).\n */\n\nimport {\n ZIP_LOCAL_SIGNATURE,\n ZIP_END_SIGNATURE,\n ZIP_STORED,\n ZIP_DEFLATED,\n type RawZipEntry,\n} from './types';\n\n/**\n * Read a ZIP file and return its entries\n *\n * @param buffer - ZIP file contents\n * @returns Map of file names to their uncompressed data\n */\nexport async function readZip(buffer: ArrayBuffer | Uint8Array): Promise<Map<string, Uint8Array>> {\n const entries = parseZipEntries(buffer);\n const result = new Map<string, Uint8Array>();\n\n for (const entry of entries) {\n const data = await decompressEntry(entry);\n result.set(entry.name, data);\n }\n\n return result;\n}\n\n/**\n * Synchronously read a ZIP file (only works for STORED entries)\n *\n * @param buffer - ZIP file contents\n * @returns Map of file names to their uncompressed data\n * @throws Error if any entry uses compression\n */\nexport function readZipSync(buffer: ArrayBuffer | Uint8Array): Map<string, Uint8Array> {\n const entries = parseZipEntries(buffer);\n const result = new Map<string, Uint8Array>();\n\n for (const entry of entries) {\n if (entry.compressionMethod !== ZIP_STORED) {\n throw new Error(\n `Cannot read compressed entry synchronously: ${entry.name}. ` +\n `Use readZip() (async) for DEFLATE-compressed files.`\n );\n }\n result.set(entry.name, entry.compressedData);\n }\n\n return result;\n}\n\n/**\n * Central directory entry info\n */\ninterface CentralDirEntry {\n name: string;\n compressionMethod: number;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n}\n\n/**\n * Parse ZIP entries without decompressing\n *\n * Uses central directory for reliable size information, as some ZIP writers\n * (including Python's zipfile module used by NumPy) set local header sizes to\n * 0xFFFFFFFF when streaming.\n */\nfunction parseZipEntries(buffer: ArrayBuffer | Uint8Array): RawZipEntry[] {\n const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: RawZipEntry[] = [];\n\n // Find end of central directory\n let eocdOffset = -1;\n for (let i = bytes.length - 22; i >= 0; i--) {\n if (view.getUint32(i, true) === ZIP_END_SIGNATURE) {\n eocdOffset = i;\n break;\n }\n }\n\n if (eocdOffset === -1) {\n throw new Error('Invalid ZIP file: end of central directory not found');\n }\n\n // Read central directory location\n const centralDirOffset = view.getUint32(eocdOffset + 16, true);\n const numEntries = view.getUint16(eocdOffset + 10, true);\n\n // Parse central directory entries first to get reliable sizes\n const centralEntries: CentralDirEntry[] = [];\n let cdOffset = centralDirOffset;\n\n for (let i = 0; i < numEntries; i++) {\n const signature = view.getUint32(cdOffset, true);\n if (signature !== 0x02014b50) {\n // Central directory signature\n break;\n }\n\n const compressionMethod = view.getUint16(cdOffset + 10, true);\n const crc32 = view.getUint32(cdOffset + 16, true);\n const compressedSize = view.getUint32(cdOffset + 20, true);\n const uncompressedSize = view.getUint32(cdOffset + 24, true);\n const fileNameLength = view.getUint16(cdOffset + 28, true);\n const extraFieldLength = view.getUint16(cdOffset + 30, true);\n const commentLength = view.getUint16(cdOffset + 32, true);\n const localHeaderOffset = view.getUint32(cdOffset + 42, true);\n\n const fileNameBytes = bytes.slice(cdOffset + 46, cdOffset + 46 + fileNameLength);\n const fileName = new TextDecoder('utf-8').decode(fileNameBytes);\n\n centralEntries.push({\n name: fileName,\n compressionMethod,\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n });\n\n cdOffset = cdOffset + 46 + fileNameLength + extraFieldLength + commentLength;\n }\n\n // Now extract data using local headers for data location, but central directory for sizes\n for (const ce of centralEntries) {\n const localOffset = ce.localHeaderOffset;\n const signature = view.getUint32(localOffset, true);\n\n if (signature !== ZIP_LOCAL_SIGNATURE) {\n throw new Error(`Invalid local file header at offset ${localOffset}`);\n }\n\n const fileNameLength = view.getUint16(localOffset + 26, true);\n const extraFieldLength = view.getUint16(localOffset + 28, true);\n\n const dataStart = localOffset + 30 + fileNameLength + extraFieldLength;\n const compressedData = bytes.slice(dataStart, dataStart + ce.compressedSize);\n\n entries.push({\n name: ce.name,\n compressedData,\n compressionMethod: ce.compressionMethod,\n crc32: ce.crc32,\n compressedSize: ce.compressedSize,\n uncompressedSize: ce.uncompressedSize,\n });\n }\n\n return entries;\n}\n\n/**\n * Decompress a single ZIP entry\n */\nasync function decompressEntry(entry: RawZipEntry): Promise<Uint8Array> {\n if (entry.compressionMethod === ZIP_STORED) {\n return entry.compressedData;\n }\n\n if (entry.compressionMethod === ZIP_DEFLATED) {\n return await inflateRaw(entry.compressedData);\n }\n\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n}\n\n/**\n * Decompress raw DEFLATE data using DecompressionStream\n */\nasync function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n // Check if DecompressionStream is available\n if (typeof DecompressionStream === 'undefined') {\n throw new Error(\n 'DecompressionStream is not available. ' +\n 'This environment does not support the Compression Streams API. ' +\n 'Please use a modern browser or Node.js 18+.'\n );\n }\n\n // DEFLATE in ZIP is \"raw\" DEFLATE (no zlib header)\n // DecompressionStream expects the \"deflate-raw\" format\n const ds = new DecompressionStream('deflate-raw');\n\n // Create a copy to ensure we have a clean ArrayBuffer (avoids SharedArrayBuffer issues)\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n\n const writer = ds.writable.getWriter();\n void writer.write(dataCopy);\n void writer.close();\n\n const reader = ds.readable.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n", "/**\n * NPZ file parser\n *\n * NPZ is a ZIP archive containing multiple .npy files.\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { parseNpy } from '../npy/parser';\nimport { UnsupportedDTypeError } from '../npy/format';\nimport { readZip, readZipSync } from '../zip/reader';\n\n/**\n * Options for parsing NPZ files\n */\nexport interface NpzParseOptions {\n /**\n * If true, skip arrays with unsupported dtypes instead of throwing an error.\n * Skipped arrays will not be included in the result.\n * Default: false\n */\n force?: boolean;\n}\n\n/**\n * Result of parsing an NPZ file\n */\nexport interface NpzParseResult {\n /** Successfully parsed arrays */\n arrays: Map<string, NDArray>;\n /** Names of arrays that were skipped due to unsupported dtypes (only when force=true) */\n skipped: string[];\n /** Error messages for skipped arrays */\n errors: Map<string, string>;\n}\n\n/**\n * Parse an NPZ file from bytes\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Promise resolving to parsed arrays\n */\nexport async function parseNpz(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Promise<NpzParseResult> {\n const force = options.force ?? false;\n const files = await readZip(buffer);\n return parseNpzFromFiles(files, force);\n}\n\n/**\n * Synchronously parse an NPZ file (only works if not DEFLATE compressed)\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Parsed arrays\n */\nexport function parseNpzSync(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): NpzParseResult {\n const force = options.force ?? false;\n const files = readZipSync(buffer);\n return parseNpzFromFiles(files, force);\n}\n\n/**\n * Parse NPZ from already-extracted files\n */\nfunction parseNpzFromFiles(files: Map<string, Uint8Array>, force: boolean): NpzParseResult {\n const arrays = new Map<string, NDArray>();\n const skipped: string[] = [];\n const errors = new Map<string, string>();\n\n for (const [fileName, data] of files) {\n // NPZ entries should have .npy extension\n if (!fileName.endsWith('.npy')) {\n continue;\n }\n\n // Extract array name (remove .npy extension)\n const name = fileName.slice(0, -4);\n\n try {\n const arr = parseNpy(data);\n arrays.set(name, arr);\n } catch (error) {\n if (error instanceof UnsupportedDTypeError && force) {\n // Skip this array but continue processing others\n skipped.push(name);\n errors.set(name, error.message);\n } else {\n // Re-throw all other errors, or UnsupportedDTypeError if force is false\n throw error;\n }\n }\n }\n\n return { arrays, skipped, errors };\n}\n\n/**\n * Convenience function to get arrays as a plain object\n *\n * @param buffer - The NPZ file contents\n * @param options - Parse options\n * @returns Promise resolving to object with array names as keys\n */\nexport async function loadNpz(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Promise<Record<string, NDArray>> {\n const result = await parseNpz(buffer, options);\n return Object.fromEntries(result.arrays);\n}\n\n/**\n * Synchronous version of loadNpz\n */\nexport function loadNpzSync(\n buffer: ArrayBuffer | Uint8Array,\n options: NpzParseOptions = {}\n): Record<string, NDArray> {\n const result = parseNpzSync(buffer, options);\n return Object.fromEntries(result.arrays);\n}\n", "/**\n * Minimal ZIP file writer\n *\n * Creates ZIP files with optional DEFLATE compression.\n * Uses the Compression Streams API (built into modern browsers and Node.js 18+).\n */\n\nimport {\n ZIP_LOCAL_SIGNATURE,\n ZIP_CENTRAL_SIGNATURE,\n ZIP_END_SIGNATURE,\n ZIP_STORED,\n ZIP_DEFLATED,\n crc32,\n} from './types';\n\n/**\n * Options for writing a ZIP file\n */\nexport interface ZipWriteOptions {\n /** Whether to compress files (default: false for NPZ compatibility) */\n compress?: boolean;\n}\n\n/**\n * Create a ZIP file from a map of file names to data\n *\n * @param files - Map of file names to their data\n * @param options - Write options\n * @returns ZIP file as Uint8Array\n */\nexport async function writeZip(\n files: Map<string, Uint8Array>,\n options: ZipWriteOptions = {}\n): Promise<Uint8Array> {\n const compress = options.compress ?? false;\n const entries: {\n name: string;\n data: Uint8Array;\n compressedData: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }[] = [];\n\n // Prepare entries\n for (const [name, data] of files) {\n const crc = crc32(data);\n let compressedData: Uint8Array;\n let compressionMethod: number;\n\n if (compress) {\n compressedData = await deflateRaw(data);\n // Only use compression if it actually makes the data smaller\n if (compressedData.length < data.length) {\n compressionMethod = ZIP_DEFLATED;\n } else {\n compressedData = data;\n compressionMethod = ZIP_STORED;\n }\n } else {\n compressedData = data;\n compressionMethod = ZIP_STORED;\n }\n\n entries.push({\n name,\n data,\n compressedData,\n crc,\n compressionMethod,\n offset: 0, // Will be set during writing\n });\n }\n\n // Calculate total size\n let localHeadersSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n localHeadersSize += 30 + nameBytes.length + entry.compressedData.length;\n }\n\n let centralDirSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n centralDirSize += 46 + nameBytes.length;\n }\n\n const eocdSize = 22;\n const totalSize = localHeadersSize + centralDirSize + eocdSize;\n\n // Allocate buffer\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer);\n\n // Write local file headers and data\n let offset = 0;\n for (const entry of entries) {\n entry.offset = offset;\n offset = writeLocalHeader(output, view, offset, entry);\n }\n\n // Write central directory\n const centralDirOffset = offset;\n for (const entry of entries) {\n offset = writeCentralHeader(output, view, offset, entry);\n }\n\n // Write end of central directory\n writeEndOfCentralDirectory(view, offset, entries.length, centralDirSize, centralDirOffset);\n\n return output;\n}\n\n/**\n * Create a ZIP file synchronously (no compression)\n *\n * @param files - Map of file names to their data\n * @returns ZIP file as Uint8Array\n */\nexport function writeZipSync(files: Map<string, Uint8Array>): Uint8Array {\n const entries: {\n name: string;\n data: Uint8Array;\n compressedData: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }[] = [];\n\n // Prepare entries (no compression in sync mode)\n for (const [name, data] of files) {\n const crc = crc32(data);\n entries.push({\n name,\n data,\n compressedData: data,\n crc,\n compressionMethod: ZIP_STORED,\n offset: 0,\n });\n }\n\n // Calculate total size\n let localHeadersSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n localHeadersSize += 30 + nameBytes.length + entry.compressedData.length;\n }\n\n let centralDirSize = 0;\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n centralDirSize += 46 + nameBytes.length;\n }\n\n const eocdSize = 22;\n const totalSize = localHeadersSize + centralDirSize + eocdSize;\n\n // Allocate buffer\n const output = new Uint8Array(totalSize);\n const view = new DataView(output.buffer);\n\n // Write local file headers and data\n let offset = 0;\n for (const entry of entries) {\n entry.offset = offset;\n offset = writeLocalHeader(output, view, offset, entry);\n }\n\n // Write central directory\n const centralDirOffset = offset;\n for (const entry of entries) {\n offset = writeCentralHeader(output, view, offset, entry);\n }\n\n // Write end of central directory\n writeEndOfCentralDirectory(view, offset, entries.length, centralDirSize, centralDirOffset);\n\n return output;\n}\n\n/**\n * Write a local file header and data\n */\nfunction writeLocalHeader(\n output: Uint8Array,\n view: DataView,\n offset: number,\n entry: {\n name: string;\n compressedData: Uint8Array;\n data: Uint8Array;\n crc: number;\n compressionMethod: number;\n }\n): number {\n const nameBytes = new TextEncoder().encode(entry.name);\n\n // Signature\n view.setUint32(offset, ZIP_LOCAL_SIGNATURE, true);\n offset += 4;\n\n // Version needed to extract (2.0 for DEFLATE)\n view.setUint16(offset, entry.compressionMethod === ZIP_DEFLATED ? 20 : 10, true);\n offset += 2;\n\n // General purpose bit flag\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Compression method\n view.setUint16(offset, entry.compressionMethod, true);\n offset += 2;\n\n // Last mod time (use a fixed value)\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Last mod date (use a fixed value)\n view.setUint16(offset, 0x21, true); // Jan 1, 1980\n offset += 2;\n\n // CRC-32\n view.setUint32(offset, entry.crc, true);\n offset += 4;\n\n // Compressed size\n view.setUint32(offset, entry.compressedData.length, true);\n offset += 4;\n\n // Uncompressed size\n view.setUint32(offset, entry.data.length, true);\n offset += 4;\n\n // File name length\n view.setUint16(offset, nameBytes.length, true);\n offset += 2;\n\n // Extra field length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // File name\n output.set(nameBytes, offset);\n offset += nameBytes.length;\n\n // File data\n output.set(entry.compressedData, offset);\n offset += entry.compressedData.length;\n\n return offset;\n}\n\n/**\n * Write a central directory header\n */\nfunction writeCentralHeader(\n output: Uint8Array,\n view: DataView,\n offset: number,\n entry: {\n name: string;\n compressedData: Uint8Array;\n data: Uint8Array;\n crc: number;\n compressionMethod: number;\n offset: number;\n }\n): number {\n const nameBytes = new TextEncoder().encode(entry.name);\n\n // Signature\n view.setUint32(offset, ZIP_CENTRAL_SIGNATURE, true);\n offset += 4;\n\n // Version made by\n view.setUint16(offset, 20, true);\n offset += 2;\n\n // Version needed to extract\n view.setUint16(offset, entry.compressionMethod === ZIP_DEFLATED ? 20 : 10, true);\n offset += 2;\n\n // General purpose bit flag\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Compression method\n view.setUint16(offset, entry.compressionMethod, true);\n offset += 2;\n\n // Last mod time\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Last mod date\n view.setUint16(offset, 0x21, true);\n offset += 2;\n\n // CRC-32\n view.setUint32(offset, entry.crc, true);\n offset += 4;\n\n // Compressed size\n view.setUint32(offset, entry.compressedData.length, true);\n offset += 4;\n\n // Uncompressed size\n view.setUint32(offset, entry.data.length, true);\n offset += 4;\n\n // File name length\n view.setUint16(offset, nameBytes.length, true);\n offset += 2;\n\n // Extra field length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // File comment length\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Disk number start\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Internal file attributes\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // External file attributes\n view.setUint32(offset, 0, true);\n offset += 4;\n\n // Relative offset of local header\n view.setUint32(offset, entry.offset, true);\n offset += 4;\n\n // File name\n output.set(nameBytes, offset);\n offset += nameBytes.length;\n\n return offset;\n}\n\n/**\n * Write end of central directory record\n */\nfunction writeEndOfCentralDirectory(\n view: DataView,\n offset: number,\n numEntries: number,\n centralDirSize: number,\n centralDirOffset: number\n): void {\n // Signature\n view.setUint32(offset, ZIP_END_SIGNATURE, true);\n offset += 4;\n\n // Number of this disk\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Disk where central directory starts\n view.setUint16(offset, 0, true);\n offset += 2;\n\n // Number of central directory records on this disk\n view.setUint16(offset, numEntries, true);\n offset += 2;\n\n // Total number of central directory records\n view.setUint16(offset, numEntries, true);\n offset += 2;\n\n // Size of central directory\n view.setUint32(offset, centralDirSize, true);\n offset += 4;\n\n // Offset of central directory\n view.setUint32(offset, centralDirOffset, true);\n offset += 4;\n\n // Comment length\n view.setUint16(offset, 0, true);\n}\n\n/**\n * Compress data using raw DEFLATE\n */\nasync function deflateRaw(data: Uint8Array): Promise<Uint8Array> {\n // Check if CompressionStream is available\n if (typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not available. ' +\n 'This environment does not support the Compression Streams API. ' +\n 'Please use a modern browser or Node.js 18+.'\n );\n }\n\n const cs = new CompressionStream('deflate-raw');\n\n // Create a copy to ensure we have a clean ArrayBuffer (avoids SharedArrayBuffer issues)\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n\n const writer = cs.writable.getWriter();\n void writer.write(dataCopy);\n void writer.close();\n\n const reader = cs.readable.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n", "/**\n * NPZ file serializer\n *\n * Serializes multiple NDArrays to NPZ format (ZIP archive of .npy files).\n */\n\nimport { NDArray } from '../../core/ndarray';\nimport { serializeNpy } from '../npy/serializer';\nimport { writeZip, writeZipSync } from '../zip/writer';\n\n/**\n * Input type for arrays - supports:\n * - Array of NDArrays (positional, named arr_0, arr_1, etc.)\n * - Map of names to NDArrays\n * - Object with names as keys\n */\nexport type NpzArraysInput = NDArray[] | Map<string, NDArray> | Record<string, NDArray>;\n\n/**\n * Options for serializing NPZ files\n */\nexport interface NpzSerializeOptions {\n /**\n * Whether to compress the NPZ file using DEFLATE.\n * Default: false (matches np.savez behavior; use true for np.savez_compressed behavior)\n */\n compress?: boolean;\n}\n\n/**\n * Serialize multiple arrays to NPZ format\n *\n * @param arrays - Arrays to save. Can be:\n * - An array of NDArrays (named arr_0, arr_1, etc. like np.savez positional args)\n * - A Map of names to NDArrays\n * - An object with names as keys (like np.savez keyword args)\n * @param options - Serialization options\n * @returns Promise resolving to NPZ file as Uint8Array\n *\n * @example\n * // Positional arrays (named arr_0, arr_1)\n * await serializeNpz([arr1, arr2])\n *\n * // Named arrays\n * await serializeNpz({ x: arr1, y: arr2 })\n */\nexport async function serializeNpz(\n arrays: NpzArraysInput,\n options: NpzSerializeOptions = {}\n): Promise<Uint8Array> {\n const files = prepareNpzFiles(arrays);\n return writeZip(files, { compress: options.compress ?? false });\n}\n\n/**\n * Synchronously serialize multiple arrays to NPZ format (no compression)\n *\n * @param arrays - Arrays to save (same input types as serializeNpz)\n * @returns NPZ file as Uint8Array\n */\nexport function serializeNpzSync(arrays: NpzArraysInput): Uint8Array {\n const files = prepareNpzFiles(arrays);\n return writeZipSync(files);\n}\n\n/**\n * Prepare NPY files for ZIP packaging\n */\nfunction prepareNpzFiles(arrays: NpzArraysInput): Map<string, Uint8Array> {\n const files = new Map<string, Uint8Array>();\n\n // Handle array input (positional arrays get named arr_0, arr_1, etc.)\n if (Array.isArray(arrays)) {\n for (let i = 0; i < arrays.length; i++) {\n const arr = arrays[i]!;\n const npyData = serializeNpy(arr);\n files.set(`arr_${i}.npy`, npyData);\n }\n return files;\n }\n\n // Handle both Map and plain object\n const entries = arrays instanceof Map ? arrays.entries() : Object.entries(arrays);\n\n for (const [name, arr] of entries) {\n // Validate array name\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('Array names must be non-empty strings');\n }\n\n // Serialize to NPY format\n const npyData = serializeNpy(arr);\n\n // Add .npy extension\n const fileName = name.endsWith('.npy') ? name : `${name}.npy`;\n files.set(fileName, npyData);\n }\n\n return files;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "DTYPE_TO_DESCR", "InvalidNpyError", "NDArray", "SUPPORTED_DTYPES", "UnsupportedDTypeError", "__version__", "absolute", "append", "arange", "arccos", "arccosh", "arcsin", "arcsinh", "arctan", "arctan2", "arctanh", "argpartition", "argsort", "around", "array", "array_equal", "array_equiv", "array_split", "asanyarray", "asarray", "ascontiguousarray", "asfortranarray", "atleast_1d", "atleast_2d", "atleast_3d", "average", "bitwise_and", "bitwise_not", "bitwise_or", "bitwise_xor", "broadcast_arrays", "broadcast_shapes", "broadcast_to", "cbrt", "ceil", "choose", "column_stack", "compress", "concatenate", "copy", "cos", "cosh", "count_nonzero", "cross", "cumprod", "cumsum", "deg2rad", "degrees", "delete_", "diag", "diag_indices", "diag_indices_from", "diagflat", "diagonal", "diff", "divmod", "dot", "dsplit", "dstack", "ediff1d", "einsum", "empty", "empty_like", "exp", "exp2", "expand_dims", "expm1", "extract", "eye", "fabs", "fix", "flatnonzero", "flip", "fliplr", "flipud", "floor", "floor_divide", "frombuffer", "fromfile", "fromfunction", "fromiter", "fromstring", "full", "full_like", "geomspace", "gradient", "heaviside", "hsplit", "hstack", "hypot", "identity", "in1d", "indices", "inner", "insert", "intersect1d", "invert", "isin", "ix_", "kron", "left_shift", "lexsort", "linalg", "linspace", "loadNpz", "loadNpzSync", "log", "log10", "log1p", "log2", "logaddexp", "logaddexp2", "logspace", "mask_indices", "median", "meshgrid", "mod", "moveaxis", "nanargmax", "nanargmin", "nancumprod", "nancumsum", "nanmax", "nanmean", "nanmedian", "nanmin", "nanprod", "nanstd", "nansum", "nanvar", "negative", "nonzero", "ones", "ones_like", "outer", "packbits", "pad", "parseNpy", "parseNpyData", "parseNpyHeader", "parseNpz", "parseNpzSync", "partition", "percentile", "place", "positive", "power", "ptp", "put", "put_along_axis", "putmask", "quantile", "rad2deg", "radians", "ravel", "ravel_multi_index", "reciprocal", "remainder", "repeat", "reshape", "resize", "right_shift", "rint", "roll", "rollaxis", "rot90", "row_stack", "searchsorted", "select", "serializeNpy", "serializeNpz", "serializeNpzSync", "setdiff1d", "setxor1d", "sign", "sin", "sinh", "sort", "sort_complex", "split", "sqrt", "square", "squeeze", "stack", "swapaxes", "take", "take_along_axis", "tan", "tanh", "tensordot", "tile", "trace", "transpose", "tri", "tril", "tril_indices", "tril_indices_from", "triu", "triu_indices", "triu_indices_from", "trunc", "union1d", "unique", "unpackbits", "unravel_index", "vander", "vsplit", "vstack", "where", "zeros", "zeros_like", "__toCommonJS", "parseSlice", "sliceStr", "index", "parts", "start", "stop", "step", "normalizeSlice", "spec", "size", "isIndex", "normalizedStart", "DEFAULT_DTYPE", "getTypedArrayConstructor", "dtype", "getDTypeSize", "isIntegerDType", "isFloatDType", "isBigIntDType", "promoteDTypes", "dtype1", "dtype2", "isFloatDType", "intDtype", "isSigned1", "isSigned2", "isUnsigned1", "isUnsigned2", "getSize", "dtype", "size1", "size2", "maxSize", "ArrayStorage", "_ArrayStorage", "data", "shape", "strides", "offset", "dtype", "a", "b", "ndim", "expectedStride", "i", "linearIndex", "remaining", "bufferIndex", "dimSize", "j", "idx", "value", "indices", "size", "Constructor", "getTypedArrayConstructor", "newData", "isBigIntDType", "src", "dst", "finalStrides", "finalOffset", "DEFAULT_DTYPE", "stride", "computeStrides", "broadcastShapes", "shapeA", "shapeB", "ndimA", "ndimB", "ndim", "result", "dimA", "dimB", "broadcastStrides", "shape", "strides", "targetShape", "targetNdim", "targetIdx", "dim", "targetDim", "broadcastTo", "storage", "broadcastedStrides", "ArrayStorage", "elementwiseBinaryOp", "a", "b", "op", "opName", "outputShape", "aBroadcast", "bBroadcast", "resultDtype", "promoteDTypes", "resultData", "size", "isBigIntDType", "resultTyped", "i", "aRaw", "bRaw", "aVal", "bVal", "needsConversion", "elementwiseComparisonOp", "elementwiseUnaryOp", "preserveDtype", "dtype", "inputData", "val", "canUseFastPath", "a", "b", "dim", "i", "add", "addScalar", "addArraysFast", "elementwiseBinaryOp", "x", "y", "dtype", "promoteDTypes", "result", "ArrayStorage", "size", "aData", "bData", "resultData", "isBigIntDType", "resultTyped", "aVal", "bVal", "aTyped", "bTyped", "subtract", "subtractScalar", "subtractArraysFast", "multiply", "multiplyScalar", "multiplyArraysFast", "divide", "divideScalar", "aIsFloat64", "bIsFloat64", "aIsFloat32", "bIsFloat32", "aFloat", "convertToFloatDType", "bFloat", "storage", "targetDtype", "srcData", "dstData", "scalar", "shape", "data", "thisTyped", "scalarBig", "resultDtype", "absolute", "val", "negative", "sign", "mod", "modScalar", "divisor", "divisorBig", "floorDivide", "floorDivideScalar", "positive", "reciprocal", "cbrt", "fabs", "divmod", "quotient", "remainder", "square", "bigData", "bigResultData", "heaviside", "x1", "x2", "x2Data", "x2Shape", "d", "x2Idx", "computeBroadcastShape", "shapes", "maxNdim", "s", "result", "i", "dim", "shape", "shapeIdx", "shapeDim", "broadcastStrides", "shape", "strides", "targetShape", "ndim", "targetNdim", "result", "targetIdx", "dim", "targetDim", "broadcastTo", "storage", "broadcastedStrides", "ArrayStorage", "broadcastShapes", "shapes", "result", "computeBroadcastShape", "shapeStrs", "s", "greater", "a", "b", "greaterScalar", "elementwiseComparisonOp", "x", "y", "greaterEqual", "greaterEqualScalar", "less", "lessScalar", "lessEqual", "lessEqualScalar", "equal", "equalScalar", "notEqual", "notEqualScalar", "isclose", "rtol", "atol", "iscloseScalar", "diff", "threshold", "allclose", "closeResult", "data", "arrayEquiv", "a1", "a2", "shapes", "broadcastShape", "computeBroadcastShape", "b1", "broadcastTo", "b2", "ndim", "size", "acc", "d", "isBigInt1", "isBigIntDType", "isBigInt2", "flatIdx", "temp", "indices", "i", "val1", "val2", "v1", "v2", "storage", "scalar", "thisData", "ArrayStorage", "dtype", "scalarBig", "typedData", "thisTyped", "multiIndexToLinear", "indices", "shape", "linearIdx", "stride", "i", "outerIndexToMultiIndex", "outerIdx", "axis", "axisIdx", "ndim", "outputShape", "_", "remaining", "sum", "storage", "axis", "keepdims", "dtype", "shape", "ndim", "size", "data", "isBigIntDType", "typedData", "total", "i", "normalizedAxis", "outputShape", "_", "result", "ArrayStorage", "resultData", "axisSize", "outerSize", "a", "b", "resultTyped", "outerIdx", "sumVal", "axisIdx", "inputIndices", "outerIndexToMultiIndex", "linearIdx", "multiIndexToLinear", "keepdimsShape", "mean", "sumResult", "divisor", "resultDtype", "sumData", "sumTyped", "max", "maxVal", "firstIndices", "firstIdx", "val", "prod", "product", "prodVal", "min", "minVal", "argmin", "minIdx", "minAxisIdx", "argmax", "maxIdx", "maxAxisIdx", "variance", "ddof", "meanResult", "meanVal", "sumSqDiff", "diff", "meanArray", "meanData", "std", "varResult", "varData", "all", "allTrue", "any", "anyTrue", "cumsum", "strides", "stride", "totalSize", "axisStride", "cumprod", "ptp", "maxResult", "minResult", "maxStorage", "minStorage", "maxData", "minData", "median", "quantile", "percentile", "q", "values", "n", "idx", "lower", "upper", "frac", "average", "weights", "sumWeightedValues", "sumWeights", "weightData", "w", "nansum", "nanprod", "nanmean", "count", "nanvar", "sumSq", "nanstd", "varStorage", "nanmin", "nanmax", "nanargmin", "nanargmax", "nancumsum", "nancumprod", "nanmedian", "mid", "reshape", "storage", "newShape", "size", "dtype", "negIndex", "finalShape", "knownSize", "acc", "dim", "i", "inferredDim", "a", "b", "data", "ArrayStorage", "computeStrides", "flatten", "Constructor", "getTypedArrayConstructor", "newData", "isBigInt", "isBigIntDType", "value", "ravel", "transpose", "axes", "shape", "ndim", "strides", "permutation", "_", "seen", "axis", "normalizedAxis", "ax", "oldStrides", "newStrides", "squeeze", "expandDims", "insertedStride", "swapaxes", "axis1", "axis2", "normalizedAxis1", "normalizedAxis2", "moveaxis", "source", "destination", "sourceArr", "destArr", "normalizedSource", "normalized", "normalizedDest", "order", "dst", "concatenate", "storages", "first", "s", "outputShape", "totalAlongAxis", "outputSize", "outputData", "outputStrides", "offset", "axisSize", "copyToOutput", "_outputShape", "axisOffset", "sourceShape", "sourceSize", "outputOffset", "sourceData", "start", "end", "rows", "cols", "outputCols", "sourceStart", "row", "sourceRowStart", "outputRowStart", "indices", "baseOutputOffset", "outputIdx", "d", "stack", "expanded", "vstack", "prepared", "hstack", "dstack", "split", "indicesOrSections", "splitIndices", "sectionSize", "splitAtIndices", "arraySplit", "numSections", "remainder", "boundaries", "result", "sliceShape", "newOffset", "vsplit", "hsplit", "tile", "reps", "repsArr", "maxDim", "paddedShape", "paddedReps", "expandedStorage", "expandedStrides", "outputIndices", "sourceFlatIdx", "sourceIdx", "repeat", "repeats", "flatSize", "repeatsArr", "outIdx", "rep", "r", "sourceIndices", "axisPositions", "axisIdx", "baseOutIdx", "axisStride", "axisStart", "flip", "axesToFlip", "c", "sourceOffset", "rot90", "k", "axis0", "outIdx0", "outIdx1", "roll", "shift", "flatShift", "flatStorage", "shifts", "normalizedAxes", "j", "sh", "rollaxis", "normalizedStart", "dsplit", "columnStack", "resize", "storage", "newShape", "dtype", "newSize", "a", "b", "oldSize", "Constructor", "getTypedArrayConstructor", "outputData", "isBigInt", "isBigIntDType", "i", "sourceIdx", "value", "ArrayStorage", "atleast1d", "storages", "s", "reshape", "atleast2d", "atleast3d", "dgemm", "layout", "transA", "transB", "M", "N", "K", "alpha", "A", "lda", "B", "ldb", "beta", "C", "ldc", "i", "isRowMajor", "transposeA", "transposeB", "j", "sum", "k", "dot", "a", "b", "aDim", "bDim", "aVal", "bVal", "resultDtype", "promoteDTypes", "result", "ArrayStorage", "bData", "aData", "n", "matmul", "m", "lastDimA", "bSize", "resultShape", "resultSize", "acc", "dim", "temp", "resultIdx", "d", "aIdx", "aSize", "contractAxisB", "contractDimB", "bIdxBefore", "bIdxAfter", "bIdx", "secondLastDimB", "aOuterSize", "bOuterSize", "bLastDim", "contractionDim", "k2", "computeDtype", "aStrideRow", "aStrideCol", "bStrideRow", "bStrideCol", "aIsTransposed", "bIsTransposed", "trace", "rows", "cols", "diagLen", "val", "transpose", "axes", "inner", "aLastDim", "outer", "aFlat", "ravel", "bFlat", "product", "tensordot", "aAxes", "bAxes", "_", "aAxis", "bAxis", "aFreeAxes", "bFreeAxes", "ax", "contractSize", "contractedIdx", "resIdx", "resultIndices", "aFreeIndices", "bFreeIndices", "c", "contractedIndices", "aFullIdx", "bFullIdx", "diagonal", "offset", "axis1", "axis2", "shape", "ndim", "ax1", "ax2", "dim1", "dim2", "outShape", "otherDims", "otherSize", "otherIdx", "otherIndices", "srcIndices", "otherIdx2", "dstIndices", "value", "einsum", "subscripts", "operands", "arrowMatch", "inputSubscripts", "outputSubscript", "inferOutputSubscript", "operandSubscripts", "s", "indexDims", "sub", "op", "idx", "outputIndices", "allInputIndices", "sumIndices", "sub1", "sub2", "op1", "op2", "i1", "j1", "i2", "j2", "o1", "o2", "op1T", "op2T", "computeEinsumScalar", "outputShape", "outputSize", "sumSize", "outIdx", "outMultiIdx", "flatToMulti", "indexValues", "sumIdx", "opIdx", "counts", "count", "flatIdx", "kron", "aShape", "bShape", "aNdim", "bNdim", "aPadded", "bPadded", "aIndices", "aIndicesPadded", "temp2", "bIndices", "bIndicesPadded", "outIndices", "cross", "axisa", "axisb", "axisc", "axis", "normalizeAxis", "axisA", "axisB", "dimA", "dimB", "a0", "a1", "a2", "b0", "b1", "b2", "vectorDimA", "vectorDimB", "outputVectorDim", "aOtherShape", "bOtherShape", "otherShape", "normalizedAxisC", "getA", "getB", "c0", "c1", "c2", "setResult", "vector_norm", "x", "ord", "keepdims", "flat", "out", "axisLen", "outSize", "inIndices", "normVal", "matrix_norm", "svdFull", "colSum", "rowSum", "norm", "ax0", "qr", "mode", "R", "householderVectors", "tau", "colLen", "col", "normCol", "sign", "u0", "v", "tauJ", "jj", "vTR", "h", "tauArr", "rResult", "qRows", "Q", "vTQ", "qResult", "rRows", "cholesky", "upper", "size", "L", "ljj", "U", "smaller", "ATA", "eigVals", "V", "eigSymmetric", "indices", "eigVal", "vt", "u", "sigma", "dotProd", "maxIter", "tol", "iter", "maxVal", "p", "q", "app", "aqq", "apq", "theta", "newApp", "newAqq", "aip", "aiq", "vip", "viq", "values", "svd", "full_matrices", "compute_uv", "uReduced", "vtReduced", "det", "lu", "luDecomposition", "luData", "piv", "maxRow", "tempPiv", "pivot", "factor", "inv", "resultData", "y", "diag", "solveVector", "pb", "xData", "solve", "bCol", "xCol", "lstsq", "rcond", "threshold", "cutoff", "rank", "b2D", "reshape", "nrhs", "utb", "l", "residuals", "resSum", "axij", "diff", "cond", "maxS", "minS", "normA", "invA", "normInvA", "matrix_rank", "matrix_power", "base", "power", "current", "pinv", "eig", "isSymmetric", "vectors", "w", "qrEigendecomposition", "offDiagNorm", "qrResult", "eigh", "UPLO", "sym", "eigvals", "eigvalsh", "sqrt", "a", "elementwiseUnaryOp", "power", "b", "powerScalar", "elementwiseBinaryOp", "storage", "exponent", "dtype", "shape", "data", "size", "resultDtype", "result", "ArrayStorage", "resultData", "isBigIntDType", "thisTyped", "resultTyped", "i", "exp", "exp2", "x", "expm1", "log", "log2", "log10", "log1p", "logaddexp", "x1", "x2", "logaddexpScalar", "logaddexpArray", "outputShape", "broadcastShapes", "dtype1", "dtype2", "val1", "val2", "maxVal", "minVal", "logaddexp2", "logaddexp2Scalar", "logaddexp2Array", "LOG2_E", "sin", "a", "elementwiseUnaryOp", "cos", "tan", "arcsin", "arccos", "arctan", "arctan2", "x1", "x2", "arctan2Scalar", "arctan2Array", "shape", "size", "dtype1", "dtype2", "resultDtype", "result", "ArrayStorage", "resultData", "i", "val1", "isBigIntDType", "val2", "storage", "dtype", "data", "hypot", "hypotScalar", "hypotArray", "degrees", "factor", "x", "radians", "sinh", "a", "elementwiseUnaryOp", "cosh", "tanh", "arcsinh", "arccosh", "arctanh", "broadcast_to", "storage", "targetShape", "shape", "ndim", "targetNdim", "broadcastedShape", "computeBroadcastShape", "broadcastTo", "broadcast_arrays", "storages", "shapes", "s", "take", "storage", "indices", "axis", "shape", "ndim", "dtype", "flatSize", "idx", "normalizedIdx", "outputSize", "Constructor", "getTypedArrayConstructor", "outputData", "i", "value", "isBigIntDType", "ArrayStorage", "normalizedAxis", "axisSize", "outputShape", "a", "b", "outputStrides", "computeStrides", "outputIndices", "sourceIndices", "targetIdx", "sourceAxisIdx", "outIdx", "d", "put", "values", "valueArray", "original", "choose", "indexStorage", "choices", "indexShape", "numChoices", "shapes", "c", "broadcastedShape", "computeBroadcastShape", "broadcastedIndex", "broadcastTo", "broadcastedChoices", "choiceIdx", "array_equal", "equal_nan", "size", "aVal", "bVal", "aIsNaN", "bIsNaN", "take_along_axis", "indicesShape", "inputStrides", "indicesStrides", "multiIdx", "remaining", "indicesLinearIdx", "indexValue", "sourceMultiIdx", "srcLinearIdx", "put_along_axis", "valuesShape", "valuesStrides", "indicesSize", "valuesLinearIdx", "vidx", "destMultiIdx", "destLinearIdx", "putmask", "mask", "valueIdx", "compress", "condition", "inputData", "isBigInt", "trueCount", "maxLen", "axisMap", "strideAlongAxis", "elementsPerSlice", "srcOffset", "src", "dst", "j", "outerSize", "innerSize", "outer", "axisIdx", "inputAxisIdx", "baseOffset", "rem", "inner", "select", "condlist", "choicelist", "defaultValue", "allShapes", "defaultVal", "broadcastedConds", "place", "vals", "diag_indices", "n", "result", "diag_indices_from", "tril_indices", "k", "m", "cols", "rows", "colIndices", "tril_indices_from", "triu_indices", "triu_indices_from", "mask_indices", "mask_func", "maskShape", "dimensions", "gridSize", "sliceOffset", "gridIdx", "ix_", "args", "arr", "arrSize", "data", "ravel_multi_index", "multi_index", "dims", "mode", "strides", "stride", "flatIdx", "dimSize", "unravel_index", "order", "indicesArray", "totalSize", "coord", "validateIntegerDType", "dtype", "opName", "isIntegerDType", "canUseFastPath", "a", "b", "dim", "i", "bitwise_and", "bitwiseAndScalar", "bitwiseAndArraysFast", "elementwiseBinaryOp", "x", "y", "promoteDTypes", "result", "ArrayStorage", "size", "aData", "bData", "resultData", "isBigIntDType", "resultTyped", "aVal", "bVal", "aTyped", "bTyped", "storage", "scalar", "shape", "data", "thisTyped", "scalarBig", "bitwise_or", "bitwiseOrScalar", "bitwiseOrArraysFast", "bitwise_xor", "bitwiseXorScalar", "bitwiseXorArraysFast", "bitwise_not", "invert", "left_shift", "leftShiftScalar", "shiftVal", "leftShiftArraysFast", "shift", "shiftBig", "right_shift", "rightShiftScalar", "rightShiftArraysFast", "packbits", "axis", "bitorder", "ndim", "axisSize", "packedAxisSize", "outShape", "byte", "bit", "srcIdx", "val", "preAxisShape", "postAxisShape", "preAxisSize", "acc", "postAxisSize", "inputStrides", "computeStrides", "outputStrides", "pre", "post", "packedIdx", "axisIdx", "inputIdx", "preRemaining", "d", "dimSize", "coord", "postRemaining", "outputIdx", "unpackbits", "count", "unpackedAxisSize", "outIdx", "strides", "stride", "sort", "storage", "axis", "shape", "ndim", "dtype", "data", "normalizedAxis", "result", "resultData", "axisSize", "outputShape", "_", "i", "outerSize", "a", "b", "isBigIntDType", "typedData", "resultTyped", "outerIdx", "values", "axisIdx", "inputIndices", "outerIndexToMultiIndex", "linearIdx", "multiIndexToLinear", "argsort", "ArrayStorage", "lexsort", "keys", "n", "key", "indices", "k", "va", "vb", "quickselectNumbers", "arr", "kth", "left", "right", "mid", "c", "pivotIdx", "pivot", "j", "val", "valIsNaN", "pivotIsNaN", "quickselectBigInts", "quickselectNumberIndices", "quickselectBigIntIndices", "partition", "normalizedKth", "argpartition", "sort_complex", "size", "nonzero", "nonzeroIndices", "dim", "strides", "stride", "remaining", "idx", "numNonzero", "arrData", "flatnonzero", "where", "condition", "x", "y", "condShape", "xShape", "yShape", "maxNdim", "padShape", "s", "padded", "paddedCond", "paddedX", "paddedY", "resultShape", "dims", "maxDim", "d", "resultDtype", "condData", "xData", "yData", "calcStrides", "condStrides", "xStrides", "yStrides", "resultStrides", "totalSize", "condIdx", "xIdx", "yIdx", "searchsorted", "side", "valuesData", "numValues", "v", "lo", "hi", "extract", "count", "count_nonzero", "roundHalfToEven", "x", "floor", "decimal", "around", "a", "decimals", "dtype", "shape", "data", "size", "resultDtype", "result", "ArrayStorage", "resultData", "multiplier", "i", "val", "ceil", "fix", "rint", "trunc", "a", "dtype", "shape", "data", "size", "resultDtype", "result", "ArrayStorage", "resultData", "i", "unique", "a", "returnIndex", "returnInverse", "returnCounts", "dtype", "size", "data", "values", "i", "x", "y", "uniqueValues", "indices", "inverse", "counts", "lastValue", "currentCount", "value", "index", "valueToUniqueIdx", "nanIdx", "v", "val", "uniqueResult", "ArrayStorage", "uniqueData", "result", "indicesResult", "indicesData", "inverseResult", "inverseData", "countsResult", "countsData", "in1d", "ar1", "ar2", "isin", "intersect1d", "unique1", "unique2", "set2", "intersection", "b", "resultData", "element", "testElements", "shape", "testSet", "elementData", "setdiff1d", "diff", "setxor1d", "set1", "xor", "union1d", "unionSet", "unionArr", "diff", "a", "n", "axis", "shape", "ndim", "normalizedAxis", "result", "i", "diffOnce", "axisSize", "resultShape", "dtype", "resultDtype", "isBigIntDType", "ArrayStorage", "resultData", "strides", "resultSize", "resultIdx", "remaining", "indices", "d", "idx1", "idx2", "flatIdx1", "flatIdx2", "val1", "val2", "ediff1d", "ary", "to_end", "to_begin", "flatSize", "diffSize", "beginSize", "endSize", "totalSize", "idx", "val", "gradient", "f", "varargs", "axes", "_", "ax", "normalized", "spacings", "results", "gradientAlongAxis", "spacing", "h", "h2", "flatIdx", "axisIdx", "gradientValue", "idxPlus1", "flatIdxPlus1", "f0", "idxMinus1", "flatIdxMinus1", "fN", "fNm1", "fPlus", "fMinus", "cross", "b", "axisa", "axisb", "_axisc", "shapeA", "shapeB", "ndimA", "ndimB", "normalizedAxisA", "normalizedAxisB", "sizeA", "sizeB", "promoteDTypes", "a0", "a1", "a2", "b0", "b1", "b2", "numVectors", "NDArray", "_NDArray", "storage", "base", "indices", "normalizedIndices", "idx", "dim", "normalized", "value", "currentDtype", "convertedValue", "isBigIntDType", "dtype", "copy", "shape", "size", "Constructor", "getTypedArrayConstructor", "newData", "oldData", "typedOldData", "i", "ArrayStorage", "other", "otherStorage", "resultStorage", "add", "subtract", "multiply", "divide", "mod", "floorDivide", "positive", "reciprocal", "sqrt", "exponent", "exponentStorage", "power", "exp", "exp2", "expm1", "log", "log2", "log10", "log1p", "x2", "x2Storage", "logaddexp", "logaddexp2", "absolute", "negative", "sign", "decimals", "around", "ceil", "fix", "floor", "rint", "trunc", "sin", "cos", "tan", "arcsin", "arccos", "arctan", "arctan2", "hypot", "degrees", "radians", "sinh", "cosh", "tanh", "arcsinh", "arccosh", "arctanh", "greater", "greaterEqual", "less", "lessEqual", "equal", "notEqual", "rtol", "atol", "isclose", "allclose", "bitwise_and", "bitwise_or", "bitwise_xor", "bitwise_not", "invert", "shift", "shiftStorage", "left_shift", "right_shift", "axis", "keepdims", "result", "sum", "mean", "max", "min", "prod", "argmin", "argmax", "ddof", "variance", "std", "all", "any", "cumsum", "cumprod", "ptp", "median", "q", "percentile", "quantile", "weights", "average", "nansum", "nanprod", "nanmean", "nanvar", "nanstd", "nanmin", "nanmax", "nanargmin", "nanargmax", "nancumsum", "nancumprod", "nanmedian", "sort", "argsort", "kth", "partition", "argpartition", "nonzero", "s", "v", "side", "searchsorted", "n", "diff", "newShape", "reshape", "flatten", "ravel", "axes", "transpose", "squeeze", "expandDims", "axis1", "axis2", "swapaxes", "source", "destination", "moveaxis", "repeats", "repeat", "take", "values", "valuesStorage", "put", "matmul", "dot", "trace", "inner", "outer", "tensordot", "cbrt", "fabs", "divisor", "divisorStorage", "quotientStorage", "remainderStorage", "divmod", "square", "remainder", "heaviside", "sliceStrs", "sliceSpecs", "str", "spec", "parseSlice", "normalizeSlice", "newStrides", "newOffset", "stride", "dimSize", "slicedStorage", "j", "start", "stop", "ndim", "buildNestedArray", "arr", "zeros", "DEFAULT_DTYPE", "ones", "inferShape", "data", "current", "containsBigInt", "item", "flattenKeepBigInt", "array", "hasBigInt", "a", "b", "actualDtype", "typedData", "flatData", "bigintData", "val", "boolData", "numData", "arange", "step", "actualStart", "actualStop", "length", "linspace", "num", "logspace", "geomspace", "signStart", "signStop", "logStart", "eye", "m", "k", "cols", "empty", "full", "fill_value", "bigintValue", "identity", "asarray", "zeros_like", "ones_like", "empty_like", "full_like", "asanyarray", "ascontiguousarray", "asfortranarray", "diag", "row", "col", "rows", "startRow", "startCol", "diagLength", "diagflat", "flat", "fromfunction", "fn", "d", "meshgrid", "args", "arrays", "indexing", "arg", "sizes", "outputShape", "results", "inputArr", "inputSize", "broadcastShape", "reshaped", "broadcast_to", "tri", "N", "M", "tril", "outerSize", "temp", "triu", "vander", "x", "increasing", "len", "frombuffer", "buffer", "count", "offset", "arrayBuffer", "byteOffset", "bytesPerElement", "getBytesPerElement", "availableBytes", "maxElements", "numElements", "fromfile", "file", "fromiter", "iter", "fromstring", "string", "sep", "parts", "part", "trimmed", "x1", "floor_divide", "diagonal", "kron", "deg2rad", "rad2deg", "concatenate", "storages", "stack", "vstack", "hstack", "dstack", "split", "indicesOrSections", "array_split", "arraySplit", "vsplit", "hsplit", "tile", "reps", "expand_dims", "flip", "fliplr", "flipud", "rot90", "roll", "rollaxis", "atleast_1d", "atleast1d", "atleast_2d", "atleast2d", "atleast_3d", "atleast3d", "dsplit", "ary", "indices_or_sections", "column_stack", "columnStack", "row_stack", "resize", "new_shape", "append", "valArray", "flatArr", "flatValues", "delete_", "obj", "keepIndices", "normalizedAxis", "axisSize", "keepRanges", "rangeStart", "rangeEnd", "slices", "insert", "before", "after", "pad", "pad_width", "mode", "constant_values", "padWidths", "newSize", "outputData", "isBigInt", "outputIndices", "inOriginal", "sourceIndices", "padBefore", "srcIdx", "mappedIndices", "broadcast_arrays", "broadcast_shapes", "shapes", "broadcastShapes", "choose", "choices", "choiceStorages", "c", "array_equal", "equal_nan", "array_equiv", "a1", "a2", "arrayEquiv", "weightsStorage", "y", "packbits", "bitorder", "unpackbits", "einsum", "subscripts", "operands", "op", "linalg", "axisa", "axisb", "axisc", "cross", "ord", "norm", "vector_norm", "matrix_norm", "qr", "upper", "cholesky", "full_matrices", "compute_uv", "svd", "det", "inv", "solve", "rcond", "lstsq", "p", "cond", "tol", "matrix_rank", "matrix_power", "pinv", "eig", "UPLO", "eigh", "eigvals", "eigvalsh", "take_along_axis", "put_along_axis", "putmask", "mask", "valuesArg", "compress", "condition", "select", "condlist", "choicelist", "defaultVal", "condStorages", "place", "vals", "diag_indices", "diag_indices_from", "tril_indices", "tril_indices_from", "triu_indices", "triu_indices_from", "mask_indices", "mask_func", "dimensions", "ix_", "ravel_multi_index", "multi_index", "dims", "unravel_index", "order", "indicesArg", "lexsort", "keys", "sort_complex", "flatnonzero", "where", "extract", "count_nonzero", "trunc", "x", "NDArray", "unique", "ar", "returnIndex", "returnInverse", "returnCounts", "result", "ArrayStorage", "out", "in1d", "ar1", "ar2", "intersect1d", "isin", "element", "testElements", "setdiff1d", "setxor1d", "union1d", "diff", "a", "n", "axis", "ediff1d", "ary", "to_end", "to_begin", "gradient", "f", "varargs", "s", "cross", "b", "axisa", "axisb", "axisc", "NPY_MAGIC", "SUPPORTED_DTYPES", "isSystemLittleEndian", "buffer", "DESCR_TO_DTYPE", "DTYPE_TO_DESCR", "UNSUPPORTED_DTYPE_PATTERNS", "parseDescriptor", "descr", "UnsupportedDTypeError", "endian", "typeAndSize", "typeChar", "dtype", "isLittleEndian", "dataIsLittleEndian", "dataIsBigEndian", "itemsize", "needsByteSwap", "message", "InvalidNpyError", "parseNpy", "buffer", "bytes", "metadata", "parseNpyHeader", "parseNpyData", "InvalidNpyError", "i", "NPY_MAGIC", "major", "minor", "headerLen", "headerStart", "headerEnd", "headerBytes", "headerStr", "header", "parseHeaderDict", "dataOffset", "dtype", "needsByteSwap", "itemsize", "parseDescriptor", "numElements", "a", "b", "expectedBytes", "actualBytes", "dataBuffer", "typedData", "createTypedArray", "shape", "storage", "reversedShape", "tempStorage", "ArrayStorage", "transposeStorage", "NDArray", "descrMatch", "fortranMatch", "shapeMatch", "descr", "fortran_order", "shapeStr", "n", "Constructor", "getTypedArrayConstructor", "swapped", "start", "j", "ndim", "size", "newData", "newShape", "oldStrides", "computeStrides", "newStrides", "indices", "linearIdx", "remaining", "dimSize", "newLinearIdx", "isBigIntDType", "strides", "stride", "serializeNpy", "arr", "shape", "dtype", "descr", "DTYPE_TO_DESCR", "shapeStr", "headerDict", "PREFIX_LEN", "padding", "headerBytes", "headerLen", "numElements", "itemsize", "getDTypeSize", "dataSize", "totalSize", "output", "NPY_MAGIC", "dataOffset", "writeArrayData", "size", "isLittleEndian", "isSystemLittleEndian", "isBigInt", "isBigIntDType", "storage", "srcData", "srcBytes", "dataView", "i", "value", "offset", "writeBigInt64LE", "writeNumberLE", "view", "unsigned", "CRC32_TABLE", "table", "i", "c", "j", "crc32", "data", "crc", "readZip", "buffer", "entries", "parseZipEntries", "result", "entry", "data", "decompressEntry", "readZipSync", "bytes", "view", "eocdOffset", "i", "centralDirOffset", "numEntries", "centralEntries", "cdOffset", "compressionMethod", "crc32", "compressedSize", "uncompressedSize", "fileNameLength", "extraFieldLength", "commentLength", "localHeaderOffset", "fileNameBytes", "fileName", "ce", "localOffset", "dataStart", "compressedData", "inflateRaw", "ds", "dataCopy", "writer", "reader", "chunks", "done", "value", "totalLength", "sum", "chunk", "offset", "parseNpz", "buffer", "options", "force", "files", "readZip", "parseNpzFromFiles", "parseNpzSync", "readZipSync", "arrays", "skipped", "errors", "fileName", "data", "name", "arr", "parseNpy", "error", "UnsupportedDTypeError", "loadNpz", "result", "loadNpzSync", "writeZip", "files", "options", "compress", "entries", "name", "data", "crc", "crc32", "compressedData", "compressionMethod", "deflateRaw", "localHeadersSize", "entry", "nameBytes", "centralDirSize", "totalSize", "output", "view", "offset", "writeLocalHeader", "centralDirOffset", "writeCentralHeader", "writeEndOfCentralDirectory", "writeZipSync", "numEntries", "cs", "dataCopy", "writer", "reader", "chunks", "done", "value", "totalLength", "sum", "chunk", "result", "serializeNpz", "arrays", "options", "files", "prepareNpzFiles", "writeZip", "serializeNpzSync", "writeZipSync", "i", "arr", "npyData", "serializeNpy", "entries", "name", "fileName", "__version__"]
7
7
  }