deepbox 0.1.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.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  3. package/dist/CSRMatrix-CwGwQRea.d.cts +219 -0
  4. package/dist/CSRMatrix-KzNt6QpS.d.ts +219 -0
  5. package/dist/Tensor-BQLk1ltW.d.cts +147 -0
  6. package/dist/Tensor-g8mUClel.d.ts +147 -0
  7. package/dist/chunk-4S73VUBD.js +677 -0
  8. package/dist/chunk-4S73VUBD.js.map +1 -0
  9. package/dist/chunk-5R4S63PF.js +2925 -0
  10. package/dist/chunk-5R4S63PF.js.map +1 -0
  11. package/dist/chunk-6AE5FKKQ.cjs +9264 -0
  12. package/dist/chunk-6AE5FKKQ.cjs.map +1 -0
  13. package/dist/chunk-AD436M45.js +3854 -0
  14. package/dist/chunk-AD436M45.js.map +1 -0
  15. package/dist/chunk-ALS7ETWZ.cjs +4263 -0
  16. package/dist/chunk-ALS7ETWZ.cjs.map +1 -0
  17. package/dist/chunk-AU7XHGKJ.js +2092 -0
  18. package/dist/chunk-AU7XHGKJ.js.map +1 -0
  19. package/dist/chunk-B5TNKUEY.js +1481 -0
  20. package/dist/chunk-B5TNKUEY.js.map +1 -0
  21. package/dist/chunk-BCR7G3A6.js +9136 -0
  22. package/dist/chunk-BCR7G3A6.js.map +1 -0
  23. package/dist/chunk-C4PKXY74.cjs +1917 -0
  24. package/dist/chunk-C4PKXY74.cjs.map +1 -0
  25. package/dist/chunk-DWZY6PIP.cjs +6400 -0
  26. package/dist/chunk-DWZY6PIP.cjs.map +1 -0
  27. package/dist/chunk-E3EU5FZO.cjs +2113 -0
  28. package/dist/chunk-E3EU5FZO.cjs.map +1 -0
  29. package/dist/chunk-F3JWBINJ.js +1054 -0
  30. package/dist/chunk-F3JWBINJ.js.map +1 -0
  31. package/dist/chunk-FJYLIGJX.js +1940 -0
  32. package/dist/chunk-FJYLIGJX.js.map +1 -0
  33. package/dist/chunk-JSCDE774.cjs +729 -0
  34. package/dist/chunk-JSCDE774.cjs.map +1 -0
  35. package/dist/chunk-LWECRCW2.cjs +2412 -0
  36. package/dist/chunk-LWECRCW2.cjs.map +1 -0
  37. package/dist/chunk-MLBMYKCG.js +6379 -0
  38. package/dist/chunk-MLBMYKCG.js.map +1 -0
  39. package/dist/chunk-OX6QXFMV.cjs +3874 -0
  40. package/dist/chunk-OX6QXFMV.cjs.map +1 -0
  41. package/dist/chunk-PHV2DKRS.cjs +1072 -0
  42. package/dist/chunk-PHV2DKRS.cjs.map +1 -0
  43. package/dist/chunk-PL7TAYKI.js +4056 -0
  44. package/dist/chunk-PL7TAYKI.js.map +1 -0
  45. package/dist/chunk-PR647I7R.js +1898 -0
  46. package/dist/chunk-PR647I7R.js.map +1 -0
  47. package/dist/chunk-QERHVCHC.cjs +2960 -0
  48. package/dist/chunk-QERHVCHC.cjs.map +1 -0
  49. package/dist/chunk-XEG44RF6.cjs +1514 -0
  50. package/dist/chunk-XEG44RF6.cjs.map +1 -0
  51. package/dist/chunk-XMWVME2W.js +2377 -0
  52. package/dist/chunk-XMWVME2W.js.map +1 -0
  53. package/dist/chunk-ZB75FESB.cjs +1979 -0
  54. package/dist/chunk-ZB75FESB.cjs.map +1 -0
  55. package/dist/chunk-ZLW62TJG.cjs +4061 -0
  56. package/dist/chunk-ZLW62TJG.cjs.map +1 -0
  57. package/dist/chunk-ZXKBDFP3.js +4235 -0
  58. package/dist/chunk-ZXKBDFP3.js.map +1 -0
  59. package/dist/core/index.cjs +204 -0
  60. package/dist/core/index.cjs.map +1 -0
  61. package/dist/core/index.d.cts +2 -0
  62. package/dist/core/index.d.ts +2 -0
  63. package/dist/core/index.js +3 -0
  64. package/dist/core/index.js.map +1 -0
  65. package/dist/dataframe/index.cjs +22 -0
  66. package/dist/dataframe/index.cjs.map +1 -0
  67. package/dist/dataframe/index.d.cts +3 -0
  68. package/dist/dataframe/index.d.ts +3 -0
  69. package/dist/dataframe/index.js +5 -0
  70. package/dist/dataframe/index.js.map +1 -0
  71. package/dist/datasets/index.cjs +134 -0
  72. package/dist/datasets/index.cjs.map +1 -0
  73. package/dist/datasets/index.d.cts +3 -0
  74. package/dist/datasets/index.d.ts +3 -0
  75. package/dist/datasets/index.js +5 -0
  76. package/dist/datasets/index.js.map +1 -0
  77. package/dist/index-74AB8Cyh.d.cts +1126 -0
  78. package/dist/index-9oQx1HgV.d.cts +1180 -0
  79. package/dist/index-BJY2SI4i.d.ts +483 -0
  80. package/dist/index-BWGhrDlr.d.ts +733 -0
  81. package/dist/index-B_DK4FKY.d.cts +242 -0
  82. package/dist/index-BbA2Gxfl.d.ts +456 -0
  83. package/dist/index-BgHYAoSS.d.cts +837 -0
  84. package/dist/index-BndMbqsM.d.ts +1439 -0
  85. package/dist/index-C1mfVYoo.d.ts +2517 -0
  86. package/dist/index-CCvlwAmL.d.cts +809 -0
  87. package/dist/index-CDw5CnOU.d.ts +785 -0
  88. package/dist/index-Cn3SdB0O.d.ts +1126 -0
  89. package/dist/index-CrqLlS-a.d.ts +776 -0
  90. package/dist/index-D61yaSMY.d.cts +483 -0
  91. package/dist/index-D9Loo1_A.d.cts +2517 -0
  92. package/dist/index-DIT_OO9C.d.cts +785 -0
  93. package/dist/index-DIp_RrRt.d.ts +242 -0
  94. package/dist/index-DbultU6X.d.cts +1427 -0
  95. package/dist/index-DmEg_LCm.d.cts +776 -0
  96. package/dist/index-DoPWVxPo.d.cts +1439 -0
  97. package/dist/index-DuCxd-8d.d.ts +837 -0
  98. package/dist/index-Dx42TZaY.d.ts +809 -0
  99. package/dist/index-DyZ4QQf5.d.cts +456 -0
  100. package/dist/index-GFAVyOWO.d.ts +1427 -0
  101. package/dist/index-WHQLn0e8.d.cts +733 -0
  102. package/dist/index-ZtI1Iy4L.d.ts +1180 -0
  103. package/dist/index-eJgeni9c.d.cts +1911 -0
  104. package/dist/index-tk4lSYod.d.ts +1911 -0
  105. package/dist/index.cjs +72 -0
  106. package/dist/index.cjs.map +1 -0
  107. package/dist/index.d.cts +17 -0
  108. package/dist/index.d.ts +17 -0
  109. package/dist/index.js +15 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/linalg/index.cjs +86 -0
  112. package/dist/linalg/index.cjs.map +1 -0
  113. package/dist/linalg/index.d.cts +3 -0
  114. package/dist/linalg/index.d.ts +3 -0
  115. package/dist/linalg/index.js +5 -0
  116. package/dist/linalg/index.js.map +1 -0
  117. package/dist/metrics/index.cjs +158 -0
  118. package/dist/metrics/index.cjs.map +1 -0
  119. package/dist/metrics/index.d.cts +3 -0
  120. package/dist/metrics/index.d.ts +3 -0
  121. package/dist/metrics/index.js +5 -0
  122. package/dist/metrics/index.js.map +1 -0
  123. package/dist/ml/index.cjs +87 -0
  124. package/dist/ml/index.cjs.map +1 -0
  125. package/dist/ml/index.d.cts +3 -0
  126. package/dist/ml/index.d.ts +3 -0
  127. package/dist/ml/index.js +6 -0
  128. package/dist/ml/index.js.map +1 -0
  129. package/dist/ndarray/index.cjs +501 -0
  130. package/dist/ndarray/index.cjs.map +1 -0
  131. package/dist/ndarray/index.d.cts +5 -0
  132. package/dist/ndarray/index.d.ts +5 -0
  133. package/dist/ndarray/index.js +4 -0
  134. package/dist/ndarray/index.js.map +1 -0
  135. package/dist/nn/index.cjs +142 -0
  136. package/dist/nn/index.cjs.map +1 -0
  137. package/dist/nn/index.d.cts +6 -0
  138. package/dist/nn/index.d.ts +6 -0
  139. package/dist/nn/index.js +5 -0
  140. package/dist/nn/index.js.map +1 -0
  141. package/dist/optim/index.cjs +77 -0
  142. package/dist/optim/index.cjs.map +1 -0
  143. package/dist/optim/index.d.cts +4 -0
  144. package/dist/optim/index.d.ts +4 -0
  145. package/dist/optim/index.js +4 -0
  146. package/dist/optim/index.js.map +1 -0
  147. package/dist/plot/index.cjs +114 -0
  148. package/dist/plot/index.cjs.map +1 -0
  149. package/dist/plot/index.d.cts +6 -0
  150. package/dist/plot/index.d.ts +6 -0
  151. package/dist/plot/index.js +5 -0
  152. package/dist/plot/index.js.map +1 -0
  153. package/dist/preprocess/index.cjs +82 -0
  154. package/dist/preprocess/index.cjs.map +1 -0
  155. package/dist/preprocess/index.d.cts +4 -0
  156. package/dist/preprocess/index.d.ts +4 -0
  157. package/dist/preprocess/index.js +5 -0
  158. package/dist/preprocess/index.js.map +1 -0
  159. package/dist/random/index.cjs +74 -0
  160. package/dist/random/index.cjs.map +1 -0
  161. package/dist/random/index.d.cts +3 -0
  162. package/dist/random/index.d.ts +3 -0
  163. package/dist/random/index.js +5 -0
  164. package/dist/random/index.js.map +1 -0
  165. package/dist/stats/index.cjs +142 -0
  166. package/dist/stats/index.cjs.map +1 -0
  167. package/dist/stats/index.d.cts +3 -0
  168. package/dist/stats/index.d.ts +3 -0
  169. package/dist/stats/index.js +5 -0
  170. package/dist/stats/index.js.map +1 -0
  171. package/dist/tensor-B96jjJLQ.d.cts +205 -0
  172. package/dist/tensor-B96jjJLQ.d.ts +205 -0
  173. package/package.json +226 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nn/index.ts","../src/nn/module/Module.ts","../src/nn/containers/Sequential.ts","../src/nn/layers/activations.ts","../src/nn/layers/dropout.ts","../src/nn/layers/linear.ts","../src/nn/layers/normalization.ts","../src/nn/layers/attention.ts","../src/nn/layers/conv.ts","../src/nn/layers/recurrent.ts","../src/nn/losses/crossEntropy.ts","../src/nn/losses/index.ts"],"names":["__export","ShapeError","DeepboxError","DTypeError","computeStrides","offsetFromFlatIndex","InvalidParameterError","GradTensor","isDevice","IndexError","relu","sigmoid","tanh","leakyRelu","elu","gelu","softmax","normalizeAxis","logSoftmax","softplus","swish","mish","dropout","randn","mulScalar","parameter","zeros","input2d","output2d","output","reshape","dot","transpose","add","isContiguous","dtypeToTypedArrayCtor","getBigIntElement","getNumericElement","Tensor","ones","mean","ensureNumericDType","variance","noGrad","NotFittedError","im2col","getElementAsNumber","stride0","stride1","sum","shapesEqual","sub","pow","tensor","abs","clip","log","mul","neg","sqrt"],"mappings":"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","file":"chunk-QERHVCHC.cjs","sourcesContent":["// Module base class for neural networks\n\n// Containers\nexport { Sequential } from \"./containers/Sequential\";\n// Activation layers\nexport {\n ELU,\n GELU,\n LeakyReLU,\n LogSoftmax,\n Mish,\n ReLU,\n Sigmoid,\n Softmax,\n Softplus,\n Swish,\n Tanh,\n} from \"./layers/activations\";\n// Attention layers\nexport {\n MultiheadAttention,\n TransformerEncoderLayer,\n} from \"./layers/attention\";\n// Convolutional layers\nexport { AvgPool2d, Conv1d, Conv2d, MaxPool2d } from \"./layers/conv\";\n// Regularization layers\nexport { Dropout } from \"./layers/dropout\";\n// Layers - fully connected / dense layers\nexport { Linear } from \"./layers/linear\";\n// Normalization layers\nexport { BatchNorm1d, LayerNorm } from \"./layers/normalization\";\n// Recurrent layers\nexport { GRU, LSTM, RNN } from \"./layers/recurrent\";\n// Loss functions\nexport {\n binaryCrossEntropyLoss,\n binaryCrossEntropyWithLogitsLoss,\n crossEntropyLoss,\n huberLoss,\n maeLoss,\n mseLoss,\n rmseLoss,\n} from \"./losses/index\";\nexport type { ForwardHook, ForwardPreHook } from \"./module/Module\";\nexport { Module } from \"./module/Module\";\n","import {\n DeepboxError,\n type Device,\n type DType,\n DTypeError,\n InvalidParameterError,\n isDevice,\n ShapeError,\n} from \"../../core\";\nimport { type AnyTensor, GradTensor, type Tensor } from \"../../ndarray\";\nimport { offsetFromFlatIndex } from \"../../ndarray/tensor/strides\";\nimport { computeStrides } from \"../../ndarray/tensor/Tensor\";\n\ntype StateEntry = {\n data: Array<number | string | bigint>;\n dtype: DType;\n shape: number[];\n};\n\nfunction shapesEqual(a: readonly number[], b: readonly number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if ((a[i] ?? 0) !== (b[i] ?? 0)) return false;\n }\n return true;\n}\n\nfunction sizeFromShape(shape: readonly number[], context: string): number {\n let size = 1;\n for (const dim of shape) {\n if (!Number.isInteger(dim) || dim < 0) {\n throw new ShapeError(`${context} contains invalid dimension ${String(dim)}`);\n }\n size *= dim;\n }\n return size;\n}\n\nfunction cloneTensorData(t: Tensor): Array<number | string | bigint> {\n const data = t.data;\n if (Array.isArray(data)) {\n return data.slice();\n }\n if (data instanceof BigInt64Array) {\n return Array.from(data);\n }\n const out = new Array<number>(data.length);\n for (let i = 0; i < data.length; i++) {\n const value = data[i];\n if (value === undefined) {\n throw new DeepboxError(\"Internal error: tensor data access out of bounds\");\n }\n out[i] = value;\n }\n return out;\n}\n\nfunction validateStateEntryShape(\n name: string,\n kind: \"parameter\" | \"buffer\",\n entry: StateEntry\n): void {\n const size = sizeFromShape(entry.shape, `${kind} ${name} shape`);\n if (entry.data.length !== size) {\n throw new ShapeError(\n `${kind} ${name} data length ${entry.data.length} does not match shape size ${size}`\n );\n }\n}\n\nfunction copyStateEntryIntoTensor(\n name: string,\n kind: \"parameter\" | \"buffer\",\n target: Tensor,\n entry: StateEntry\n): void {\n if (!shapesEqual(target.shape, entry.shape)) {\n throw new ShapeError(\n `${kind} ${name} shape mismatch: expected [${target.shape.join(\", \")}], got [${entry.shape.join(\", \")}]`\n );\n }\n if (target.dtype !== entry.dtype) {\n throw new DTypeError(\n `${kind} ${name} dtype mismatch: expected ${target.dtype}, got ${entry.dtype}`\n );\n }\n\n const size = sizeFromShape(entry.shape, `${kind} ${name} shape`);\n const logicalStrides = computeStrides(target.shape);\n const data = target.data;\n\n if (target.dtype === \"string\") {\n if (!Array.isArray(data)) {\n throw new DTypeError(`${kind} ${name} expected string data`);\n }\n for (let i = 0; i < size; i++) {\n const value = entry.data[i];\n if (typeof value !== \"string\") {\n throw new DTypeError(`${kind} ${name} expects string data`);\n }\n const offset = offsetFromFlatIndex(i, logicalStrides, target.strides, target.offset);\n data[offset] = value;\n }\n return;\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < size; i++) {\n const value = entry.data[i];\n if (typeof value !== \"bigint\") {\n throw new DTypeError(`${kind} ${name} expects bigint data`);\n }\n const offset = offsetFromFlatIndex(i, logicalStrides, target.strides, target.offset);\n data[offset] = value;\n }\n return;\n }\n\n if (Array.isArray(data)) {\n throw new DTypeError(`${kind} ${name} expected numeric data`);\n }\n\n for (let i = 0; i < size; i++) {\n const value = entry.data[i];\n if (typeof value !== \"number\") {\n throw new DTypeError(`${kind} ${name} expects numeric data`);\n }\n const offset = offsetFromFlatIndex(i, logicalStrides, target.strides, target.offset);\n data[offset] = value;\n }\n}\n\n/**\n * Hook function called before the forward pass.\n *\n * @param module - The module being called\n * @param inputs - The input tensors to the forward pass\n * @returns Modified inputs array, or undefined to keep original inputs\n */\nexport type ForwardPreHook = (module: Module, inputs: AnyTensor[]) => AnyTensor[] | undefined;\n\n/**\n * Hook function called after the forward pass.\n *\n * @param module - The module being called\n * @param inputs - The input tensors to the forward pass\n * @param output - The output tensor from the forward pass\n * @returns Modified output tensor, or undefined to keep original output\n */\nexport type ForwardHook = (\n module: Module,\n inputs: AnyTensor[],\n output: AnyTensor\n) => AnyTensor | undefined;\n\n/**\n * Base class for all neural network modules.\n *\n * All models should subclass this class. Modules can contain other modules,\n * allowing to nest them in a tree structure.\n *\n * This is analogous to PyTorch's nn.Module.\n *\n * @example\n * ```ts\n * import { Module, Linear, ReLU } from 'deepbox/nn';\n * import type { Tensor } from 'deepbox/ndarray';\n *\n * class MyModel extends Module {\n * private fc1: Linear;\n * private relu: ReLU;\n * private fc2: Linear;\n *\n * constructor() {\n * super();\n * this.fc1 = new Linear(10, 5);\n * this.relu = new ReLU();\n * this.fc2 = new Linear(5, 2);\n * this.registerModule('fc1', this.fc1);\n * this.registerModule('relu', this.relu);\n * this.registerModule('fc2', this.fc2);\n * }\n *\n * forward(x: Tensor): Tensor {\n * let out = this.fc1.forward(x);\n * out = this.relu.forward(out);\n * out = this.fc2.forward(out);\n * return out;\n * }\n * }\n * ```\n *\n * References:\n * - PyTorch nn.Module: https://pytorch.org/docs/stable/generated/torch.nn.Module.html\n *\n * @category Neural Networks\n */\nexport abstract class Module {\n /** Child modules registered to this module - stores nested layers/modules */\n protected _modules: Map<string, Module> = new Map();\n\n /** Parameters of this module - trainable tensors (weights, biases) wrapped as GradTensor */\n protected _parameters: Map<string, GradTensor> = new Map();\n\n /** Buffers (non-trainable tensors) of this module - e.g., running stats in BatchNorm */\n protected _buffers: Map<string, Tensor> = new Map();\n\n /** Training mode flag - affects behavior of layers like Dropout and BatchNorm */\n protected _training = true;\n\n /** Forward pre-hooks registered on this module */\n private _forwardPreHooks: Map<number, ForwardPreHook> = new Map();\n /** Forward hooks registered on this module */\n private _forwardHooks: Map<number, ForwardHook> = new Map();\n /** Incrementing hook id */\n private _nextHookId = 0;\n\n /**\n * Forward pass of the module.\n *\n * Should be overridden by all subclasses. Accepts either regular Tensors\n * or GradTensors for automatic differentiation support.\n *\n * @param inputs - Input tensors (Tensor or GradTensor)\n * @returns Output tensor (Tensor or GradTensor depending on input and layer type)\n *\n * @example\n * ```ts\n * // Using with regular Tensor\n * const output = model.forward(inputTensor);\n *\n * // Using with GradTensor for training\n * const gradOutput = model.forward(gradInput);\n * gradOutput.backward();\n * ```\n */\n abstract forward(...inputs: AnyTensor[]): AnyTensor;\n\n /**\n * Makes the module callable (allows using `module(x)` instead of `module.forward(x)`).\n *\n * @param inputs - Input tensors (Tensor or GradTensor)\n * @returns Output tensor\n */\n call(...inputs: AnyTensor[]): AnyTensor {\n let curInputs = inputs;\n for (const hook of this._forwardPreHooks.values()) {\n const result = hook(this, curInputs);\n if (Array.isArray(result)) {\n curInputs = result;\n }\n }\n let output = this.forward(...curInputs);\n for (const hook of this._forwardHooks.values()) {\n const result = hook(this, curInputs, output);\n if (result !== undefined) {\n output = result;\n }\n }\n return output;\n }\n\n /**\n * Register a child module.\n *\n * @param name - Name of the module\n * @param module - The module to register\n */\n protected registerModule(name: string, module: Module): void {\n // Store the child module in the modules map for hierarchical tracking\n this._modules.set(name, module);\n }\n\n /**\n * Register a parameter (trainable tensor).\n *\n * Parameters must be GradTensor instances with requiresGrad=true for\n * proper gradient computation during backpropagation.\n *\n * @param name - Name of the parameter\n * @param param - The parameter tensor (must be GradTensor)\n */\n protected registerParameter(name: string, param: GradTensor): void {\n // Register a trainable parameter (weight or bias) for optimization\n this._parameters.set(name, param);\n }\n\n /**\n * Register a buffer (non-trainable tensor).\n *\n * Buffers are typically used for running statistics in batch normalization.\n *\n * @param name - Name of the buffer\n * @param buffer - The buffer tensor\n */\n protected registerBuffer(name: string, buffer: Tensor): void {\n // Register a non-trainable buffer (e.g., running mean/variance in BatchNorm)\n // Buffers are saved with the model but not updated by optimizers\n this._buffers.set(name, buffer);\n }\n\n /**\n * Get all parameters of this module and its children.\n *\n * Returns GradTensor instances that are compatible with optimizers.\n * This enables direct usage with optimizer constructors:\n * ```ts\n * const optimizer = new Adam(model.parameters());\n * ```\n *\n * @param recurse - Whether to include parameters of child modules\n * @returns Iterator of GradTensor parameters\n */\n *parameters(recurse = true): Generator<GradTensor> {\n // Yield own parameters first\n for (const param of this._parameters.values()) {\n yield param;\n }\n\n // Recursively yield child module parameters if requested\n // This allows optimizers to access all trainable parameters in the model\n if (recurse) {\n for (const module of this._modules.values()) {\n yield* module.parameters(true);\n }\n }\n }\n\n /**\n * Get all named parameters of this module and its children.\n *\n * @param prefix - Prefix for parameter names\n * @param recurse - Whether to include parameters of child modules\n * @returns Iterator of [name, parameter] pairs\n */\n *namedParameters(prefix = \"\", recurse = true): Generator<[string, GradTensor]> {\n // Yield own parameters with hierarchical naming (e.g., \"fc1.weight\")\n for (const [name, param] of this._parameters.entries()) {\n // Build full parameter name with dot notation for nested modules\n const fullName = prefix ? `${prefix}.${name}` : name;\n yield [fullName, param];\n }\n\n // Recursively yield child module parameters with proper prefixing\n if (recurse) {\n for (const [moduleName, module] of this._modules.entries()) {\n // Extend prefix for nested modules (e.g., \"encoder.fc1\")\n const fullPrefix = prefix ? `${prefix}.${moduleName}` : moduleName;\n yield* module.namedParameters(fullPrefix, true);\n }\n }\n }\n\n /**\n * Get all child modules.\n *\n * @param recurse - Whether to include nested child modules\n * @returns Iterator of modules\n */\n *modules(recurse = true): Generator<Module> {\n // Always yield self first (root of the module tree)\n yield this;\n\n // Recursively yield all child modules in depth-first order\n if (recurse) {\n for (const module of this._modules.values()) {\n yield* module.modules(true);\n }\n }\n }\n\n /**\n * Get all named child modules.\n *\n * @param prefix - Prefix for module names\n * @param recurse - Whether to include nested child modules\n * @returns Iterator of [name, module] pairs\n */\n *namedModules(prefix = \"\", recurse = true): Generator<[string, Module]> {\n // Yield self with current prefix (empty string for root)\n yield [prefix, this];\n\n // Recursively yield child modules with hierarchical naming\n if (recurse) {\n for (const [name, module] of this._modules.entries()) {\n // Build full module path (e.g., \"encoder.layer1\")\n const fullName = prefix ? `${prefix}.${name}` : name;\n yield* module.namedModules(fullName, true);\n }\n }\n }\n\n /**\n * Set the module in training mode.\n *\n * This affects certain layers like Dropout and BatchNorm.\n *\n * @param mode - Training mode (true) or evaluation mode (false)\n * @returns this\n */\n train(mode = true): this {\n // Set training mode for this module\n this._training = mode;\n\n // Recursively propagate training mode to all child modules\n // This ensures layers like Dropout and BatchNorm behave correctly\n for (const module of this._modules.values()) {\n module.train(mode);\n }\n\n // Return this for method chaining (e.g., model.train().forward(x))\n return this;\n }\n\n /**\n * Set the module in evaluation mode.\n *\n * This is equivalent to calling `train(false)`.\n *\n * @returns this\n */\n eval(): this {\n return this.train(false);\n }\n\n /**\n * Check if the module is in training mode.\n *\n * @returns true if in training mode\n */\n get training(): boolean {\n return this._training;\n }\n\n /**\n * Zero out the gradients of all parameters.\n *\n * Call this before each training iteration to prevent gradient accumulation\n * from previous iterations.\n *\n * For parameters wrapped in GradTensor, this calls zeroGrad() on each.\n * For regular Tensors, this is a no-op until they are converted to GradTensor.\n *\n * @example\n * ```ts\n * model.zeroGrad();\n * const output = model.forward(input);\n * // ... compute loss and backward\n * optimizer.step();\n * ```\n */\n zeroGrad(): void {\n // Zero out gradients for all parameters in the module\n // This should be called before each backward pass to prevent gradient accumulation\n for (const param of this.parameters()) {\n // parameters() yields GradTensor instances, so zeroGrad is always available\n param.zeroGrad();\n }\n }\n\n /**\n * Get all buffers of this module and its children.\n */\n *buffers(recurse = true): Generator<Tensor> {\n for (const buffer of this._buffers.values()) {\n yield buffer;\n }\n if (recurse) {\n for (const module of this._modules.values()) {\n yield* module.buffers(true);\n }\n }\n }\n\n /**\n * Get all named buffers of this module and its children.\n */\n *namedBuffers(prefix = \"\", recurse = true): Generator<[string, Tensor]> {\n for (const [name, buffer] of this._buffers.entries()) {\n const fullName = prefix ? `${prefix}.${name}` : name;\n yield [fullName, buffer];\n }\n if (recurse) {\n for (const [moduleName, module] of this._modules.entries()) {\n const fullPrefix = prefix ? `${prefix}.${moduleName}` : moduleName;\n yield* module.namedBuffers(fullPrefix, true);\n }\n }\n }\n\n /**\n * Freeze specific parameters by name (or all if none provided).\n *\n * **⚠️ IMPORTANT**: This method creates new GradTensor instances with updated\n * `requiresGrad` flags. Any external references to the old parameter objects\n * will become stale. If you're using an optimizer that holds parameter references,\n * you should recreate the optimizer after freezing/unfreezing parameters.\n *\n * @param names - Array of parameter names to freeze (e.g., ['fc1.weight']). If undefined, freezes all parameters.\n * @param recurse - Whether to include parameters from child modules (default: true)\n *\n * @example\n * ```ts\n * const model = new MyModel();\n * // Freeze only the first layer's weights\n * model.freezeParameters(['fc1.weight']);\n * // Note: Recreate optimizer after freezing\n * const optimizer = new Adam(model.parameters());\n * ```\n */\n freezeParameters(names?: string[], recurse = true): void {\n this.setRequiresGradForNames(names, false, recurse);\n }\n\n /**\n * Unfreeze specific parameters by name (or all if none provided).\n *\n * **⚠️ IMPORTANT**: This method creates new GradTensor instances with updated\n * `requiresGrad` flags. Any external references to the old parameter objects\n * will become stale. If you're using an optimizer that holds parameter references,\n * you should recreate the optimizer after freezing/unfreezing parameters.\n *\n * @param names - Array of parameter names to unfreeze (e.g., ['fc1.weight']). If undefined, unfreezes all parameters.\n * @param recurse - Whether to include parameters from child modules (default: true)\n *\n * @example\n * ```ts\n * const model = new MyModel();\n * model.freezeParameters(); // Freeze all\n * model.unfreezeParameters(['fc2.weight']); // Unfreeze only fc2 weights\n * // Note: Recreate optimizer after unfreezing\n * const optimizer = new Adam(model.parameters());\n * ```\n */\n unfreezeParameters(names?: string[], recurse = true): void {\n this.setRequiresGradForNames(names, true, recurse);\n }\n\n private setRequiresGradForNames(\n names: string[] | undefined,\n requiresGrad: boolean,\n recurse: boolean\n ): void {\n const providedNames = names !== undefined;\n const targetNames =\n names ?? Array.from(this.namedParameters(\"\", recurse)).map(([name]) => name);\n for (const name of targetNames) {\n const resolved = this.resolveModuleAndName(name);\n if (!resolved) {\n if (providedNames) {\n throw new InvalidParameterError(`Unknown parameter name: ${name}`, \"names\", name);\n }\n continue;\n }\n const { module, localName } = resolved;\n const param = module._parameters.get(localName);\n if (!param) {\n if (providedNames) {\n throw new InvalidParameterError(`Unknown parameter name: ${name}`, \"names\", name);\n }\n continue;\n }\n // Replace parameter to ensure requiresGrad flag change is reflected consistently.\n const nextParam = GradTensor.fromTensor(param.tensor, { requiresGrad });\n module._parameters.set(localName, nextParam);\n for (const [key, value] of Object.entries(module)) {\n if (value === param) {\n Reflect.set(module, key, nextParam);\n }\n }\n }\n }\n\n private resolveModuleAndName(fullName: string): { module: Module; localName: string } | null {\n const parts = fullName.split(\".\");\n let module: Module = this;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i] ?? \"\";\n const child = module._modules.get(part);\n if (!child) return null;\n module = child;\n }\n const localName = parts[parts.length - 1] ?? \"\";\n return { module, localName };\n }\n\n private static setTensorDeviceMetadata(target: Tensor, device: Device): void {\n if (!Reflect.set(target, \"device\", device)) {\n throw new DeepboxError(\"Failed to update tensor device metadata\");\n }\n }\n\n /**\n * Get the state dictionary of the module.\n */\n stateDict(): {\n parameters: Record<string, StateEntry>;\n buffers: Record<string, StateEntry>;\n } {\n const parameters: Record<string, StateEntry> = {};\n const buffers: Record<string, StateEntry> = {};\n\n for (const [name, param] of this.namedParameters()) {\n const t = param.tensor;\n const data = cloneTensorData(t);\n parameters[name] = {\n data,\n shape: [...t.shape],\n dtype: t.dtype,\n };\n }\n\n for (const [name, buffer] of this.namedBuffers()) {\n const data = cloneTensorData(buffer);\n buffers[name] = {\n data,\n shape: [...buffer.shape],\n dtype: buffer.dtype,\n };\n }\n\n return { parameters, buffers };\n }\n\n /**\n * Load state dictionary into the module.\n */\n loadStateDict(stateDict: {\n parameters?: Record<string, StateEntry>;\n buffers?: Record<string, StateEntry>;\n }): void {\n const parameters = stateDict.parameters ?? {};\n const buffers = stateDict.buffers ?? {};\n\n const namedParams = new Map(this.namedParameters());\n const namedBuffs = new Map(this.namedBuffers());\n\n for (const name of namedParams.keys()) {\n if (!(name in parameters)) {\n throw new InvalidParameterError(`missing parameter: ${name}`, \"stateDict.parameters\", name);\n }\n }\n\n for (const name of namedBuffs.keys()) {\n if (!(name in buffers)) {\n throw new InvalidParameterError(`missing buffer: ${name}`, \"stateDict.buffers\", name);\n }\n }\n\n for (const name of Object.keys(parameters)) {\n if (!namedParams.has(name)) {\n throw new InvalidParameterError(\n `unexpected parameter: ${name}`,\n \"stateDict.parameters\",\n name\n );\n }\n }\n\n for (const name of Object.keys(buffers)) {\n if (!namedBuffs.has(name)) {\n throw new InvalidParameterError(`unexpected buffer: ${name}`, \"stateDict.buffers\", name);\n }\n }\n\n for (const [name, entry] of Object.entries(parameters)) {\n const param = namedParams.get(name);\n if (!param) continue;\n validateStateEntryShape(name, \"parameter\", entry);\n copyStateEntryIntoTensor(name, \"parameter\", param.tensor, entry);\n }\n\n for (const [name, entry] of Object.entries(buffers)) {\n const buffer = namedBuffs.get(name);\n if (!buffer) continue;\n validateStateEntryShape(name, \"buffer\", entry);\n copyStateEntryIntoTensor(name, \"buffer\", buffer, entry);\n }\n }\n\n /**\n * Move module to a specific device.\n *\n * **⚠️ WARNING**: This is a metadata-only operation. It updates the device\n * property on parameters and buffers but does NOT actually transfer data\n * between devices. Actual device data transfer requires device-specific\n * memory management which is not yet implemented.\n *\n * This method is provided for API compatibility and future extensibility.\n * Currently, it only updates the `device` metadata field.\n *\n * @param device - Target device identifier (e.g., 'cpu', 'webgpu', 'wasm')\n * @returns this module for method chaining\n *\n * @example\n * ```ts\n * const model = new Linear(10, 5);\n * model.to('webgpu'); // Updates device metadata only\n * ```\n */\n to(device: Device): this {\n if (!isDevice(device)) {\n throw new InvalidParameterError(\"device must be one of: cpu, webgpu, wasm\", \"device\", device);\n }\n\n for (const param of this.parameters()) {\n Module.setTensorDeviceMetadata(param.tensor, device);\n }\n for (const buffer of this.buffers()) {\n Module.setTensorDeviceMetadata(buffer, device);\n }\n return this;\n }\n\n /**\n * Apply a function to all modules recursively.\n */\n apply(fn: (module: Module) => void): this {\n for (const module of this.modules()) {\n fn(module);\n }\n return this;\n }\n\n /**\n * Register a forward pre-hook.\n */\n registerForwardPreHook(hook: ForwardPreHook): () => void {\n const hookId = this._nextHookId++;\n this._forwardPreHooks.set(hookId, hook);\n return () => {\n this._forwardPreHooks.delete(hookId);\n };\n }\n\n /**\n * Register a forward hook.\n */\n registerForwardHook(hook: ForwardHook): () => void {\n const hookId = this._nextHookId++;\n this._forwardHooks.set(hookId, hook);\n return () => {\n this._forwardHooks.delete(hookId);\n };\n }\n\n /**\n * Get string representation of the module.\n *\n * @returns Hierarchical string representation showing module structure\n */\n toString(): string {\n const lines = [`${this.constructor.name}(`];\n\n // Iterate through child modules and format them with indentation\n for (const [name, module] of this._modules.entries()) {\n // Recursively get child module's string representation\n const childLines = module.toString().split(\"\\n\");\n // First line goes on the same line as the name; subsequent lines are indented\n const moduleStr = childLines.map((line, i) => (i === 0 ? line : ` ${line}`)).join(\"\\n\");\n // Format as: (name): ModuleType(...)\n lines.push(` (${name}): ${moduleStr}`);\n }\n\n lines.push(\")\");\n return lines.join(\"\\n\");\n }\n}\n","import { DeepboxError, IndexError, InvalidParameterError } from \"../../core\";\nimport type { AnyTensor } from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\n\n/**\n * Sequential container for stacking layers in a linear pipeline.\n *\n * **Purpose:**\n * - Simplifies model construction by chaining layers sequentially\n * - Automatically manages forward pass through all layers\n * - Provides clean API for building feedforward networks\n *\n * **Behavior:**\n * The output of each layer becomes the input to the next layer.\n * Layers are executed in the order they were added.\n *\n * @example\n * ```ts\n * import { Sequential, Linear, ReLU, Dropout } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * // Create a simple feedforward network\n * const model = new Sequential(\n * new Linear(784, 256),\n * new ReLU(),\n * new Dropout(0.5),\n * new Linear(256, 10)\n * );\n *\n * const input = tensor(new Array(784).fill(0));\n * const output = model.forward(input);\n * ```\n *\n * @example\n * ```ts\n * // Access individual layers\n * const model = new Sequential(\n * new Linear(10, 5),\n * new ReLU()\n * );\n *\n * const firstLayer = model.getLayer(0); // Linear layer\n * const layerCount = model.length; // 2\n * ```\n *\n * References:\n * - PyTorch Sequential: https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html\n * - Keras Sequential: https://keras.io/guides/sequential_model/\n *\n * @category Neural Network Containers\n */\nexport class Sequential extends Module {\n /** Array of layers in sequential order */\n private readonly layers: Module[];\n\n /**\n * Create a new Sequential container.\n *\n * @param layers - Variable number of Module instances to stack sequentially\n * @throws {InvalidParameterError} If no layers are provided\n * @throws {DeepboxError} If a layer is undefined\n */\n constructor(...layers: Module[]) {\n super();\n\n // Validate that at least one layer is provided\n if (layers.length === 0) {\n throw new InvalidParameterError(\n \"Sequential requires at least one layer\",\n \"layers\",\n layers.length\n );\n }\n\n // Store layers in execution order\n this.layers = layers;\n\n // Register each layer as a child module with numeric index as name\n // This enables parameter tracking and hierarchical naming\n for (let i = 0; i < layers.length; i++) {\n const layer = layers[i];\n if (!layer) {\n throw new DeepboxError(`Layer at index ${i} is undefined`);\n }\n this.registerModule(String(i), layer);\n }\n }\n\n /**\n * Forward pass: sequentially apply all layers.\n *\n * The output of each layer becomes the input to the next layer.\n *\n * @param input - Input tensor (Tensor or GradTensor)\n * @returns Output tensor after passing through all layers\n * @throws {InvalidParameterError} If the input count is invalid or a layer returns multiple outputs\n * @throws {DeepboxError} If a layer is undefined\n */\n forward(...inputs: AnyTensor[]): AnyTensor {\n if (inputs.length !== 1) {\n throw new InvalidParameterError(\n \"Sequential.forward expects a single input tensor\",\n \"inputs\",\n inputs.length\n );\n }\n const input = inputs[0];\n if (!input) {\n throw new InvalidParameterError(\n \"Sequential.forward expects a single input tensor\",\n \"input\",\n input\n );\n }\n // Start with the input tensor\n let output = input;\n\n // Sequentially apply each layer's forward pass\n // Each layer transforms the output from the previous layer\n for (let i = 0; i < this.layers.length; i++) {\n const layer = this.layers[i];\n if (!layer) {\n throw new DeepboxError(`Layer at index ${i} is undefined`);\n }\n\n // Apply current layer's transformation\n // Type assertion needed because forward can return Tensor | Tensor[]\n const result = layer.call(output);\n if (Array.isArray(result)) {\n throw new InvalidParameterError(\n `Sequential does not support layers that return multiple tensors (layer ${i})`,\n \"layer\",\n i\n );\n }\n output = result;\n }\n\n // Return final output after all transformations\n return output;\n }\n\n /**\n * Get a layer by index.\n *\n * @param index - Zero-based index of the layer\n * @returns The layer at the specified index\n * @throws {IndexError} If index is out of bounds\n * @throws {DeepboxError} If a layer is undefined\n */\n getLayer(index: number): Module {\n // Validate index is within bounds\n if (index < 0 || index >= this.layers.length) {\n throw new IndexError(`Layer index ${index} out of bounds [0, ${this.layers.length})`, {\n index,\n validRange: [0, this.layers.length - 1],\n });\n }\n\n const layer = this.layers[index];\n if (!layer) {\n throw new DeepboxError(`Layer at index ${index} is undefined`);\n }\n\n return layer;\n }\n\n /**\n * Get the number of layers in the sequential container.\n */\n get length(): number {\n return this.layers.length;\n }\n\n /**\n * Get string representation showing all layers.\n *\n * @returns Multi-line string with each layer on a separate line\n */\n override toString(): string {\n // Build hierarchical representation\n const lines = [\"Sequential(\"];\n\n // Add each layer with its index\n for (let i = 0; i < this.layers.length; i++) {\n const layer = this.layers[i];\n if (!layer) continue;\n\n // Get layer's string representation and indent continuation lines\n const childLines = layer.toString().split(\"\\n\");\n const layerStr = childLines.map((line, idx) => (idx === 0 ? line : ` ${line}`)).join(\"\\n\");\n\n // Format as: (index): LayerType(...)\n lines.push(` (${i}): ${layerStr}`);\n }\n\n lines.push(\")\");\n return lines.join(\"\\n\");\n }\n\n /**\n * Iterate over all layers.\n *\n * @returns Iterator of layers\n */\n *[Symbol.iterator](): Iterator<Module> {\n for (const layer of this.layers) {\n yield layer;\n }\n }\n}\n","import { type Axis, normalizeAxis } from \"../../core\";\nimport { GradTensor, type Tensor } from \"../../ndarray\";\nimport { logSoftmax as gradLogSoftmax, softmax as gradSoftmax } from \"../../ndarray/autograd\";\nimport {\n elu as eluOp,\n gelu as geluOp,\n leakyRelu as leakyReluOp,\n logSoftmax as logSoftmaxOp,\n mish as mishOp,\n relu as reluOp,\n sigmoid as sigmoidOp,\n softmax as softmaxOp,\n softplus as softplusOp,\n swish as swishOp,\n} from \"../../ndarray/ops/activation\";\nimport { tanh as tanhOp } from \"../../ndarray/ops/trigonometry\";\nimport { Module } from \"../module/Module\";\n\n/**\n * Applies the Rectified Linear Unit (ReLU) activation function element-wise.\n *\n * ReLU(x) = max(0, x)\n *\n * @category Neural Network Layers\n */\nexport class ReLU extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.relu();\n return reluOp(input);\n }\n\n override toString(): string {\n return \"ReLU()\";\n }\n}\n\n/**\n * Applies the Sigmoid activation function element-wise.\n *\n * Sigmoid(x) = 1 / (1 + exp(-x))\n *\n * @category Neural Network Layers\n */\nexport class Sigmoid extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.sigmoid();\n return sigmoidOp(input);\n }\n\n override toString(): string {\n return \"Sigmoid()\";\n }\n}\n\n/**\n * Applies the Hyperbolic Tangent (Tanh) activation function element-wise.\n *\n * Tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))\n *\n * @category Neural Network Layers\n */\nexport class Tanh extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.tanh();\n return tanhOp(input);\n }\n\n override toString(): string {\n return \"Tanh()\";\n }\n}\n\n/**\n * Applies the Leaky Rectified Linear Unit (Leaky ReLU) activation.\n *\n * LeakyReLU(x) = max(alpha * x, x)\n *\n * @category Neural Network Layers\n */\nexport class LeakyReLU extends Module {\n private readonly alpha: number;\n\n constructor(alpha = 0.01) {\n super();\n this.alpha = alpha;\n }\n\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.leakyRelu(this.alpha);\n return leakyReluOp(input, this.alpha);\n }\n\n override toString(): string {\n return `LeakyReLU(alpha=${this.alpha})`;\n }\n}\n\n/**\n * Applies the Exponential Linear Unit (ELU) activation.\n *\n * ELU(x) = x if x > 0, else alpha * (exp(x) - 1)\n *\n * @category Neural Network Layers\n */\nexport class ELU extends Module {\n private readonly alpha: number;\n\n constructor(alpha = 1.0) {\n super();\n // Store alpha parameter for negative values\n // ELU can produce negative outputs, pushing mean activations closer to zero\n this.alpha = alpha;\n }\n\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.elu(this.alpha);\n return eluOp(input, this.alpha);\n }\n\n override toString(): string {\n return `ELU(alpha=${this.alpha})`;\n }\n}\n\n/**\n * Applies the Gaussian Error Linear Unit (GELU) activation.\n *\n * GELU(x) = x * Phi(x) where Phi is the CDF of standard normal distribution\n *\n * @category Neural Network Layers\n */\nexport class GELU extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) return input.gelu();\n return geluOp(input);\n }\n\n override toString(): string {\n return \"GELU()\";\n }\n}\n\n/**\n * Applies the Softmax activation function.\n *\n * Softmax(x_i) = exp(x_i) / sum(exp(x_j))\n *\n * @category Neural Network Layers\n */\nexport class Softmax extends Module {\n private readonly axis: Axis;\n\n constructor(axis: Axis = -1) {\n super();\n // Store axis along which to compute softmax\n // Default -1 means last axis (typical for classification)\n this.axis = axis;\n }\n\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) {\n return gradSoftmax(input, normalizeAxis(this.axis, input.tensor.ndim));\n }\n return softmaxOp(input, this.axis);\n }\n\n override toString(): string {\n return `Softmax(axis=${this.axis})`;\n }\n}\n\n/**\n * Applies the Log Softmax activation function.\n *\n * LogSoftmax(x_i) = log(exp(x_i) / sum(exp(x_j)))\n *\n * @category Neural Network Layers\n */\nexport class LogSoftmax extends Module {\n private readonly axis: Axis;\n\n constructor(axis: Axis = -1) {\n super();\n // Store axis for log-softmax computation\n // More numerically stable than log(softmax(x))\n this.axis = axis;\n }\n\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) {\n return gradLogSoftmax(input, normalizeAxis(this.axis, input.tensor.ndim));\n }\n return logSoftmaxOp(input, this.axis);\n }\n\n override toString(): string {\n return `LogSoftmax(axis=${this.axis})`;\n }\n}\n\n/**\n * Applies the Softplus activation function.\n *\n * Softplus(x) = log(1 + exp(x))\n *\n * @category Neural Network Layers\n */\nexport class Softplus extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) {\n return GradTensor.fromTensor(softplusOp(input.tensor), {\n requiresGrad: false,\n });\n }\n return softplusOp(input);\n }\n\n override toString(): string {\n return \"Softplus()\";\n }\n}\n\n/**\n * Applies the Swish activation function (also known as SiLU).\n *\n * Swish(x) = x * sigmoid(x)\n *\n * @category Neural Network Layers\n */\nexport class Swish extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) {\n return GradTensor.fromTensor(swishOp(input.tensor), {\n requiresGrad: false,\n });\n }\n return swishOp(input);\n }\n\n override toString(): string {\n return \"Swish()\";\n }\n}\n\n/**\n * Applies the Mish activation function.\n *\n * Mish(x) = x * tanh(softplus(x))\n *\n * @category Neural Network Layers\n */\nexport class Mish extends Module {\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n if (input instanceof GradTensor) {\n return GradTensor.fromTensor(mishOp(input.tensor), {\n requiresGrad: false,\n });\n }\n return mishOp(input);\n }\n\n override toString(): string {\n return \"Mish()\";\n }\n}\n","import { DTypeError, InvalidParameterError } from \"../../core\";\nimport { type AnyTensor, dropoutGrad, GradTensor } from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\n\n/**\n * Applies Dropout regularization during training.\n *\n * **Mathematical Formulation:**\n * During training:\n * ```\n * y = x * mask / (1 - p)\n * ```\n * where mask is a binary tensor with probability (1-p) of being 1.\n *\n * During evaluation:\n * ```\n * y = x\n * ```\n *\n * **Purpose:**\n * - Prevents overfitting by randomly zeroing elements during training\n * - Forces network to learn redundant representations\n * - Improves generalization performance\n *\n * **Scaling:**\n * The output is scaled by 1/(1-p) during training to maintain expected value.\n * This is called \"inverted dropout\" and eliminates the need for scaling during inference.\n *\n * @example\n * ```ts\n * import { Dropout } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const dropout = new Dropout(0.5); // Drop 50% of neurons\n * const input = tensor([[1, 2, 3, 4]]);\n *\n * // Training mode: randomly zeros ~50% of elements\n * dropout.train();\n * const output = dropout.forward(input);\n *\n * // Evaluation mode: passes input unchanged\n * dropout.eval();\n * const output2 = dropout.forward(input); // Same as input\n * ```\n *\n * References:\n * - Dropout paper: https://jmlr.org/papers/v15/srivastava14a.html\n * - PyTorch Dropout: https://pytorch.org/docs/stable/generated/torch.nn.Dropout.html\n *\n * @category Neural Network Layers\n */\nexport class Dropout extends Module {\n /** Probability of an element being zeroed (dropout rate) */\n private readonly p: number;\n\n /**\n * Create a new Dropout layer.\n *\n * @param p - Probability of an element being zeroed (0 <= p < 1)\n * @throws {InvalidParameterError} If p is not in valid range [0, 1)\n */\n constructor(p = 0.5) {\n super();\n\n // Validate dropout probability is in valid range\n if (!Number.isFinite(p) || p < 0 || p >= 1) {\n throw new InvalidParameterError(`Dropout probability must be in [0, 1), got ${p}`, \"p\", p);\n }\n\n this.p = p;\n }\n\n /**\n * Forward pass: apply dropout during training, identity during evaluation.\n *\n * @param input - Input tensor of any shape (Tensor or GradTensor)\n * @returns Output tensor with same shape as input\n */\n forward(input: AnyTensor): GradTensor {\n // Convert to GradTensor if needed\n const inputTensor = input instanceof GradTensor ? input : GradTensor.fromTensor(input);\n\n if (inputTensor.dtype === \"string\") {\n throw new DTypeError(\"Dropout does not support string dtype\");\n }\n\n // Use vectorized dropout implementation from autograd\n // This handles training/eval mode and mask generation\n return dropoutGrad(inputTensor, this.p, this.training);\n }\n\n /**\n * Get string representation of the layer.\n *\n * @returns String representation with dropout probability\n */\n override toString(): string {\n return `Dropout(p=${this.p})`;\n }\n\n /**\n * Get the dropout probability.\n */\n get dropoutRate(): number {\n return this.p;\n }\n}\n","import { DTypeError, InvalidParameterError, ShapeError } from \"../../core\";\nimport type { Tensor } from \"../../ndarray\";\nimport {\n add,\n dot,\n GradTensor,\n mulScalar,\n parameter,\n randn,\n reshape,\n transpose,\n zeros,\n} from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\n\n/**\n * Applies a linear transformation to the incoming data: y = xA^T + b\n *\n * This is also known as a fully connected layer or dense layer.\n *\n * **Mathematical Formulation:**\n * ```\n * y = x * W^T + b\n * ```\n *\n * Where:\n * - x is the input tensor of shape (*, in_features)\n * - W is the weight matrix of shape (out_features, in_features)\n * - b is the bias vector of shape (out_features,)\n * - y is the output tensor of shape (*, out_features)\n *\n * **Shape Conventions:**\n * - Input: `(*, in_features)` where `*` means any number of leading dimensions\n * - 1D: `(in_features)` → Output: `(out_features)`\n * - 2D: `(batch, in_features)` → Output: `(batch, out_features)`\n * - 3D: `(batch, seq_len, in_features)` → Output: `(batch, seq_len, out_features)`\n * - The last dimension must equal `in_features`\n * - All leading dimensions are preserved in the output\n *\n * **Parameters:**\n * - `inFeatures`: Size of each input sample\n * - `outFeatures`: Size of each output sample\n * - `bias`: If true, adds a learnable bias to the output\n *\n * **Attributes:**\n * - `weight`: Learnable weights of shape (out_features, in_features)\n * - `bias`: Learnable bias of shape (out_features,) if bias=true\n *\n * **Initialization:**\n * Uses Kaiming/He initialization: weights ~ N(0, sqrt(2/in_features))\n * Biases are initialized to zeros\n *\n * @example\n * ```ts\n * import { Linear } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * // Create a linear layer with 20 input features and 30 output features\n * const layer = new Linear(20, 30);\n *\n * // Forward pass\n * const input = tensor([[1, 2, ..., 20]]); // shape: (1, 20)\n * const output = layer.forward(input); // shape: (1, 30)\n *\n * // Without bias\n * const layerNoBias = new Linear(10, 5, { bias: false });\n * ```\n *\n * References:\n * - PyTorch Linear: https://pytorch.org/docs/stable/generated/torch.nn.Linear.html\n * - Xavier/Glorot initialization: http://proceedings.mlr.press/v9/glorot10a.html\n *\n * @category Neural Network Layers\n */\nexport class Linear extends Module {\n /** Weight matrix of shape (out_features, in_features) */\n private weight: Tensor;\n private weightParam: GradTensor;\n\n /** Bias vector of shape (out_features,) */\n private bias?: Tensor;\n private biasParam?: GradTensor;\n\n /** Number of input features */\n private readonly inFeatures: number;\n\n /** Number of output features */\n private readonly outFeatures: number;\n\n /** Whether this layer has a bias */\n private readonly useBias: boolean;\n\n /**\n * Create a new Linear layer.\n *\n * @param inFeatures - Size of each input sample\n * @param outFeatures - Size of each output sample\n * @param options - Configuration options\n * @param options.bias - If true, add learnable bias (default: true)\n * @param options.dtype - Data type for weights (default: 'float32')\n * @param options.device - Device to place tensors on (default: 'cpu')\n */\n constructor(\n inFeatures: number,\n outFeatures: number,\n options: {\n readonly bias?: boolean;\n readonly dtype?: \"float32\" | \"float64\";\n readonly device?: \"cpu\" | \"webgpu\" | \"wasm\";\n } = {}\n ) {\n // Call parent Module constructor to initialize base class\n super();\n\n // Validate dimensions\n if (inFeatures <= 0 || !Number.isInteger(inFeatures)) {\n throw new InvalidParameterError(\n \"inFeatures must be a positive integer\",\n \"inFeatures\",\n inFeatures\n );\n }\n if (outFeatures <= 0 || !Number.isInteger(outFeatures)) {\n throw new InvalidParameterError(\n \"outFeatures must be a positive integer\",\n \"outFeatures\",\n outFeatures\n );\n }\n\n // Store layer dimensions for validation and access\n this.inFeatures = inFeatures;\n this.outFeatures = outFeatures;\n // Default to using bias unless explicitly disabled\n this.useBias = options.bias ?? true;\n\n // Initialize weights using Kaiming initialization (He initialization)\n // This initialization is optimal for ReLU activations\n // Standard deviation: sqrt(2 / fan_in) where fan_in = inFeatures\n const stdDev = Math.sqrt(2.0 / inFeatures);\n\n // Create weight matrix with shape (out_features, in_features)\n // Transposed storage allows efficient matrix multiplication: y = x * W^T\n const weightTensor = randn([outFeatures, inFeatures], {\n dtype: options.dtype ?? \"float32\",\n device: options.device ?? \"cpu\",\n });\n\n // Scale the randomly initialized weights by the computed standard deviation\n // This ensures proper gradient flow during backpropagation\n const scaledWeight = mulScalar(weightTensor, stdDev);\n this.weightParam = parameter(scaledWeight);\n this.weight = this.weightParam.tensor;\n\n // Register weight as a trainable parameter for optimizer access\n this.registerParameter(\"weight\", this.weightParam);\n\n // Initialize bias to zeros if enabled (common practice)\n // Bias allows the layer to shift the output independently of input\n if (this.useBias) {\n // Bias has shape (out_features,) - one value per output neuron\n const biasTensor = zeros([outFeatures], {\n dtype: options.dtype ?? \"float32\",\n device: options.device ?? \"cpu\",\n });\n this.biasParam = parameter(biasTensor);\n this.bias = this.biasParam.tensor;\n // Register bias as a trainable parameter\n this.registerParameter(\"bias\", this.biasParam);\n }\n }\n\n /**\n * Forward pass: compute y = x * W^T + b\n *\n * @param input - Input tensor of shape (*, in_features)\n * @returns Output tensor of shape (*, out_features)\n * @throws {ShapeError} If input shape is invalid\n * @throws {DTypeError} If input dtype is unsupported\n */\n forward(input: GradTensor): GradTensor;\n forward(input: Tensor): Tensor;\n forward(input: Tensor | GradTensor): Tensor | GradTensor {\n const inputTensor = input instanceof GradTensor ? input.tensor : input;\n\n if (inputTensor.dtype === \"string\") {\n throw new DTypeError(\"Linear layer does not support string dtype\");\n }\n\n // Validate input dimensionality - must be at least 1D\n // 0D (scalar) inputs are not valid for linear transformations\n if (inputTensor.ndim < 1) {\n throw new ShapeError(`Linear layer expects at least 1D input; got ndim=${inputTensor.ndim}`);\n }\n\n // Extract the last dimension size (number of features)\n // For input shape (batch, seq_len, features), this gets 'features'\n const inputFeatures = inputTensor.shape[inputTensor.shape.length - 1] ?? 0;\n\n // Validate that input features match the layer's expected input size\n if (inputFeatures !== this.inFeatures) {\n throw new ShapeError(\n `Linear layer expects ${this.inFeatures} input features; got ${inputFeatures}`\n );\n }\n\n // Compute the linear transformation: y = x * W^T + b\n // Weight is stored as (out_features, in_features), so we transpose it\n // This allows efficient computation: (batch, in_features) @ (in_features, out_features)\n\n // Check if input is a 1D vector (no batch dimension)\n const isVectorInput = inputTensor.ndim === 1;\n\n // Calculate total batch size (handles multi-dimensional batches)\n // For shape (batch, seq, features): batchSize = batch * seq\n const batchSize = inputTensor.size / this.inFeatures;\n\n // Reshape input to 2D: (batchSize, inFeatures) for matrix multiplication\n const outputShape = isVectorInput\n ? [this.outFeatures]\n : [...inputTensor.shape.slice(0, -1), this.outFeatures];\n\n if (input instanceof GradTensor) {\n const input2d = input.reshape([batchSize, this.inFeatures]);\n const output2d = input2d.matmul(this.weightParam.transpose());\n let output = output2d.reshape(outputShape);\n if (this.useBias && this.biasParam) {\n output = output.add(this.biasParam);\n }\n return output;\n }\n\n const input2d = reshape(inputTensor, [batchSize, this.inFeatures]);\n\n // Perform matrix multiplication: (batchSize, inFeatures) @ (inFeatures, outFeatures)\n // Result shape: (batchSize, outFeatures)\n const output2d = dot(input2d, transpose(this.weight));\n\n // Restore original batch shape, replacing last dimension with outFeatures\n // If input was 1D, output should be 1D; if (batch, features), output is (batch, outFeatures)\n const output = reshape(output2d, outputShape);\n\n // Add bias term if enabled\n if (this.useBias && this.bias) {\n // Broadcasting automatically handles all batch dimensions\n // Bias shape (outFeatures,) broadcasts to (..., outFeatures)\n return add(output, this.bias);\n }\n\n // Return output without bias\n return output;\n }\n\n /**\n * Get extra representation string for this layer.\n *\n * @returns String representation of layer parameters\n */\n override toString(): string {\n const biasStr = this.useBias ? \"bias=true\" : \"bias=false\";\n return `Linear(in_features=${this.inFeatures}, out_features=${this.outFeatures}, ${biasStr})`;\n }\n\n /**\n * Get the weight matrix.\n *\n * @returns Weight tensor of shape (out_features, in_features)\n */\n getWeight(): Tensor {\n return this.weight;\n }\n\n /**\n * Get the bias vector.\n *\n * @returns Bias tensor of shape (out_features,) or undefined if no bias\n */\n getBias(): Tensor | undefined {\n return this.bias;\n }\n\n /**\n * Get the number of input features.\n */\n get inputSize(): number {\n return this.inFeatures;\n }\n\n /**\n * Get the number of output features.\n */\n get outputSize(): number {\n return this.outFeatures;\n }\n}\n","import {\n DTypeError,\n dtypeToTypedArrayCtor,\n ensureNumericDType,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n ShapeError,\n} from \"../../core\";\nimport {\n type AnyTensor,\n GradTensor,\n noGrad,\n ones,\n parameter,\n varianceGrad,\n zeros,\n} from \"../../ndarray\";\nimport { isContiguous, offsetFromFlatIndex } from \"../../ndarray/tensor/strides\";\nimport { computeStrides, Tensor as TensorClass } from \"../../ndarray/tensor/Tensor\";\nimport { Module } from \"../module/Module\";\n\nfunction toContiguousTensor(t: TensorClass): TensorClass {\n if (isContiguous(t.shape, t.strides)) {\n return t;\n }\n if (t.dtype === \"string\") {\n throw new DTypeError(\"Normalization does not support string dtype\");\n }\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const data = t.data;\n\n if (Array.isArray(data)) {\n throw new DTypeError(\"Normalization does not support string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n if (!(out instanceof BigInt64Array)) {\n throw new DTypeError(\"Expected int64 output buffer for int64 tensor\");\n }\n for (let i = 0; i < t.size; i++) {\n const offset = offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = getBigIntElement(data, offset);\n }\n } else {\n if (out instanceof BigInt64Array) {\n throw new DTypeError(\"Unexpected int64 output buffer for numeric tensor\");\n }\n for (let i = 0; i < t.size; i++) {\n const offset = offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = getNumericElement(data, offset);\n }\n }\n\n return TensorClass.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Batch Normalization layer.\n *\n * Normalizes the input over the batch dimension for faster and more stable training.\n *\n * **Formula**: y = (x - E[x]) / sqrt(Var[x] + eps) * gamma + beta\n *\n * During training, uses batch statistics. During evaluation, uses running statistics\n * unless `trackRunningStats=false`, in which case batch statistics are always used.\n *\n * @example\n * ```ts\n * import { BatchNorm1d } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const bn = new BatchNorm1d(10);\n * const x = tensor([[1, 2, 3], [4, 5, 6]]);\n * const y = bn.forward(x);\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm1d.html | PyTorch BatchNorm1d}\n */\nexport class BatchNorm1d extends Module {\n private readonly numFeatures: number;\n private readonly eps: number;\n private readonly momentum: number;\n private readonly affine: boolean;\n private readonly trackRunningStats: boolean;\n\n private gamma?: GradTensor;\n private beta?: GradTensor;\n private runningMean: GradTensor;\n private runningVar: GradTensor;\n\n constructor(\n numFeatures: number,\n options: {\n readonly eps?: number;\n readonly momentum?: number;\n readonly affine?: boolean;\n readonly trackRunningStats?: boolean;\n } = {}\n ) {\n super();\n if (\n !Number.isFinite(numFeatures) ||\n numFeatures <= 0 ||\n Math.trunc(numFeatures) !== numFeatures\n ) {\n throw new InvalidParameterError(\n \"numFeatures must be a positive integer\",\n \"numFeatures\",\n numFeatures\n );\n }\n this.numFeatures = numFeatures;\n this.eps = options.eps ?? 1e-5;\n if (!Number.isFinite(this.eps) || this.eps <= 0) {\n throw new InvalidParameterError(\"eps must be a positive number\", \"eps\", this.eps);\n }\n this.momentum = options.momentum ?? 0.1;\n if (!Number.isFinite(this.momentum) || this.momentum < 0 || this.momentum > 1) {\n throw new InvalidParameterError(\n \"momentum must be in range [0, 1]\",\n \"momentum\",\n this.momentum\n );\n }\n this.affine = options.affine ?? true;\n this.trackRunningStats = options.trackRunningStats ?? true;\n\n if (this.affine) {\n const gamma = ones([numFeatures]);\n const beta = zeros([numFeatures]);\n this.gamma = parameter(gamma);\n this.beta = parameter(beta);\n this.registerParameter(\"weight\", this.gamma);\n this.registerParameter(\"bias\", this.beta);\n }\n\n // buffers\n this.runningMean = GradTensor.fromTensor(zeros([numFeatures]), {\n requiresGrad: false,\n });\n this.runningVar = GradTensor.fromTensor(ones([numFeatures]), {\n requiresGrad: false,\n });\n\n if (this.trackRunningStats) {\n this.registerBuffer(\"running_mean\", this.runningMean.tensor);\n this.registerBuffer(\"running_var\", this.runningVar.tensor);\n }\n }\n\n forward(x: AnyTensor): GradTensor {\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n const inputDtype = input.dtype;\n if (inputDtype === \"string\") {\n throw new DTypeError(\"BatchNorm1d does not support string dtype\");\n }\n\n if (input.ndim !== 2 && input.ndim !== 3) {\n throw new ShapeError(`BatchNorm1d expects 2D or 3D input; got ndim=${input.ndim}`);\n }\n\n const nFeatures = input.shape[1] ?? 0;\n if (nFeatures !== this.numFeatures) {\n throw new ShapeError(`Expected ${this.numFeatures} features, got ${nFeatures}`);\n }\n\n const useBatchStats = this.training || !this.trackRunningStats;\n\n let mean: GradTensor;\n let varVal: GradTensor;\n\n // We need to reduce over all dims except channel (dim 1).\n // For 2D (N, C): reduce over 0.\n // For 3D (N, C, L): reduce over 0 and 2.\n // To use single variance op, we reshape to (N*L, C) or (C, N*L).\n // Better to reshape to (BatchTotal, C) and reduce over 0.\n // For 2D: already (N, C).\n // For 3D: permute to (N, L, C) -> reshape (N*L, C).\n\n let inputReshaped = input;\n if (input.ndim === 3) {\n // (N, C, L) -> (N, L, C) -> (N*L, C)\n const batch = input.shape[0] ?? 0;\n const length = input.shape[2] ?? 0;\n const flat = batch * length;\n const numericInputDtype = ensureNumericDType(inputDtype, \"BatchNorm1d\");\n inputReshaped = input\n .transpose([0, 2, 1])\n .mul(GradTensor.scalar(1, { dtype: numericInputDtype }))\n .reshape([flat, nFeatures]);\n }\n\n if (useBatchStats) {\n if (inputReshaped.shape[0] === 0) {\n throw new InvalidParameterError(\n \"BatchNorm requires at least one element\",\n \"input\",\n input.shape\n );\n }\n\n // Compute batch statistics (biased variance for normalization, per PyTorch convention)\n mean = inputReshaped.mean(0);\n varVal = varianceGrad(inputReshaped, 0, 0);\n\n if (this.trackRunningStats) {\n noGrad(() => {\n // Use unbiased variance (Bessel's correction) for running stats update\n const n = inputReshaped.shape[0] ?? 0;\n const unbiasedVar =\n n > 1 ? varianceGrad(inputReshaped, 0, 1) : varianceGrad(inputReshaped, 0, 0);\n\n const m = this.momentum;\n const statsDtype = this.runningMean.dtype;\n if (statsDtype === \"string\") {\n throw new DTypeError(\"BatchNorm running statistics must be numeric\");\n }\n const oneMinusM = GradTensor.scalar(1 - m, { dtype: statsDtype });\n const mScalar = GradTensor.scalar(m, { dtype: statsDtype });\n\n // Exponential moving average: running = (1 - momentum) * running + momentum * batch\n const newMean = this.runningMean.mul(oneMinusM).add(mean.mul(mScalar));\n const newVar = this.runningVar.mul(oneMinusM).add(unbiasedVar.mul(mScalar));\n\n // Detach to prevent graph history in running stats\n this.runningMean = GradTensor.fromTensor(newMean.tensor, {\n requiresGrad: false,\n });\n this.runningVar = GradTensor.fromTensor(newVar.tensor, {\n requiresGrad: false,\n });\n\n // Re-register buffers to keep Module._buffers map in sync\n this.registerBuffer(\"running_mean\", this.runningMean.tensor);\n this.registerBuffer(\"running_var\", this.runningVar.tensor);\n });\n }\n } else {\n mean = this.runningMean;\n varVal = this.runningVar;\n }\n\n // Normalize: (x - mean) / sqrt(var + eps)\n // We need to broadcast mean/var to input shape.\n // Input: (N, C) or (N, C, L). Mean/Var: (C).\n // For (N, C), broadcasting (C) works (last dim matches).\n // For (N, C, L), we need (1, C, 1).\n\n let meanBroadcast = mean;\n let varBroadcast = varVal;\n\n if (input.ndim === 3) {\n meanBroadcast = mean.reshape([1, nFeatures, 1]);\n varBroadcast = varVal.reshape([1, nFeatures, 1]);\n } else {\n meanBroadcast = mean.reshape([1, nFeatures]);\n varBroadcast = varVal.reshape([1, nFeatures]);\n }\n\n const epsTensor = GradTensor.scalar(this.eps, { dtype: inputDtype });\n const denom = varBroadcast.add(epsTensor).sqrt();\n let out = input.sub(meanBroadcast).div(denom);\n\n if (this.affine && this.gamma && this.beta) {\n let gammaB = this.gamma;\n let betaB = this.beta;\n if (input.ndim === 3) {\n gammaB = this.gamma.reshape([1, nFeatures, 1]);\n betaB = this.beta.reshape([1, nFeatures, 1]);\n } else {\n gammaB = this.gamma.reshape([1, nFeatures]);\n betaB = this.beta.reshape([1, nFeatures]);\n }\n out = out.mul(gammaB).add(betaB);\n }\n\n return out;\n }\n\n override toString(): string {\n return `BatchNorm1d(${this.numFeatures}, eps=${this.eps}, momentum=${this.momentum}, affine=${this.affine})`;\n }\n}\n\n/**\n * Layer Normalization.\n *\n * Normalizes across the feature dimensions (trailing dimensions specified by `normalizedShape`)\n * for each sample independently. Unlike BatchNorm, LayerNorm works the same way during training\n * and evaluation.\n *\n * **Formula**: y = (x - E[x]) / sqrt(Var[x] + eps) * gamma + beta\n *\n * @example\n * ```ts\n * import { LayerNorm } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const ln = new LayerNorm([10]);\n * const x = tensor([[1, 2, 3]]);\n * const y = ln.forward(x);\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html | PyTorch LayerNorm}\n */\nexport class LayerNorm extends Module {\n private readonly normalizedShape: readonly number[];\n private readonly eps: number;\n private readonly elementwiseAffine: boolean;\n\n private gamma?: GradTensor;\n private beta?: GradTensor;\n\n constructor(\n normalizedShape: number | readonly number[],\n options: {\n readonly eps?: number;\n readonly elementwiseAffine?: boolean;\n } = {}\n ) {\n super();\n this.normalizedShape =\n typeof normalizedShape === \"number\" ? [normalizedShape] : Array.from(normalizedShape);\n\n if (this.normalizedShape.length === 0) {\n throw new InvalidParameterError(\n \"normalizedShape must contain at least one dimension\",\n \"normalizedShape\",\n normalizedShape\n );\n }\n\n for (const dim of this.normalizedShape) {\n if (!Number.isFinite(dim) || dim <= 0 || Math.trunc(dim) !== dim) {\n throw new InvalidParameterError(\n \"All dimensions in normalizedShape must be positive integers\",\n \"normalizedShape\",\n normalizedShape\n );\n }\n }\n\n this.eps = options.eps ?? 1e-5;\n if (!Number.isFinite(this.eps) || this.eps <= 0) {\n throw new InvalidParameterError(\"eps must be a positive number\", \"eps\", this.eps);\n }\n\n this.elementwiseAffine = options.elementwiseAffine ?? true;\n\n if (this.elementwiseAffine) {\n this.gamma = parameter(ones(this.normalizedShape));\n this.beta = parameter(zeros(this.normalizedShape));\n this.registerParameter(\"weight\", this.gamma);\n this.registerParameter(\"bias\", this.beta);\n }\n }\n\n forward(x: AnyTensor): GradTensor {\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n const inputDtype = input.dtype;\n if (inputDtype === \"string\") {\n throw new DTypeError(\"LayerNorm does not support string dtype\");\n }\n\n let workingInput = input;\n if (!isContiguous(input.tensor.shape, input.tensor.strides)) {\n const contiguous = toContiguousTensor(input.tensor);\n workingInput = GradTensor.fromTensor(contiguous, {\n requiresGrad: input.requiresGrad,\n });\n }\n\n // Check if input shape ends with normalizedShape\n const inputShape = workingInput.shape;\n const normShape = this.normalizedShape;\n if (normShape.length > inputShape.length) {\n throw new ShapeError(`Input shape ${inputShape} too small for normalizedShape ${normShape}`);\n }\n\n // Check suffix\n const suffixStart = inputShape.length - normShape.length;\n for (let i = 0; i < normShape.length; i++) {\n if (inputShape[suffixStart + i] !== normShape[i]) {\n throw new ShapeError(\n `Input shape ${inputShape} does not end with normalizedShape ${normShape}`\n );\n }\n }\n\n // We need to flatten the normalized dimensions to calculate mean/var over them.\n // Dimensions to reduce: [suffixStart, ..., inputShape.length - 1]\n // We can reshape input to (..., Product(normShape)).\n // Then reduce over last dimension.\n\n const outerDims = inputShape.slice(0, suffixStart);\n const normSize = normShape.reduce((a, b) => a * b, 1);\n\n const flattenedShape = [...outerDims, normSize];\n const inputReshaped = workingInput.reshape(flattenedShape);\n\n // Mean and Var over last dim (-1)\n const mean = inputReshaped.mean(-1, true); // Keep dims to facilitate broadcasting (..., 1)\n const varVal = varianceGrad(inputReshaped, -1, 0); // Biased variance for normalization\n // varianceGrad returns tensor with reduced dim removed?\n // Wait, varianceGrad(..., axis) removes the axis unless keepdims?\n // My implementation of `varianceGrad` calls `mean` and `sum`.\n // `mean(axis)` removes dim unless `keepdims=true`.\n // `varianceGrad` implementation in `autograd`:\n // It doesn't take `keepdims` param. It reduces.\n // So `varVal` has shape (...,).\n // We need to reshape it to (..., 1) for broadcasting.\n\n const varReshaped = varVal.reshape(mean.shape); // mean has kept dims\n\n // Normalize\n const epsTensor = GradTensor.scalar(this.eps, { dtype: inputDtype });\n const denom = varReshaped.add(epsTensor).sqrt();\n const normalizedReshaped = inputReshaped.sub(mean).div(denom);\n\n // Reshape back to original shape\n let out = normalizedReshaped.reshape(inputShape);\n\n // Apply affine\n if (this.elementwiseAffine && this.gamma && this.beta) {\n // gamma/beta shape: normShape\n // input shape: (..., normShape)\n // Broadcasting works automatically since trailing dims match.\n out = out.mul(this.gamma).add(this.beta);\n }\n\n return out;\n }\n\n override toString(): string {\n return `LayerNorm(${this.normalizedShape}, eps=${this.eps}, elementwise_affine=${this.elementwiseAffine})`;\n }\n}\n","import { DTypeError, ensureNumericDType, InvalidParameterError, ShapeError } from \"../../core\";\nimport {\n type AnyTensor,\n dropoutGrad,\n GradTensor,\n mulScalar,\n parameter,\n randn,\n softmaxGrad,\n zeros,\n} from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\nimport { Dropout } from \"./dropout\";\nimport { Linear } from \"./linear\";\nimport { LayerNorm } from \"./normalization\";\n\n/**\n * Multi-Head Attention mechanism.\n *\n * Allows the model to jointly attend to information from different representation\n * subspaces at different positions. This is the core building block of Transformers.\n *\n * **Mathematical Formulation**:\n * ```\n * Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V\n * MultiHead(Q, K, V) = Concat(head_1, ..., head_h) * W_O\n * where head_i = Attention(Q * W_Q^i, K * W_K^i, V * W_V^i)\n * ```\n *\n * @example\n * ```ts\n * import { MultiheadAttention } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const mha = new MultiheadAttention(512, 8);\n * const x = tensor([[/* ... sequence data ... *\\/]]);\n * const output = mha.forward(x, x, x);\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html | PyTorch MultiheadAttention}\n * @see Vaswani et al. (2017) \"Attention Is All You Need\"\n */\nexport class MultiheadAttention extends Module {\n /** Embedding dimension */\n private readonly embedDim: number;\n\n /** Number of attention heads */\n private readonly numHeads: number;\n\n /** Dimension of each head */\n private readonly headDim: number;\n\n /** Scaling factor for dot product attention */\n private readonly scale: number;\n\n /** Whether to add bias to projections */\n private readonly useBias: boolean;\n\n /** Dropout probability applied to attention weights */\n private readonly dropout: number;\n\n /** Query projection weights (embedDim, embedDim) */\n private wQ: GradTensor;\n private bQ?: GradTensor;\n\n /** Key projection weights (embedDim, embedDim) */\n private wK: GradTensor;\n private bK?: GradTensor;\n\n /** Value projection weights (embedDim, embedDim) */\n private wV: GradTensor;\n private bV?: GradTensor;\n\n /** Output projection weights (embedDim, embedDim) */\n private wO: GradTensor;\n private bO?: GradTensor;\n\n /**\n * Create a new MultiheadAttention layer.\n *\n * @param embedDim - Total dimension of the model (must be divisible by numHeads)\n * @param numHeads - Number of parallel attention heads\n * @param options - Configuration options\n * @param options.bias - Whether to add bias to projections (default: true)\n * @param options.dropout - Dropout probability applied to attention weights (default: 0.0)\n */\n constructor(\n embedDim: number,\n numHeads: number,\n options: {\n readonly bias?: boolean;\n readonly dropout?: number;\n } = {}\n ) {\n super();\n\n if (!Number.isInteger(embedDim) || embedDim <= 0) {\n throw new InvalidParameterError(\"embedDim must be a positive integer\", \"embedDim\", embedDim);\n }\n if (!Number.isInteger(numHeads) || numHeads <= 0) {\n throw new InvalidParameterError(\"numHeads must be a positive integer\", \"numHeads\", numHeads);\n }\n if (embedDim % numHeads !== 0) {\n throw new InvalidParameterError(\n `embedDim (${embedDim}) must be divisible by numHeads (${numHeads})`,\n \"embedDim\",\n embedDim\n );\n }\n\n const dropout = options.dropout ?? 0.0;\n if (!Number.isFinite(dropout) || dropout < 0 || dropout >= 1) {\n throw new InvalidParameterError(\"dropout must be in [0, 1)\", \"dropout\", dropout);\n }\n\n this.embedDim = embedDim;\n this.numHeads = numHeads;\n this.headDim = embedDim / numHeads;\n this.scale = Math.sqrt(this.headDim);\n this.useBias = options.bias ?? true;\n this.dropout = dropout;\n\n // Initialize projection weights using Xavier/Glorot initialization\n const stdDev = Math.sqrt(2.0 / (embedDim + embedDim));\n\n // Query, Key, Value projections\n // We use GradTensor parameter directly\n this.wQ = parameter(mulScalar(randn([embedDim, embedDim]), stdDev));\n this.wK = parameter(mulScalar(randn([embedDim, embedDim]), stdDev));\n this.wV = parameter(mulScalar(randn([embedDim, embedDim]), stdDev));\n this.wO = parameter(mulScalar(randn([embedDim, embedDim]), stdDev));\n\n this.registerParameter(\"in_proj_weight_q\", this.wQ);\n this.registerParameter(\"in_proj_weight_k\", this.wK);\n this.registerParameter(\"in_proj_weight_v\", this.wV);\n this.registerParameter(\"out_proj_weight\", this.wO);\n\n if (this.useBias) {\n this.bQ = parameter(zeros([embedDim]));\n this.bK = parameter(zeros([embedDim]));\n this.bV = parameter(zeros([embedDim]));\n this.bO = parameter(zeros([embedDim]));\n\n this.registerParameter(\"in_proj_bias_q\", this.bQ);\n this.registerParameter(\"in_proj_bias_k\", this.bK);\n this.registerParameter(\"in_proj_bias_v\", this.bV);\n this.registerParameter(\"out_proj_bias\", this.bO);\n }\n }\n\n /**\n * Forward pass of multi-head attention.\n *\n * @param query - Query tensor of shape (batch, seqLen, embedDim)\n * @param key - Key tensor of shape (batch, seqLen, embedDim)\n * @param value - Value tensor of shape (batch, seqLen, embedDim)\n * @returns Output tensor of same shape as query\n */\n forward(...inputs: AnyTensor[]): GradTensor {\n if (inputs.length < 1 || inputs.length > 3) {\n throw new InvalidParameterError(\n \"MultiheadAttention.forward expects 1 to 3 input tensors\",\n \"inputs\",\n inputs.length\n );\n }\n\n const queryInput = inputs[0];\n if (queryInput === undefined) {\n throw new InvalidParameterError(\"Query tensor is required\", \"query\", queryInput);\n }\n\n // Auto-convert to GradTensor\n const query = queryInput instanceof GradTensor ? queryInput : GradTensor.fromTensor(queryInput);\n\n const keyInput = inputs[1] ?? queryInput;\n const key = keyInput instanceof GradTensor ? keyInput : GradTensor.fromTensor(keyInput);\n\n const valueInput = inputs[2] ?? queryInput;\n const value = valueInput instanceof GradTensor ? valueInput : GradTensor.fromTensor(valueInput);\n\n if (query.dtype === \"string\") throw new DTypeError(\"String tensors are not supported\");\n if (query.ndim !== key.ndim || query.ndim !== value.ndim) {\n throw new ShapeError(\"query, key, and value must have same rank\");\n }\n if (query.ndim !== 2 && query.ndim !== 3) {\n throw new ShapeError(`Query must be 2D or 3D; got ndim=${query.ndim}`);\n }\n if (key.ndim !== 2 && key.ndim !== 3) {\n throw new ShapeError(`Key must be 2D or 3D; got ndim=${key.ndim}`);\n }\n if (value.ndim !== 2 && value.ndim !== 3) {\n throw new ShapeError(`Value must be 2D or 3D; got ndim=${value.ndim}`);\n }\n\n // Shape convention: (Batch, SeqLen, EmbedDim) for 3D inputs.\n // If 2D (SeqLen, EmbedDim), we treat as (1, SeqLen, EmbedDim).\n\n let q = query;\n let k = key;\n let v = value;\n\n if (q.ndim === 2) q = q.reshape([1, q.shape[0] ?? 0, q.shape[1] ?? 0]);\n if (k.ndim === 2) k = k.reshape([1, k.shape[0] ?? 0, k.shape[1] ?? 0]);\n if (v.ndim === 2) v = v.reshape([1, v.shape[0] ?? 0, v.shape[1] ?? 0]);\n\n const batchSize = q.shape[0] ?? 0;\n const seqLenQ = q.shape[1] ?? 0;\n const seqLenK = k.shape[1] ?? 0;\n const seqLenV = v.shape[1] ?? 0;\n const embedDim = q.shape[2] ?? 0;\n\n if (embedDim !== this.embedDim) {\n throw new ShapeError(`Query embedDim mismatch: expected ${this.embedDim}, got ${embedDim}`);\n }\n if (k.shape[2] !== this.embedDim) {\n throw new ShapeError(`Key embedDim mismatch: expected ${this.embedDim}, got ${k.shape[2]}`);\n }\n if (v.shape[2] !== this.embedDim) {\n throw new ShapeError(`Value embedDim mismatch: expected ${this.embedDim}, got ${v.shape[2]}`);\n }\n if (k.shape[0] !== batchSize || v.shape[0] !== batchSize) {\n throw new ShapeError(\n `batch size mismatch: query=${batchSize}, key=${k.shape[0]}, value=${v.shape[0]}`\n );\n }\n if (seqLenK !== seqLenV) {\n throw new ShapeError(`Key/value sequence length mismatch: key=${seqLenK}, value=${seqLenV}`);\n }\n\n // Linear projections\n // Q * WQ^T + bQ\n // (B, L, E) @ (E, E) -> (B, L, E)\n let Q = q.matmul(this.wQ.transpose());\n if (this.bQ) Q = Q.add(this.bQ);\n\n let K = k.matmul(this.wK.transpose());\n if (this.bK) K = K.add(this.bK);\n\n let V = v.matmul(this.wV.transpose());\n if (this.bV) V = V.add(this.bV);\n\n // Split heads\n // (B, L, E) -> (B, L, H, D) -> (B, H, L, D)\n const H = this.numHeads;\n const D = this.headDim;\n\n Q = Q.reshape([batchSize, seqLenQ, H, D]).transpose([0, 2, 1, 3]);\n K = K.reshape([batchSize, seqLenK, H, D]).transpose([0, 2, 1, 3]);\n V = V.reshape([batchSize, seqLenV, H, D]).transpose([0, 2, 1, 3]);\n\n // Scaled Dot-Product Attention\n // Scores = Q @ K^T / sqrt(D)\n // (B, H, Lq, D) @ (B, H, D, Lk) -> (B, H, Lq, Lk)\n let scores = Q.matmul(K.transpose([0, 1, 3, 2]));\n scores = scores.div(GradTensor.scalar(this.scale));\n\n // Softmax\n let attn = softmaxGrad(scores, -1);\n\n // Dropout\n attn = dropoutGrad(attn, this.dropout, this.training);\n\n // Weighted Sum\n // (B, H, Lq, Lk) @ (B, H, Lv, D) -> (B, H, Lq, D)\n // Note: Lk == Lv usually\n const context = attn.matmul(V);\n\n // Concat heads\n // (B, H, Lq, D) -> (B, Lq, H, D) -> (B, Lq, E)\n const contextDtype = ensureNumericDType(context.dtype, \"MultiheadAttention\");\n const contextReshaped = context\n .transpose([0, 2, 1, 3])\n .mul(GradTensor.scalar(1, { dtype: contextDtype }))\n .reshape([batchSize, seqLenQ, this.embedDim]);\n\n // Output projection\n let output = contextReshaped.matmul(this.wO.transpose());\n if (this.bO) output = output.add(this.bO);\n\n // If input was 2D, squeeze back\n if (query.ndim === 2) {\n output = output.reshape([seqLenQ, this.embedDim]);\n }\n\n return output;\n }\n\n override toString(): string {\n return `MultiheadAttention(embed_dim=${this.embedDim}, num_heads=${this.numHeads})`;\n }\n}\n\n/**\n * Transformer Encoder Layer.\n *\n * A single layer of the Transformer encoder, consisting of:\n * 1. Multi-head self-attention\n * 2. Add & Norm (residual connection + layer normalization)\n * 3. Feed-forward network (FFN)\n * 4. Add & Norm\n *\n * @example\n * ```ts\n * import { TransformerEncoderLayer } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const layer = new TransformerEncoderLayer(512, 8, 2048);\n * const x = tensor([[/* sequence data *\\/]]);\n * const output = layer.forward(x);\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.TransformerEncoderLayer.html | PyTorch TransformerEncoderLayer}\n */\nexport class TransformerEncoderLayer extends Module {\n private readonly dModel: number;\n private readonly nHead: number;\n private readonly dFF: number;\n\n private readonly selfAttn: MultiheadAttention;\n private readonly linear1: Linear;\n private readonly linear2: Linear;\n private readonly norm1: LayerNorm;\n private readonly norm2: LayerNorm;\n\n private readonly dropout: number;\n // We use functional dropout in forward, or could use Dropout module.\n // Using Dropout module is cleaner.\n private readonly dropout1: Dropout;\n private readonly dropout2: Dropout;\n private readonly dropout3: Dropout;\n\n constructor(\n dModel: number,\n nHead: number,\n dFF: number,\n options: {\n readonly dropout?: number;\n readonly eps?: number;\n } = {}\n ) {\n super();\n\n if (!Number.isInteger(dModel) || dModel <= 0) {\n throw new InvalidParameterError(\"dModel must be a positive integer\", \"dModel\", dModel);\n }\n if (!Number.isInteger(nHead) || nHead <= 0) {\n throw new InvalidParameterError(\"nHead must be a positive integer\", \"nHead\", nHead);\n }\n if (dModel % nHead !== 0) {\n throw new InvalidParameterError(\n `dModel (${dModel}) must be divisible by nHead (${nHead})`,\n \"dModel\",\n dModel\n );\n }\n if (!Number.isInteger(dFF) || dFF <= 0) {\n throw new InvalidParameterError(\"dFF must be a positive integer\", \"dFF\", dFF);\n }\n\n const dropout = options.dropout ?? 0.1;\n const eps = options.eps ?? 1e-5;\n\n this.dModel = dModel;\n this.nHead = nHead;\n this.dFF = dFF;\n this.dropout = dropout;\n\n this.selfAttn = new MultiheadAttention(dModel, nHead, { dropout });\n this.linear1 = new Linear(dModel, dFF);\n this.linear2 = new Linear(dFF, dModel);\n this.norm1 = new LayerNorm(dModel, { eps });\n this.norm2 = new LayerNorm(dModel, { eps });\n this.dropout1 = new Dropout(dropout);\n this.dropout2 = new Dropout(dropout);\n this.dropout3 = new Dropout(dropout);\n\n this.registerModule(\"self_attn\", this.selfAttn);\n this.registerModule(\"linear1\", this.linear1);\n this.registerModule(\"linear2\", this.linear2);\n this.registerModule(\"norm1\", this.norm1);\n this.registerModule(\"norm2\", this.norm2);\n this.registerModule(\"dropout1\", this.dropout1);\n this.registerModule(\"dropout2\", this.dropout2);\n this.registerModule(\"dropout3\", this.dropout3);\n }\n\n /**\n * Forward pass of the Transformer encoder layer.\n *\n * @param src - Source sequence of shape (batch, seqLen, dModel)\n * @returns Output of same shape as input\n */\n forward(src: AnyTensor): GradTensor {\n const input = src instanceof GradTensor ? src : GradTensor.fromTensor(src);\n\n if (input.dtype === \"string\") {\n throw new DTypeError(\"TransformerEncoderLayer does not support string dtype\");\n }\n\n // 1. Self Attention\n // src2 = self_attn(src, src, src)\n let src2 = this.selfAttn.forward(input, input, input);\n\n // src = src + dropout(src2)\n src2 = this.dropout1.forward(src2);\n let out = input.add(src2);\n\n // src = norm1(src)\n out = this.norm1.forward(out);\n\n // 2. Feed Forward\n // src2 = linear2(dropout(relu(linear1(src))))\n // We implement FFN manually with modules\n let ffn = this.linear1.forward(out);\n ffn = ffn.relu();\n ffn = this.dropout2.forward(ffn);\n ffn = this.linear2.forward(ffn);\n\n // src = src + dropout(src2)\n ffn = this.dropout3.forward(ffn);\n out = out.add(ffn);\n\n // src = norm2(src)\n out = this.norm2.forward(out);\n\n return out;\n }\n\n override toString(): string {\n return `TransformerEncoderLayer(d_model=${this.dModel}, nhead=${this.nHead}, dim_feedforward=${this.dFF}, dropout=${this.dropout})`;\n }\n}\n","import { DTypeError, InvalidParameterError, NotFittedError, ShapeError } from \"../../core\";\nimport { type AnyTensor, GradTensor, im2colGrad, mulScalar, parameter, randn } from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\n\nfunction normalizePair(\n name: string,\n value: number | [number, number],\n allowZero: boolean,\n description: string\n): [number, number] {\n const arr = typeof value === \"number\" ? [value, value] : value;\n const first = arr[0];\n const second = arr[1];\n if (\n arr.length !== 2 ||\n first === undefined ||\n second === undefined ||\n !Number.isInteger(first) ||\n !Number.isInteger(second) ||\n (allowZero ? first < 0 || second < 0 : first <= 0 || second <= 0)\n ) {\n throw new InvalidParameterError(`${name} must be ${description}`, name, value);\n }\n return [first, second];\n}\n\n/**\n * 1D Convolutional Layer.\n *\n * Applies a 1D convolution over an input signal composed of several input planes.\n *\n * @example\n * ```ts\n * import { Conv1d } from 'deepbox/nn';\n *\n * const conv = new Conv1d(16, 33, 3); // in_channels=16, out_channels=33, kernel_size=3\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html | PyTorch Conv1d}\n */\nexport class Conv1d extends Module {\n private readonly inChannels: number;\n private readonly outChannels: number;\n private readonly kernelSize: number;\n private readonly stride: number;\n private readonly padding: number;\n private readonly bias: boolean;\n\n private weight_?: GradTensor;\n private bias_?: GradTensor;\n\n constructor(\n inChannels: number,\n outChannels: number,\n kernelSize: number,\n options: {\n readonly stride?: number;\n readonly padding?: number;\n readonly bias?: boolean;\n } = {}\n ) {\n super();\n\n // Validate parameters\n if (inChannels <= 0 || !Number.isInteger(inChannels)) {\n throw new InvalidParameterError(\n \"inChannels must be a positive integer\",\n \"inChannels\",\n inChannels\n );\n }\n if (outChannels <= 0 || !Number.isInteger(outChannels)) {\n throw new InvalidParameterError(\n \"outChannels must be a positive integer\",\n \"outChannels\",\n outChannels\n );\n }\n if (kernelSize <= 0 || !Number.isInteger(kernelSize)) {\n throw new InvalidParameterError(\n \"kernelSize must be a positive integer\",\n \"kernelSize\",\n kernelSize\n );\n }\n\n const stride = options.stride ?? 1;\n if (stride <= 0 || !Number.isInteger(stride)) {\n throw new InvalidParameterError(\"stride must be a positive integer\", \"stride\", stride);\n }\n\n const padding = options.padding ?? 0;\n if (padding < 0 || !Number.isInteger(padding)) {\n throw new InvalidParameterError(\"padding must be a non-negative integer\", \"padding\", padding);\n }\n\n this.inChannels = inChannels;\n this.outChannels = outChannels;\n this.kernelSize = kernelSize;\n this.stride = stride;\n this.padding = padding;\n this.bias = options.bias ?? true;\n\n this.initializeParameters();\n }\n\n private initializeParameters(): void {\n const k = 1 / Math.sqrt(this.inChannels * this.kernelSize);\n const weight = randn([this.outChannels, this.inChannels, this.kernelSize]);\n this.weight_ = parameter(mulScalar(weight, k));\n this.registerParameter(\"weight\", this.weight_);\n\n if (this.bias) {\n const biasInit = randn([this.outChannels]);\n this.bias_ = parameter(mulScalar(biasInit, k));\n this.registerParameter(\"bias\", this.bias_);\n }\n }\n\n forward(x: AnyTensor): GradTensor {\n // Convert to GradTensor if needed\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n // Reject string tensors\n if (input.dtype === \"string\") {\n throw new DTypeError(\"String tensors are not supported\");\n }\n\n // Input shape: (batch, in_channels, length)\n if (input.ndim !== 3) {\n throw new ShapeError(`Conv1d expects 3D input (batch, channels, length), got ${input.ndim}D`);\n }\n\n const batch = input.shape[0] ?? 0;\n const inC = input.shape[1] ?? 0;\n const inL = input.shape[2] ?? 0;\n\n if (inC !== this.inChannels) {\n throw new ShapeError(`Expected ${this.inChannels} input channels, got ${inC}`);\n }\n\n const weight = this.weight_;\n if (!weight) throw new NotFittedError(\"Weight not initialized\");\n\n // 1D Convolution using 2D operations (unsqueeze height dim)\n // Input: (B, C, L) -> (B, C, 1, L)\n const input2d = input.reshape([batch, inC, 1, inL]);\n\n // Params for im2col\n // Kernel: (1, K)\n const kernelSize: [number, number] = [1, this.kernelSize];\n const stride: [number, number] = [1, this.stride];\n const padding: [number, number] = [0, this.padding];\n\n // im2col -> (B, outL, C * 1 * K)\n const cols = im2colGrad(input2d, kernelSize, stride, padding);\n\n // Weights: (outC, inC, K) -> (outC, inC * K)\n // Note: im2col flattens as channels * kH * kW.\n // Our weights are (outC, inC, K). Reshape to (outC, inC * K).\n const weightFlat = weight.reshape([this.outChannels, this.inChannels * this.kernelSize]);\n\n // Matmul: (B, outL, inC*K) @ (outC, inC*K).T -> (B, outL, outC)\n const out = cols.matmul(weightFlat.transpose());\n\n // Reshape to (B, outC, outL)\n const outTransposed = out.transpose([0, 2, 1]); // (B, outC, outL)\n\n if (this.bias && this.bias_) {\n // Bias: (outC) -> (1, outC, 1) broadcast\n const biasReshaped = this.bias_.reshape([1, this.outChannels, 1]);\n return outTransposed.add(biasReshaped);\n }\n\n return outTransposed;\n }\n\n get weight(): GradTensor {\n if (!this.weight_) {\n throw new NotFittedError(\"Weight not initialized\");\n }\n return this.weight_;\n }\n}\n\n/**\n * 2D Convolutional Layer.\n *\n * Applies a 2D convolution over an input signal composed of several input planes.\n *\n * @example\n * ```ts\n * import { Conv2d } from 'deepbox/nn';\n *\n * const conv = new Conv2d(3, 64, 3); // RGB to 64 channels, 3x3 kernel\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html | PyTorch Conv2d}\n */\nexport class Conv2d extends Module {\n private readonly inChannels: number;\n private readonly outChannels: number;\n private readonly kernelSize: [number, number];\n private readonly stride: [number, number];\n private readonly padding: [number, number];\n private readonly useBias: boolean;\n\n private weight_?: GradTensor;\n private bias_?: GradTensor;\n\n constructor(\n inChannels: number,\n outChannels: number,\n kernelSize: number | [number, number],\n options: {\n readonly stride?: number | [number, number];\n readonly padding?: number | [number, number];\n readonly bias?: boolean;\n } = {}\n ) {\n super();\n if (inChannels <= 0 || !Number.isInteger(inChannels)) {\n throw new InvalidParameterError(\n \"inChannels must be a positive integer\",\n \"inChannels\",\n inChannels\n );\n }\n if (outChannels <= 0 || !Number.isInteger(outChannels)) {\n throw new InvalidParameterError(\n \"outChannels must be a positive integer\",\n \"outChannels\",\n outChannels\n );\n }\n const kernelArr = normalizePair(\n \"kernelSize\",\n kernelSize,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n\n const stride = options.stride ?? 1;\n const strideArr = normalizePair(\n \"stride\",\n stride,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n\n const padding = options.padding ?? 0;\n const paddingArr = normalizePair(\n \"padding\",\n padding,\n true,\n \"a non-negative integer or a tuple of two non-negative integers\"\n );\n\n this.inChannels = inChannels;\n this.outChannels = outChannels;\n this.kernelSize = kernelArr;\n this.stride = strideArr;\n this.padding = paddingArr;\n\n this.useBias = options.bias ?? true;\n\n this.initializeParameters();\n }\n\n private initializeParameters(): void {\n const kH = this.kernelSize[0] ?? 1;\n const kW = this.kernelSize[1] ?? 1;\n const k = 1 / Math.sqrt(this.inChannels * kH * kW);\n const weight = randn([this.outChannels, this.inChannels, kH, kW]);\n this.weight_ = parameter(mulScalar(weight, k));\n this.registerParameter(\"weight\", this.weight_);\n\n if (this.useBias) {\n const biasInit = randn([this.outChannels]);\n this.bias_ = parameter(mulScalar(biasInit, k));\n this.registerParameter(\"bias\", this.bias_);\n }\n }\n\n forward(x: AnyTensor): GradTensor {\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n if (input.dtype === \"string\") {\n throw new DTypeError(\"String tensors are not supported\");\n }\n\n if (input.ndim !== 4) {\n throw new ShapeError(\n `Conv2d expects 4D input (batch, channels, height, width), got ${input.ndim}D`\n );\n }\n\n const batch = input.shape[0] ?? 0;\n const inC = input.shape[1] ?? 0;\n const inH = input.shape[2] ?? 0;\n const inW = input.shape[3] ?? 0;\n\n if (inC !== this.inChannels) {\n throw new ShapeError(`Expected ${this.inChannels} input channels, got ${inC}`);\n }\n\n const weight = this.weight_;\n if (!weight) throw new NotFittedError(\"Weight not initialized\");\n\n const [kH, kW] = this.kernelSize;\n const [sH, sW] = this.stride;\n const [pH, pW] = this.padding;\n\n // im2col -> (B, outH*outW, C*kH*kW)\n const cols = im2colGrad(input, [kH, kW], [sH, sW], [pH, pW]);\n\n // Calculate output dimensions from input (im2col does this internally but we need it for reshape)\n const outH = Math.floor((inH + 2 * pH - kH) / sH) + 1;\n const outW = Math.floor((inW + 2 * pW - kW) / sW) + 1;\n\n // Weights: (outC, inC, kH, kW) -> (outC, inC*kH*kW)\n const weightFlat = weight.reshape([this.outChannels, this.inChannels * kH * kW]);\n\n // Matmul: (B, outPixels, inFeatures) @ (outC, inFeatures).T -> (B, outPixels, outC)\n const out = cols.matmul(weightFlat.transpose());\n\n // Reshape: (B, outPixels, outC) -> (B, outC, outPixels) -> (B, outC, outH, outW)\n const outTransposed = out.transpose([0, 2, 1]);\n const outReshaped = outTransposed.reshape([batch, this.outChannels, outH, outW]);\n\n if (this.useBias && this.bias_) {\n // Bias: (outC) -> (1, outC, 1, 1)\n const biasReshaped = this.bias_.reshape([1, this.outChannels, 1, 1]);\n return outReshaped.add(biasReshaped);\n }\n\n return outReshaped;\n }\n\n get weight(): GradTensor {\n if (!this.weight_) {\n throw new NotFittedError(\"Weight not initialized\");\n }\n return this.weight_;\n }\n}\n\n/**\n * 2D Max Pooling Layer.\n *\n * Applies a 2D max pooling over an input signal.\n *\n * @example\n * ```ts\n * import { MaxPool2d } from 'deepbox/nn';\n *\n * const pool = new MaxPool2d(2); // 2x2 pooling\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html | PyTorch MaxPool2d}\n */\nexport class MaxPool2d extends Module {\n private readonly kernelSizeValue: [number, number];\n private readonly stride: [number, number];\n private readonly padding: [number, number];\n\n constructor(\n kernelSize: number | [number, number],\n options: {\n readonly stride?: number | [number, number];\n readonly padding?: number | [number, number];\n } = {}\n ) {\n super();\n\n const kernelArr = normalizePair(\n \"kernelSize\",\n kernelSize,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n this.kernelSizeValue = kernelArr;\n\n const strideArr = normalizePair(\n \"stride\",\n options.stride ?? kernelSize,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n this.stride = strideArr;\n\n const paddingArr = normalizePair(\n \"padding\",\n options.padding ?? 0,\n true,\n \"a non-negative integer or a tuple of two non-negative integers\"\n );\n this.padding = paddingArr;\n }\n\n forward(x: AnyTensor): GradTensor {\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n if (input.dtype === \"string\") {\n throw new DTypeError(\"String tensors are not supported\");\n }\n\n if (input.ndim !== 4) {\n throw new ShapeError(\n `MaxPool2d expects 4D input (batch, channels, height, width), got ${input.ndim}D`\n );\n }\n\n const batch = input.shape[0] ?? 0;\n const channels = input.shape[1] ?? 0;\n const inH = input.shape[2] ?? 0;\n const inW = input.shape[3] ?? 0;\n\n const [kH, kW] = this.kernelSizeValue;\n const [sH, sW] = this.stride;\n const [pH, pW] = this.padding;\n\n // We use im2col for pooling.\n // To handle channels correctly (independent pooling per channel),\n // we treat (batch * channels) as the batch dimension and 1 as channel dimension.\n // Reshape: (B, C, H, W) -> (B*C, 1, H, W)\n const inputReshaped = input.reshape([batch * channels, 1, inH, inW]);\n\n // im2col -> (B*C, outPixels, 1 * kH * kW)\n const cols = im2colGrad(inputReshaped, [kH, kW], [sH, sW], [pH, pW]);\n\n // Max over kernel window (axis 2)\n // (B*C, outPixels, kH*kW) -> (B*C, outPixels)\n const maxVals = cols.max(2);\n\n // Calculate output dims\n const outH = Math.floor((inH + 2 * pH - kH) / sH) + 1;\n const outW = Math.floor((inW + 2 * pW - kW) / sW) + 1;\n\n // Reshape back: (B*C, outH*outW) -> (B, C, outH, outW)\n return maxVals.reshape([batch, channels, outH, outW]);\n }\n}\n\n/**\n * 2D Average Pooling Layer.\n *\n * Applies a 2D average pooling over an input signal.\n *\n * @example\n * ```ts\n * import { AvgPool2d } from 'deepbox/nn';\n *\n * const pool = new AvgPool2d(2); // 2x2 pooling\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html | PyTorch AvgPool2d}\n */\nexport class AvgPool2d extends Module {\n private readonly kernelSizeValue: [number, number];\n private readonly stride: [number, number];\n private readonly padding: [number, number];\n\n constructor(\n kernelSize: number | [number, number],\n options: {\n readonly stride?: number | [number, number];\n readonly padding?: number | [number, number];\n } = {}\n ) {\n super();\n\n const kernelArr = normalizePair(\n \"kernelSize\",\n kernelSize,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n this.kernelSizeValue = kernelArr;\n\n const strideArr = normalizePair(\n \"stride\",\n options.stride ?? kernelSize,\n false,\n \"a positive integer or a tuple of two positive integers\"\n );\n this.stride = strideArr;\n\n const paddingArr = normalizePair(\n \"padding\",\n options.padding ?? 0,\n true,\n \"a non-negative integer or a tuple of two non-negative integers\"\n );\n this.padding = paddingArr;\n }\n\n forward(x: AnyTensor): GradTensor {\n const input = x instanceof GradTensor ? x : GradTensor.fromTensor(x);\n\n if (input.dtype === \"string\") {\n throw new DTypeError(\"String tensors are not supported\");\n }\n\n if (input.ndim !== 4) {\n throw new ShapeError(\n `AvgPool2d expects 4D input (batch, channels, height, width), got ${input.ndim}D`\n );\n }\n\n const batch = input.shape[0] ?? 0;\n const channels = input.shape[1] ?? 0;\n const inH = input.shape[2] ?? 0;\n const inW = input.shape[3] ?? 0;\n\n const [kH, kW] = this.kernelSizeValue;\n const [sH, sW] = this.stride;\n const [pH, pW] = this.padding;\n\n // Reshape: (B, C, H, W) -> (B*C, 1, H, W)\n const inputReshaped = input.reshape([batch * channels, 1, inH, inW]);\n\n // im2col -> (B*C, outPixels, 1 * kH * kW)\n const cols = im2colGrad(inputReshaped, [kH, kW], [sH, sW], [pH, pW]);\n\n // Mean over kernel window (axis 2)\n // (B*C, outPixels, kH*kW) -> (B*C, outPixels)\n const meanVals = cols.mean(2);\n\n // Calculate output dims\n const outH = Math.floor((inH + 2 * pH - kH) / sH) + 1;\n const outW = Math.floor((inW + 2 * pW - kW) / sW) + 1;\n\n // Reshape back: (B*C, outH*outW) -> (B, C, outH, outW)\n return meanVals.reshape([batch, channels, outH, outW]);\n }\n}\n","import {\n DTypeError,\n getElementAsNumber,\n InvalidParameterError,\n type Shape,\n ShapeError,\n} from \"../../core\";\nimport {\n type AnyTensor,\n GradTensor,\n mulScalar,\n parameter,\n randn,\n Tensor,\n zeros,\n} from \"../../ndarray\";\nimport { Module } from \"../module/Module\";\n\nfunction ensureFloatTensor(\n t: Tensor,\n context: string\n): asserts t is Tensor<Shape, \"float32\" | \"float64\"> {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${context} does not support string dtype`);\n }\n if (t.dtype !== \"float32\" && t.dtype !== \"float64\") {\n throw new DTypeError(`${context} expects float32 or float64 dtype`);\n }\n}\n\nfunction readNumeric(t: Tensor, offset: number): number {\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"String tensors are not supported\");\n }\n return getElementAsNumber(data, offset);\n}\n\nfunction createFloatBuffer(\n size: number,\n dtype: \"float32\" | \"float64\"\n): Float32Array | Float64Array {\n return dtype === \"float64\" ? new Float64Array(size) : new Float32Array(size);\n}\n\nfunction validatePositiveInt(name: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new InvalidParameterError(`${name} must be a positive integer`, name, value);\n }\n}\n\ntype ParsedInput = {\n readonly batch: number;\n readonly seqLen: number;\n readonly inputDim: number;\n readonly isUnbatched: boolean;\n readonly batchStride: number;\n readonly seqStride: number;\n readonly featStride: number;\n};\n\nfunction parseInput(input: Tensor, batchFirst: boolean): ParsedInput {\n if (input.ndim === 2) {\n const seqLen = input.shape[0] ?? 0;\n const inputDim = input.shape[1] ?? 0;\n return {\n batch: 1,\n seqLen,\n inputDim,\n isUnbatched: true,\n batchStride: 0,\n seqStride: input.strides[0] ?? 0,\n featStride: input.strides[1] ?? 0,\n };\n }\n\n if (input.ndim !== 3) {\n throw new ShapeError(`Recurrent layers expect 2D or 3D input; got ndim=${input.ndim}`);\n }\n\n if (batchFirst) {\n return {\n batch: input.shape[0] ?? 0,\n seqLen: input.shape[1] ?? 0,\n inputDim: input.shape[2] ?? 0,\n isUnbatched: false,\n batchStride: input.strides[0] ?? 0,\n seqStride: input.strides[1] ?? 0,\n featStride: input.strides[2] ?? 0,\n };\n }\n\n return {\n batch: input.shape[1] ?? 0,\n seqLen: input.shape[0] ?? 0,\n inputDim: input.shape[2] ?? 0,\n isUnbatched: false,\n batchStride: input.strides[1] ?? 0,\n seqStride: input.strides[0] ?? 0,\n featStride: input.strides[2] ?? 0,\n };\n}\n\nfunction outputIndex(\n batchFirst: boolean,\n isUnbatched: boolean,\n batch: number,\n seqLen: number,\n hiddenSize: number,\n b: number,\n t: number,\n j: number\n): number {\n if (isUnbatched) {\n return t * hiddenSize + j;\n }\n if (batchFirst) {\n return b * (seqLen * hiddenSize) + t * hiddenSize + j;\n }\n return t * (batch * hiddenSize) + b * hiddenSize + j;\n}\n\nfunction extractTensor(arg: AnyTensor, _name: string): Tensor {\n if (arg instanceof GradTensor) {\n return arg.tensor;\n }\n return arg;\n}\n\nfunction buildState(\n state: Tensor | undefined,\n numLayers: number,\n batch: number,\n hiddenSize: number,\n isUnbatched: boolean,\n name: string\n): Float64Array[] {\n const result = new Array<Float64Array>(numLayers);\n for (let l = 0; l < numLayers; l++) {\n result[l] = new Float64Array(batch * hiddenSize);\n }\n\n if (!state) {\n return result;\n }\n\n ensureFloatTensor(state, name);\n\n if (state.ndim === 2) {\n if (!isUnbatched) {\n throw new ShapeError(`Expected ${name} with 3 dimensions for batched input`);\n }\n if ((state.shape[0] ?? 0) !== numLayers || (state.shape[1] ?? 0) !== hiddenSize) {\n throw new ShapeError(\n `Expected ${name} shape [${numLayers}, ${hiddenSize}], got [${state.shape.join(\", \")}]`\n );\n }\n\n const stride0 = state.strides[0] ?? 0;\n const stride1 = state.strides[1] ?? 0;\n for (let l = 0; l < numLayers; l++) {\n const layerState = result[l];\n if (!layerState) {\n throw new ShapeError(`Internal error: missing ${name} layer state`);\n }\n const base = state.offset + l * stride0;\n for (let j = 0; j < hiddenSize; j++) {\n layerState[j] = readNumeric(state, base + j * stride1);\n }\n }\n\n return result;\n }\n\n if (state.ndim !== 3) {\n throw new ShapeError(`Expected ${name} with 2 or 3 dimensions; got ndim=${state.ndim}`);\n }\n\n const expectedBatch = isUnbatched ? 1 : batch;\n if (\n (state.shape[0] ?? 0) !== numLayers ||\n (state.shape[1] ?? 0) !== expectedBatch ||\n (state.shape[2] ?? 0) !== hiddenSize\n ) {\n const expected = isUnbatched ? [numLayers, 1, hiddenSize] : [numLayers, batch, hiddenSize];\n throw new ShapeError(\n `Expected ${name} shape [${expected.join(\", \")}], got [${state.shape.join(\", \")}]`\n );\n }\n\n const stride0 = state.strides[0] ?? 0;\n const stride1 = state.strides[1] ?? 0;\n const stride2 = state.strides[2] ?? 0;\n\n for (let l = 0; l < numLayers; l++) {\n const layerState = result[l];\n if (!layerState) {\n throw new ShapeError(`Internal error: missing ${name} layer state`);\n }\n const baseLayer = state.offset + l * stride0;\n for (let b = 0; b < batch; b++) {\n const baseBatch = baseLayer + b * stride1;\n for (let j = 0; j < hiddenSize; j++) {\n layerState[b * hiddenSize + j] = readNumeric(state, baseBatch + j * stride2);\n }\n }\n }\n\n return result;\n}\n\nfunction packState(\n state: Float64Array[],\n numLayers: number,\n batch: number,\n hiddenSize: number,\n dtype: \"float32\" | \"float64\",\n device: Tensor[\"device\"],\n isUnbatched: boolean\n): Tensor {\n const size = isUnbatched ? numLayers * hiddenSize : numLayers * batch * hiddenSize;\n const data = createFloatBuffer(size, dtype);\n\n if (isUnbatched) {\n for (let l = 0; l < numLayers; l++) {\n const layer = state[l];\n if (!layer) {\n throw new ShapeError(\"Internal error: missing packed state layer\");\n }\n for (let j = 0; j < hiddenSize; j++) {\n data[l * hiddenSize + j] = layer[j] ?? 0;\n }\n }\n return Tensor.fromTypedArray({\n data,\n shape: [numLayers, hiddenSize],\n dtype,\n device,\n });\n }\n\n for (let l = 0; l < numLayers; l++) {\n const layer = state[l];\n if (!layer) {\n throw new ShapeError(\"Internal error: missing packed state layer\");\n }\n const layerOffset = l * batch * hiddenSize;\n for (let b = 0; b < batch; b++) {\n const batchOffset = layerOffset + b * hiddenSize;\n for (let j = 0; j < hiddenSize; j++) {\n data[batchOffset + j] = layer[b * hiddenSize + j] ?? 0;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: [numLayers, batch, hiddenSize],\n dtype,\n device,\n });\n}\n\n/**\n * Simple RNN layer.\n *\n * Applies a simple recurrent neural network to an input sequence.\n *\n * **Formula**: h_t = tanh(W_ih * x_t + b_ih + W_hh * h_{t-1} + b_hh)\n *\n * @example\n * ```ts\n * import { RNN } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const rnn = new RNN(10, 20);\n * const x = tensor([[[1, 2, 3]]]); // (batch, seq_len, input_size)\n * const output = rnn.forward(x);\n * ```\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.RNN.html | PyTorch RNN}\n */\nexport class RNN extends Module {\n private readonly inputSize: number;\n private readonly hiddenSize: number;\n private readonly numLayers: number;\n private readonly nonlinearity: \"tanh\" | \"relu\";\n private readonly bias: boolean;\n private readonly batchFirst: boolean;\n\n private weightsIh: Tensor[];\n private weightsHh: Tensor[];\n private biasIh: Tensor[];\n private biasHh: Tensor[];\n\n constructor(\n inputSize: number,\n hiddenSize: number,\n options: {\n readonly numLayers?: number;\n readonly nonlinearity?: \"tanh\" | \"relu\";\n readonly bias?: boolean;\n readonly batchFirst?: boolean;\n } = {}\n ) {\n super();\n validatePositiveInt(\"inputSize\", inputSize);\n validatePositiveInt(\"hiddenSize\", hiddenSize);\n const numLayers = options.numLayers ?? 1;\n validatePositiveInt(\"numLayers\", numLayers);\n\n this.inputSize = inputSize;\n this.hiddenSize = hiddenSize;\n this.numLayers = numLayers;\n this.nonlinearity = options.nonlinearity ?? \"tanh\";\n this.bias = options.bias ?? true;\n this.batchFirst = options.batchFirst ?? true;\n\n const stdv = 1.0 / Math.sqrt(hiddenSize);\n\n this.weightsIh = [];\n this.weightsHh = [];\n this.biasIh = [];\n this.biasHh = [];\n\n for (let layer = 0; layer < this.numLayers; layer++) {\n const inputDim = layer === 0 ? inputSize : hiddenSize;\n const wIh = mulScalar(randn([hiddenSize, inputDim]), stdv);\n const wHh = mulScalar(randn([hiddenSize, hiddenSize]), stdv);\n\n this.weightsIh.push(wIh);\n this.weightsHh.push(wHh);\n this.registerParameter(`weight_ih_l${layer}`, parameter(wIh));\n this.registerParameter(`weight_hh_l${layer}`, parameter(wHh));\n\n if (this.bias) {\n const bIh = zeros([hiddenSize]);\n const bHh = zeros([hiddenSize]);\n this.biasIh.push(bIh);\n this.biasHh.push(bHh);\n this.registerParameter(`bias_ih_l${layer}`, parameter(bIh));\n this.registerParameter(`bias_hh_l${layer}`, parameter(bHh));\n }\n }\n }\n\n private activation(x: number): number {\n return this.nonlinearity === \"tanh\" ? Math.tanh(x) : Math.max(0, x);\n }\n\n private run(input: Tensor, hx?: Tensor): { output: Tensor; h: Tensor } {\n ensureFloatTensor(input, \"RNN\");\n const parsed = parseInput(input, this.batchFirst);\n const { batch, seqLen, inputDim, isUnbatched, batchStride, seqStride, featStride } = parsed;\n\n if (inputDim !== this.inputSize) {\n throw new ShapeError(`Expected input size ${this.inputSize}, got ${inputDim}`);\n }\n if (seqLen <= 0) {\n throw new InvalidParameterError(\"Sequence length must be positive\", \"seqLen\", seqLen);\n }\n if (!isUnbatched && batch <= 0) {\n throw new InvalidParameterError(\"Batch size must be positive\", \"batch\", batch);\n }\n\n const h = buildState(hx, this.numLayers, batch, this.hiddenSize, isUnbatched, \"hx\");\n const outSize = (isUnbatched ? seqLen : batch * seqLen) * this.hiddenSize;\n const out = createFloatBuffer(outSize, input.dtype);\n\n const inputVec = new Float64Array(inputDim);\n\n for (let t = 0; t < seqLen; t++) {\n for (let b = 0; b < batch; b++) {\n const baseOffset = input.offset + b * batchStride + t * seqStride;\n for (let i = 0; i < inputDim; i++) {\n inputVec[i] = readNumeric(input, baseOffset + i * featStride);\n }\n\n let layerInput = inputVec;\n\n for (let l = 0; l < this.numLayers; l++) {\n const wIh = this.weightsIh[l];\n const wHh = this.weightsHh[l];\n if (!wIh || !wHh) {\n throw new ShapeError(\"Internal error: missing RNN weights\");\n }\n\n const curInputSize = l === 0 ? this.inputSize : this.hiddenSize;\n const newH = new Float64Array(this.hiddenSize);\n const hLayer = h[l];\n if (!hLayer) {\n throw new ShapeError(\"Internal error: missing RNN hidden state\");\n }\n\n const wIhStride0 = wIh.strides[0] ?? 0;\n const wIhStride1 = wIh.strides[1] ?? 0;\n const wHhStride0 = wHh.strides[0] ?? 0;\n const wHhStride1 = wHh.strides[1] ?? 0;\n const biasIh = this.biasIh[l];\n const biasHh = this.biasHh[l];\n const biasIhStride = biasIh ? (biasIh.strides[0] ?? 0) : 0;\n const biasHhStride = biasHh ? (biasHh.strides[0] ?? 0) : 0;\n\n for (let j = 0; j < this.hiddenSize; j++) {\n let sum = 0;\n const wIhBase = wIh.offset + j * wIhStride0;\n for (let k = 0; k < curInputSize; k++) {\n sum += (layerInput[k] ?? 0) * readNumeric(wIh, wIhBase + k * wIhStride1);\n }\n\n const wHhBase = wHh.offset + j * wHhStride0;\n for (let k = 0; k < this.hiddenSize; k++) {\n sum +=\n (hLayer[b * this.hiddenSize + k] ?? 0) * readNumeric(wHh, wHhBase + k * wHhStride1);\n }\n\n if (this.bias && biasIh && biasHh) {\n sum += readNumeric(biasIh, biasIh.offset + j * biasIhStride);\n sum += readNumeric(biasHh, biasHh.offset + j * biasHhStride);\n }\n\n newH[j] = this.activation(sum);\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n hLayer[b * this.hiddenSize + j] = newH[j] ?? 0;\n }\n\n layerInput = newH;\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n const idx = outputIndex(\n this.batchFirst,\n isUnbatched,\n batch,\n seqLen,\n this.hiddenSize,\n b,\n t,\n j\n );\n out[idx] = layerInput[j] ?? 0;\n }\n }\n }\n\n const outShape = isUnbatched\n ? [seqLen, this.hiddenSize]\n : this.batchFirst\n ? [batch, seqLen, this.hiddenSize]\n : [seqLen, batch, this.hiddenSize];\n\n return {\n output: Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: input.dtype,\n device: input.device,\n }),\n h: packState(\n h,\n this.numLayers,\n batch,\n this.hiddenSize,\n input.dtype,\n input.device,\n isUnbatched\n ),\n };\n }\n\n forward(...inputs: AnyTensor[]): Tensor {\n if (inputs.length < 1 || inputs.length > 2) {\n throw new InvalidParameterError(\"RNN.forward expects 1 or 2 inputs\", \"inputs\", inputs.length);\n }\n const inputArg = inputs[0];\n if (inputArg === undefined) {\n throw new InvalidParameterError(\"RNN.forward requires an input tensor\", \"input\", inputArg);\n }\n const input = extractTensor(inputArg, \"input\");\n const hxArg = inputs.length === 2 ? inputs[1] : undefined;\n const hx = hxArg === undefined ? undefined : extractTensor(hxArg, \"hx\");\n return this.run(input, hx).output;\n }\n\n /**\n * Forward pass returning both output and hidden state.\n * Use this method when you need the hidden state.\n */\n forwardWithState(input: AnyTensor, hx?: AnyTensor): [Tensor, Tensor] {\n const inputTensor = extractTensor(input, \"input\");\n const hxTensor = hx === undefined ? undefined : extractTensor(hx, \"hx\");\n const { output, h } = this.run(inputTensor, hxTensor);\n return [output, h];\n }\n\n override toString(): string {\n return `RNN(${this.inputSize}, ${this.hiddenSize}, num_layers=${this.numLayers})`;\n }\n}\n\n/**\n * LSTM (Long Short-Term Memory) layer.\n *\n * Applies a multi-layer LSTM to an input sequence.\n *\n * **Gates**:\n * - Input gate: i_t = σ(W_ii * x_t + b_ii + W_hi * h_{t-1} + b_hi)\n * - Forget gate: f_t = σ(W_if * x_t + b_if + W_hf * h_{t-1} + b_hf)\n * - Cell gate: g_t = tanh(W_ig * x_t + b_ig + W_hg * h_{t-1} + b_hg)\n * - Output gate: o_t = σ(W_io * x_t + b_io + W_ho * h_{t-1} + b_ho)\n * - Cell state: c_t = f_t * c_{t-1} + i_t * g_t\n * - Hidden state: h_t = o_t * tanh(c_t)\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html | PyTorch LSTM}\n */\nexport class LSTM extends Module {\n private readonly inputSize: number;\n private readonly hiddenSize: number;\n private readonly numLayers: number;\n private readonly bias: boolean;\n private readonly batchFirst: boolean;\n\n private weightsIh: Tensor[];\n private weightsHh: Tensor[];\n private biasIh: Tensor[];\n private biasHh: Tensor[];\n\n constructor(\n inputSize: number,\n hiddenSize: number,\n options: {\n readonly numLayers?: number;\n readonly bias?: boolean;\n readonly batchFirst?: boolean;\n } = {}\n ) {\n super();\n validatePositiveInt(\"inputSize\", inputSize);\n validatePositiveInt(\"hiddenSize\", hiddenSize);\n const numLayers = options.numLayers ?? 1;\n validatePositiveInt(\"numLayers\", numLayers);\n\n this.inputSize = inputSize;\n this.hiddenSize = hiddenSize;\n this.numLayers = numLayers;\n this.bias = options.bias ?? true;\n this.batchFirst = options.batchFirst ?? true;\n\n const stdv = 1.0 / Math.sqrt(hiddenSize);\n\n this.weightsIh = [];\n this.weightsHh = [];\n this.biasIh = [];\n this.biasHh = [];\n\n for (let layer = 0; layer < this.numLayers; layer++) {\n const inputDim = layer === 0 ? inputSize : hiddenSize;\n\n const wIh = mulScalar(randn([4 * hiddenSize, inputDim]), stdv);\n const wHh = mulScalar(randn([4 * hiddenSize, hiddenSize]), stdv);\n\n this.weightsIh.push(wIh);\n this.weightsHh.push(wHh);\n this.registerParameter(`weight_ih_l${layer}`, parameter(wIh));\n this.registerParameter(`weight_hh_l${layer}`, parameter(wHh));\n\n if (this.bias) {\n const bIh = zeros([4 * hiddenSize]);\n const bHh = zeros([4 * hiddenSize]);\n this.biasIh.push(bIh);\n this.biasHh.push(bHh);\n this.registerParameter(`bias_ih_l${layer}`, parameter(bIh));\n this.registerParameter(`bias_hh_l${layer}`, parameter(bHh));\n }\n }\n }\n\n private sigmoid(x: number): number {\n return 1 / (1 + Math.exp(-x));\n }\n\n private run(input: Tensor, hx?: Tensor, cx?: Tensor): { output: Tensor; h: Tensor; c: Tensor } {\n ensureFloatTensor(input, \"LSTM\");\n const parsed = parseInput(input, this.batchFirst);\n const { batch, seqLen, inputDim, isUnbatched, batchStride, seqStride, featStride } = parsed;\n\n if (inputDim !== this.inputSize) {\n throw new ShapeError(`Expected input size ${this.inputSize}, got ${inputDim}`);\n }\n if (seqLen <= 0) {\n throw new InvalidParameterError(\"Sequence length must be positive\", \"seqLen\", seqLen);\n }\n if (!isUnbatched && batch <= 0) {\n throw new InvalidParameterError(\"Batch size must be positive\", \"batch\", batch);\n }\n\n const h = buildState(hx, this.numLayers, batch, this.hiddenSize, isUnbatched, \"hx\");\n const c = buildState(cx, this.numLayers, batch, this.hiddenSize, isUnbatched, \"cx\");\n\n const outSize = (isUnbatched ? seqLen : batch * seqLen) * this.hiddenSize;\n const out = createFloatBuffer(outSize, input.dtype);\n\n const inputVec = new Float64Array(inputDim);\n const gates = new Float64Array(4 * this.hiddenSize);\n\n for (let t = 0; t < seqLen; t++) {\n for (let b = 0; b < batch; b++) {\n const baseOffset = input.offset + b * batchStride + t * seqStride;\n for (let i = 0; i < inputDim; i++) {\n inputVec[i] = readNumeric(input, baseOffset + i * featStride);\n }\n\n let layerInput = inputVec;\n\n for (let l = 0; l < this.numLayers; l++) {\n const wIh = this.weightsIh[l];\n const wHh = this.weightsHh[l];\n if (!wIh || !wHh) {\n throw new ShapeError(\"Internal error: missing LSTM weights\");\n }\n\n const curInputSize = l === 0 ? this.inputSize : this.hiddenSize;\n const hLayer = h[l];\n const cLayer = c[l];\n if (!hLayer || !cLayer) {\n throw new ShapeError(\"Internal error: missing LSTM state\");\n }\n\n const wIhStride0 = wIh.strides[0] ?? 0;\n const wIhStride1 = wIh.strides[1] ?? 0;\n const wHhStride0 = wHh.strides[0] ?? 0;\n const wHhStride1 = wHh.strides[1] ?? 0;\n const biasIh = this.biasIh[l];\n const biasHh = this.biasHh[l];\n const biasIhStride = biasIh ? (biasIh.strides[0] ?? 0) : 0;\n const biasHhStride = biasHh ? (biasHh.strides[0] ?? 0) : 0;\n\n for (let g = 0; g < 4 * this.hiddenSize; g++) {\n let sum = 0;\n const wIhBase = wIh.offset + g * wIhStride0;\n for (let k = 0; k < curInputSize; k++) {\n sum += (layerInput[k] ?? 0) * readNumeric(wIh, wIhBase + k * wIhStride1);\n }\n const wHhBase = wHh.offset + g * wHhStride0;\n for (let k = 0; k < this.hiddenSize; k++) {\n sum +=\n (hLayer[b * this.hiddenSize + k] ?? 0) * readNumeric(wHh, wHhBase + k * wHhStride1);\n }\n if (this.bias && biasIh && biasHh) {\n sum += readNumeric(biasIh, biasIh.offset + g * biasIhStride);\n sum += readNumeric(biasHh, biasHh.offset + g * biasHhStride);\n }\n gates[g] = sum;\n }\n\n const newH = new Float64Array(this.hiddenSize);\n const newC = new Float64Array(this.hiddenSize);\n\n for (let j = 0; j < this.hiddenSize; j++) {\n const iGate = this.sigmoid(gates[j] ?? 0);\n const fGate = this.sigmoid(gates[this.hiddenSize + j] ?? 0);\n const gGate = Math.tanh(gates[2 * this.hiddenSize + j] ?? 0);\n const oGate = this.sigmoid(gates[3 * this.hiddenSize + j] ?? 0);\n\n const prevC = cLayer[b * this.hiddenSize + j] ?? 0;\n const nextC = fGate * prevC + iGate * gGate;\n const nextH = oGate * Math.tanh(nextC);\n\n newC[j] = nextC;\n newH[j] = nextH;\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n hLayer[b * this.hiddenSize + j] = newH[j] ?? 0;\n cLayer[b * this.hiddenSize + j] = newC[j] ?? 0;\n }\n\n layerInput = newH;\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n const idx = outputIndex(\n this.batchFirst,\n isUnbatched,\n batch,\n seqLen,\n this.hiddenSize,\n b,\n t,\n j\n );\n out[idx] = layerInput[j] ?? 0;\n }\n }\n }\n\n const outShape = isUnbatched\n ? [seqLen, this.hiddenSize]\n : this.batchFirst\n ? [batch, seqLen, this.hiddenSize]\n : [seqLen, batch, this.hiddenSize];\n\n return {\n output: Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: input.dtype,\n device: input.device,\n }),\n h: packState(\n h,\n this.numLayers,\n batch,\n this.hiddenSize,\n input.dtype,\n input.device,\n isUnbatched\n ),\n c: packState(\n c,\n this.numLayers,\n batch,\n this.hiddenSize,\n input.dtype,\n input.device,\n isUnbatched\n ),\n };\n }\n\n forward(...inputs: AnyTensor[]): Tensor {\n if (inputs.length < 1 || inputs.length > 3) {\n throw new InvalidParameterError(\n \"LSTM.forward expects 1 to 3 inputs\",\n \"inputs\",\n inputs.length\n );\n }\n const inputArg = inputs[0];\n if (inputArg === undefined) {\n throw new InvalidParameterError(\"LSTM.forward requires an input tensor\", \"input\", inputArg);\n }\n const input = extractTensor(inputArg, \"input\");\n const hxArg = inputs.length >= 2 ? inputs[1] : undefined;\n const cxArg = inputs.length >= 3 ? inputs[2] : undefined;\n const hx = hxArg === undefined ? undefined : extractTensor(hxArg, \"hx\");\n const cx = cxArg === undefined ? undefined : extractTensor(cxArg, \"cx\");\n return this.run(input, hx, cx).output;\n }\n\n /**\n * Forward pass returning output, hidden state, and cell state.\n * Use this method when you need the hidden/cell states.\n */\n forwardWithState(input: AnyTensor, hx?: AnyTensor, cx?: AnyTensor): [Tensor, [Tensor, Tensor]] {\n const inputTensor = extractTensor(input, \"input\");\n const hxTensor = hx === undefined ? undefined : extractTensor(hx, \"hx\");\n const cxTensor = cx === undefined ? undefined : extractTensor(cx, \"cx\");\n const { output, h, c } = this.run(inputTensor, hxTensor, cxTensor);\n return [output, [h, c]];\n }\n\n override toString(): string {\n return `LSTM(${this.inputSize}, ${this.hiddenSize}, num_layers=${this.numLayers})`;\n }\n}\n\n/**\n * GRU (Gated Recurrent Unit) layer.\n *\n * Applies a multi-layer GRU to an input sequence.\n *\n * **Gates**:\n * - Reset gate: r_t = σ(W_ir * x_t + b_ir + W_hr * h_{t-1} + b_hr)\n * - Update gate: z_t = σ(W_iz * x_t + b_iz + W_hz * h_{t-1} + b_hz)\n * - New gate: n_t = tanh(W_in * x_t + b_in + r_t * (W_hn * h_{t-1} + b_hn))\n * - Hidden: h_t = (1 - z_t) * n_t + z_t * h_{t-1}\n *\n * @see {@link https://pytorch.org/docs/stable/generated/torch.nn.GRU.html | PyTorch GRU}\n */\nexport class GRU extends Module {\n private readonly inputSize: number;\n private readonly hiddenSize: number;\n private readonly numLayers: number;\n private readonly bias: boolean;\n private readonly batchFirst: boolean;\n\n private weightsIh: Tensor[];\n private weightsHh: Tensor[];\n private biasIh: Tensor[];\n private biasHh: Tensor[];\n\n constructor(\n inputSize: number,\n hiddenSize: number,\n options: {\n readonly numLayers?: number;\n readonly bias?: boolean;\n readonly batchFirst?: boolean;\n } = {}\n ) {\n super();\n validatePositiveInt(\"inputSize\", inputSize);\n validatePositiveInt(\"hiddenSize\", hiddenSize);\n const numLayers = options.numLayers ?? 1;\n validatePositiveInt(\"numLayers\", numLayers);\n\n this.inputSize = inputSize;\n this.hiddenSize = hiddenSize;\n this.numLayers = numLayers;\n this.bias = options.bias ?? true;\n this.batchFirst = options.batchFirst ?? true;\n\n const stdv = 1.0 / Math.sqrt(hiddenSize);\n\n this.weightsIh = [];\n this.weightsHh = [];\n this.biasIh = [];\n this.biasHh = [];\n\n for (let layer = 0; layer < this.numLayers; layer++) {\n const inputDim = layer === 0 ? inputSize : hiddenSize;\n\n const wIh = mulScalar(randn([3 * hiddenSize, inputDim]), stdv);\n const wHh = mulScalar(randn([3 * hiddenSize, hiddenSize]), stdv);\n\n this.weightsIh.push(wIh);\n this.weightsHh.push(wHh);\n this.registerParameter(`weight_ih_l${layer}`, parameter(wIh));\n this.registerParameter(`weight_hh_l${layer}`, parameter(wHh));\n\n if (this.bias) {\n const bIh = zeros([3 * hiddenSize]);\n const bHh = zeros([3 * hiddenSize]);\n this.biasIh.push(bIh);\n this.biasHh.push(bHh);\n this.registerParameter(`bias_ih_l${layer}`, parameter(bIh));\n this.registerParameter(`bias_hh_l${layer}`, parameter(bHh));\n }\n }\n }\n\n private sigmoid(x: number): number {\n return 1 / (1 + Math.exp(-x));\n }\n\n private run(input: Tensor, hx?: Tensor): { output: Tensor; h: Tensor } {\n ensureFloatTensor(input, \"GRU\");\n const parsed = parseInput(input, this.batchFirst);\n const { batch, seqLen, inputDim, isUnbatched, batchStride, seqStride, featStride } = parsed;\n\n if (inputDim !== this.inputSize) {\n throw new ShapeError(`Expected input size ${this.inputSize}, got ${inputDim}`);\n }\n if (seqLen <= 0) {\n throw new InvalidParameterError(\"Sequence length must be positive\", \"seqLen\", seqLen);\n }\n if (!isUnbatched && batch <= 0) {\n throw new InvalidParameterError(\"Batch size must be positive\", \"batch\", batch);\n }\n\n const h = buildState(hx, this.numLayers, batch, this.hiddenSize, isUnbatched, \"hx\");\n const outSize = (isUnbatched ? seqLen : batch * seqLen) * this.hiddenSize;\n const out = createFloatBuffer(outSize, input.dtype);\n\n const inputVec = new Float64Array(inputDim);\n const gatesIh = new Float64Array(3 * this.hiddenSize);\n const gatesHh = new Float64Array(3 * this.hiddenSize);\n\n for (let t = 0; t < seqLen; t++) {\n for (let b = 0; b < batch; b++) {\n const baseOffset = input.offset + b * batchStride + t * seqStride;\n for (let i = 0; i < inputDim; i++) {\n inputVec[i] = readNumeric(input, baseOffset + i * featStride);\n }\n\n let layerInput = inputVec;\n\n for (let l = 0; l < this.numLayers; l++) {\n const wIh = this.weightsIh[l];\n const wHh = this.weightsHh[l];\n if (!wIh || !wHh) {\n throw new ShapeError(\"Internal error: missing GRU weights\");\n }\n\n const curInputSize = l === 0 ? this.inputSize : this.hiddenSize;\n const hLayer = h[l];\n if (!hLayer) {\n throw new ShapeError(\"Internal error: missing GRU hidden state\");\n }\n\n const wIhStride0 = wIh.strides[0] ?? 0;\n const wIhStride1 = wIh.strides[1] ?? 0;\n const wHhStride0 = wHh.strides[0] ?? 0;\n const wHhStride1 = wHh.strides[1] ?? 0;\n const biasIh = this.biasIh[l];\n const biasHh = this.biasHh[l];\n const biasIhStride = biasIh ? (biasIh.strides[0] ?? 0) : 0;\n const biasHhStride = biasHh ? (biasHh.strides[0] ?? 0) : 0;\n\n for (let g = 0; g < 3 * this.hiddenSize; g++) {\n let sumIh = 0;\n let sumHh = 0;\n const wIhBase = wIh.offset + g * wIhStride0;\n for (let k = 0; k < curInputSize; k++) {\n sumIh += (layerInput[k] ?? 0) * readNumeric(wIh, wIhBase + k * wIhStride1);\n }\n const wHhBase = wHh.offset + g * wHhStride0;\n for (let k = 0; k < this.hiddenSize; k++) {\n sumHh +=\n (hLayer[b * this.hiddenSize + k] ?? 0) * readNumeric(wHh, wHhBase + k * wHhStride1);\n }\n if (this.bias && biasIh && biasHh) {\n sumIh += readNumeric(biasIh, biasIh.offset + g * biasIhStride);\n sumHh += readNumeric(biasHh, biasHh.offset + g * biasHhStride);\n }\n gatesIh[g] = sumIh;\n gatesHh[g] = sumHh;\n }\n\n const newH = new Float64Array(this.hiddenSize);\n for (let j = 0; j < this.hiddenSize; j++) {\n const r = this.sigmoid((gatesIh[j] ?? 0) + (gatesHh[j] ?? 0));\n const z = this.sigmoid(\n (gatesIh[this.hiddenSize + j] ?? 0) + (gatesHh[this.hiddenSize + j] ?? 0)\n );\n const n = Math.tanh(\n (gatesIh[2 * this.hiddenSize + j] ?? 0) + r * (gatesHh[2 * this.hiddenSize + j] ?? 0)\n );\n newH[j] = (1 - z) * n + z * (hLayer[b * this.hiddenSize + j] ?? 0);\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n hLayer[b * this.hiddenSize + j] = newH[j] ?? 0;\n }\n\n layerInput = newH;\n }\n\n for (let j = 0; j < this.hiddenSize; j++) {\n const idx = outputIndex(\n this.batchFirst,\n isUnbatched,\n batch,\n seqLen,\n this.hiddenSize,\n b,\n t,\n j\n );\n out[idx] = layerInput[j] ?? 0;\n }\n }\n }\n\n const outShape = isUnbatched\n ? [seqLen, this.hiddenSize]\n : this.batchFirst\n ? [batch, seqLen, this.hiddenSize]\n : [seqLen, batch, this.hiddenSize];\n\n return {\n output: Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: input.dtype,\n device: input.device,\n }),\n h: packState(\n h,\n this.numLayers,\n batch,\n this.hiddenSize,\n input.dtype,\n input.device,\n isUnbatched\n ),\n };\n }\n\n forward(...inputs: AnyTensor[]): Tensor {\n if (inputs.length < 1 || inputs.length > 2) {\n throw new InvalidParameterError(\"GRU.forward expects 1 or 2 inputs\", \"inputs\", inputs.length);\n }\n const inputArg = inputs[0];\n if (inputArg === undefined) {\n throw new InvalidParameterError(\"GRU.forward requires an input tensor\", \"input\", inputArg);\n }\n const input = extractTensor(inputArg, \"input\");\n const hxArg = inputs.length === 2 ? inputs[1] : undefined;\n const hx = hxArg === undefined ? undefined : extractTensor(hxArg, \"hx\");\n return this.run(input, hx).output;\n }\n\n /**\n * Forward pass returning both output and hidden state.\n * Use this method when you need the hidden state.\n */\n forwardWithState(input: AnyTensor, hx?: AnyTensor): [Tensor, Tensor] {\n const inputTensor = extractTensor(input, \"input\");\n const hxTensor = hx === undefined ? undefined : extractTensor(hx, \"hx\");\n const { output, h } = this.run(inputTensor, hxTensor);\n return [output, h];\n }\n\n override toString(): string {\n return `GRU(${this.inputSize}, ${this.hiddenSize}, num_layers=${this.numLayers})`;\n }\n}\n","import {\n DTypeError,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n ShapeError,\n} from \"../../core\";\nimport { type AnyTensor, GradTensor, logSoftmaxGrad, Tensor } from \"../../ndarray\";\n\n/**\n * Helper to convert class indices to one-hot encoded tensor.\n */\nfunction toOneHot(indices: Tensor, numClasses: number): Tensor {\n const nSamples = indices.size;\n const outData = new Float32Array(nSamples * numClasses);\n\n const data = indices.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"crossEntropyLoss target indices must be numeric\");\n }\n\n const stride0 = indices.strides[0] ?? 0;\n const base = indices.offset;\n\n for (let i = 0; i < nSamples; i++) {\n const offset = base + i * stride0;\n let idx: number;\n if (data instanceof BigInt64Array) {\n const raw = getBigIntElement(data, offset);\n const asNumber = Number(raw);\n if (!Number.isSafeInteger(asNumber)) {\n throw new InvalidParameterError(\n `Class index ${raw.toString()} exceeds safe integer range`,\n \"target\",\n raw.toString()\n );\n }\n idx = asNumber;\n } else {\n idx = Number(getNumericElement(data, offset));\n }\n\n if (!Number.isFinite(idx) || !Number.isInteger(idx)) {\n throw new InvalidParameterError(`Class index ${idx} is not a valid integer`, \"target\", idx);\n }\n\n if (idx < 0 || idx >= numClasses) {\n throw new InvalidParameterError(\n `Class index ${idx} out of range [0, ${numClasses})`,\n \"target\",\n idx\n );\n }\n outData[i * numClasses + idx] = 1.0;\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: [nSamples, numClasses],\n dtype: \"float32\",\n device: indices.device,\n });\n}\n\n/**\n * Cross Entropy Loss.\n *\n * Computes the cross entropy loss between predictions and targets.\n * Commonly used for multi-class classification problems.\n *\n * Supports both integer class indices and one-hot encoded probabilities for targets.\n *\n * **Formula**: L = -mean(sum(target * log_softmax(input), dim=1))\n *\n * @param input - Predicted logits of shape (n_samples, n_classes)\n * @param target - True labels. Either:\n * - Class indices of shape (n_samples,)\n * - Probabilities/One-hot of shape (n_samples, n_classes)\n * @returns Scalar loss value (GradTensor)\n *\n * @example\n * ```ts\n * import { crossEntropyLoss } from 'deepbox/nn';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const pred = tensor([[0.7, 0.2, 0.1], [0.1, 0.8, 0.1]]);\n * const true_idx = tensor([0, 1]);\n * const loss = crossEntropyLoss(pred, true_idx);\n * ```\n */\nexport function crossEntropyLoss(input: Tensor, target: Tensor): number;\nexport function crossEntropyLoss(input: GradTensor, target: AnyTensor): GradTensor;\nexport function crossEntropyLoss(input: AnyTensor, target: AnyTensor): number | GradTensor {\n const yPred = input instanceof GradTensor ? input : GradTensor.fromTensor(input);\n const targetIsGrad = target instanceof GradTensor;\n // Target usually doesn't require grad, but if it's soft labels (distillation), it might.\n const yTrue =\n target instanceof GradTensor ? target : GradTensor.fromTensor(target, { requiresGrad: false });\n\n if (yPred.ndim !== 2) {\n throw new ShapeError(`Input must be 2-dimensional (batch, classes); got ${yPred.ndim}`);\n }\n\n const nSamples = yPred.shape[0] ?? 0;\n const nClasses = yPred.shape[1] ?? 0;\n\n let targetTensor = yTrue;\n\n // Handle class indices (1D)\n if (yTrue.ndim === 1) {\n if (targetIsGrad) {\n throw new ShapeError(\"Target must be 2-dimensional when provided as GradTensor\");\n }\n if (yTrue.shape[0] !== nSamples) {\n throw new ShapeError(\n `Target must have same number of samples as input; got ${yTrue.shape[0]} and ${nSamples}`\n );\n }\n // Convert to one-hot\n // We need to access the underlying tensor data\n const oneHot = toOneHot(yTrue.tensor, nClasses);\n targetTensor = GradTensor.fromTensor(oneHot, { requiresGrad: false });\n } else if (yTrue.ndim === 2) {\n if (yTrue.shape[0] !== nSamples || yTrue.shape[1] !== nClasses) {\n throw new ShapeError(\n \"Target must be 1-dimensional class indices or have the same shape as input\"\n );\n }\n } else {\n throw new ShapeError(`Target must be 1D (indices) or 2D (probs); got ${yTrue.ndim}D`);\n }\n\n // Compute Log Softmax\n const logProbs = logSoftmaxGrad(yPred, 1);\n\n // Compute NLL: -sum(target * log_prob) / N\n // Element-wise multiply\n const weighted = logProbs.mul(targetTensor);\n\n // Sum over classes (dim 1) -> (N,)\n const sampleLoss = weighted.sum(1);\n\n // Mean over batch -> scalar\n // Note: sum(1) returns (N,), mean() returns scalar.\n // But wait, `weighted` is negative log likelihood * target.\n // For one-hot target, sum(target * log_prob) is log_prob[class].\n // We want negative of that.\n // And then mean.\n\n const meanLoss = sampleLoss.mean().neg();\n if (!(input instanceof GradTensor) && !targetIsGrad) {\n const data = meanLoss.tensor.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"crossEntropyLoss does not support string dtype\");\n }\n if (data instanceof BigInt64Array) {\n const raw = getBigIntElement(data, meanLoss.tensor.offset);\n return Number(raw);\n }\n return getNumericElement(data, meanLoss.tensor.offset);\n }\n return meanLoss;\n}\n\n/**\n * Binary Cross Entropy Loss with logits.\n *\n * Combines sigmoid activation and binary cross entropy loss for numerical stability.\n *\n * @param input - Predicted logits of shape (n_samples,) or (n_samples, 1)\n * @param target - True binary labels of same shape as input\n * @returns Scalar loss value (GradTensor)\n */\nexport function binaryCrossEntropyWithLogitsLoss(input: Tensor, target: Tensor): number;\nexport function binaryCrossEntropyWithLogitsLoss(input: GradTensor, target: AnyTensor): GradTensor;\nexport function binaryCrossEntropyWithLogitsLoss(\n input: AnyTensor,\n target: AnyTensor\n): number | GradTensor {\n const yPred = input instanceof GradTensor ? input : GradTensor.fromTensor(input);\n const yTrue =\n target instanceof GradTensor ? target : GradTensor.fromTensor(target, { requiresGrad: false });\n\n // Check shapes\n // Support (N,) and (N, 1)\n let pred = yPred;\n let truth = yTrue;\n\n if (pred.ndim !== 1 && pred.ndim !== 2) {\n throw new ShapeError(\"Input must be 1 or 2-dimensional\");\n }\n if (truth.ndim !== 1 && truth.ndim !== 2) {\n throw new ShapeError(\"Target must be 1 or 2-dimensional\");\n }\n\n if (pred.ndim === 1) {\n pred = pred.reshape([pred.shape[0] ?? 0, 1]);\n }\n if (truth.ndim === 1) {\n truth = truth.reshape([truth.shape[0] ?? 0, 1]);\n }\n\n if (pred.ndim !== 2 || pred.shape[1] !== 1) {\n throw new ShapeError(`Input must have shape (N,) or (N, 1)`);\n }\n if (truth.ndim !== 2 || truth.shape[1] !== 1) {\n throw new ShapeError(`Target must be 1-dimensional or have shape (N, 1)`);\n }\n if ((pred.shape[0] ?? 0) !== (truth.shape[0] ?? 0)) {\n throw new ShapeError(`Batch size mismatch`);\n }\n\n const predDtype = pred.dtype;\n if (predDtype === \"string\") {\n throw new DTypeError(\"Binary cross entropy does not support string dtype\");\n }\n\n // max(x, 0) - x * z + log(1 + exp(-abs(x)))\n // We use autograd ops\n\n // term1 = max(x, 0) -> relu(x)\n const term1 = pred.relu();\n\n // term2 = x * z\n const term2 = pred.mul(truth);\n\n // term3 = log(1 + exp(-abs(x)))\n // abs(x) = relu(x) + relu(-x) or just use abs op if available?\n // GradTensor doesn't have abs yet?\n // We can use sign? Or just: abs(x) = sqrt(x^2)? No, gradient at 0.\n // Or: abs(x) = max(x, -x).\n // We have neg().\n // We have max() (which I added).\n // So abs(x) = max(x, x.neg())? No, max takes reduction axis.\n // Elementwise max is not exposed on GradTensor yet.\n // But wait, we can implement `softplus` (log(1+exp(x))) directly?\n // The formula uses `log(1 + exp(-abs(x)))`.\n // Alternative: `softplus(x)` if z=0, `softplus(x) - x` if z=1?\n // Standard stable BCEWithLogits:\n // loss = (1-z)*x + softplus(-x) if x > 0\n // loss = (1-z)*x + x + softplus(-x) ? No.\n\n // PyTorch uses: max(x, 0) - x*z + log(1 + exp(-abs(x)))\n // To implement `abs(x)` without primitive:\n // `x.pow(2).sqrt()` is abs(x) but unstable grad at 0.\n // `relu(x) + relu(-x)` works.\n\n const negPred = pred.neg();\n const absPred = pred.relu().add(negPred.relu());\n\n const expNegAbs = absPred.neg().exp();\n const scalarDtype = expNegAbs.dtype;\n if (scalarDtype === \"string\") {\n throw new DTypeError(\"binaryCrossEntropyWithLogitsLoss does not support string dtype\");\n }\n const one = GradTensor.scalar(1, { dtype: scalarDtype });\n const term3 = one.add(expNegAbs).log();\n\n const loss = term1.sub(term2).add(term3).mean();\n if (!(input instanceof GradTensor) && !(target instanceof GradTensor)) {\n const data = loss.tensor.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"binaryCrossEntropyWithLogitsLoss does not support string dtype\");\n }\n if (data instanceof BigInt64Array) {\n const raw = getBigIntElement(data, loss.tensor.offset);\n return Number(raw);\n }\n return getNumericElement(data, loss.tensor.offset);\n }\n return loss;\n}\n","import { DTypeError, getElementAsNumber, InvalidParameterError, ShapeError } from \"../../core\";\nimport {\n abs,\n add,\n clip,\n log,\n mean,\n mul,\n neg,\n pow,\n sqrt,\n sub,\n sum,\n Tensor,\n tensor,\n} from \"../../ndarray\";\nimport { offsetFromFlatIndex } from \"../../ndarray/tensor/strides\";\nimport { computeStrides } from \"../../ndarray/tensor/Tensor\";\n\nexport {\n binaryCrossEntropyWithLogitsLoss,\n crossEntropyLoss,\n} from \"./crossEntropy\";\n\nfunction shapesEqual(a: readonly number[], b: readonly number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if ((a[i] ?? 0) !== (b[i] ?? 0)) return false;\n }\n return true;\n}\n\nfunction ensureSameShape(a: Tensor, b: Tensor, context: string): void {\n if (!shapesEqual(a.shape, b.shape)) {\n throw new ShapeError(`Shape mismatch in ${context}: [${a.shape}] vs [${b.shape}]`);\n }\n}\n\nfunction ensureNumeric(t: Tensor, context: string): void {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${context} does not support string dtype`);\n }\n}\n\ntype NumericTensorData = Exclude<Tensor[\"data\"], string[]>;\n\nfunction validateReduction(reduction: \"mean\" | \"sum\" | \"none\", context: string): void {\n if (reduction !== \"mean\" && reduction !== \"sum\" && reduction !== \"none\") {\n throw new InvalidParameterError(\n `${context} reduction must be 'mean', 'sum', or 'none'`,\n \"reduction\",\n reduction\n );\n }\n}\n\nfunction readNumericFlat(\n data: NumericTensorData,\n flat: number,\n logicalStrides: readonly number[],\n strides: readonly number[],\n offset: number\n): number {\n const dataOffset = offsetFromFlatIndex(flat, logicalStrides, strides, offset);\n return getElementAsNumber(data, dataOffset);\n}\n\n/**\n * Mean Squared Error (MSE) loss function.\n *\n * **Mathematical Formula:**\n * ```\n * MSE = mean((y_pred - y_true)^2)\n * ```\n *\n * **Use Cases:**\n * - Regression tasks\n * - Continuous value prediction\n * - Measuring distance between predictions and targets\n *\n * **Properties:**\n * - Always non-negative\n * - Penalizes large errors more heavily (quadratic)\n * - Differentiable everywhere\n *\n * @param predictions - Predicted values\n * @param targets - True target values\n * @param reduction - How to reduce the loss: 'mean', 'sum', or 'none'\n * @returns Scalar loss value (or tensor if reduction='none')\n *\n * @example\n * ```ts\n * import { mseLoss } from 'deepbox/nn/losses';\n * import { tensor } from 'deepbox/ndarray';\n *\n * const predictions = tensor([2.5, 0.0, 2.1, 7.8]);\n * const targets = tensor([3.0, -0.5, 2.0, 8.0]);\n * const loss = mseLoss(predictions, targets); // Scalar tensor\n * ```\n *\n * @category Loss Functions\n */\nexport function mseLoss(\n predictions: Tensor,\n targets: Tensor,\n reduction: \"mean\" | \"sum\" | \"none\" = \"mean\"\n): Tensor {\n validateReduction(reduction, \"mseLoss\");\n ensureNumeric(predictions, \"mseLoss\");\n ensureNumeric(targets, \"mseLoss\");\n ensureSameShape(predictions, targets, \"mseLoss\");\n\n const diff = sub(predictions, targets);\n const squaredDiff = pow(diff, tensor(2, { dtype: diff.dtype, device: diff.device }));\n\n if (reduction === \"none\") {\n return squaredDiff;\n }\n if (reduction === \"sum\") {\n return sum(squaredDiff);\n }\n return mean(squaredDiff);\n}\n\n/**\n * Mean Absolute Error (MAE) loss function, also known as L1 loss.\n *\n * **Mathematical Formula:**\n * ```\n * MAE = mean(|y_pred - y_true|)\n * ```\n *\n * **Use Cases:**\n * - Regression tasks where outliers should have less influence\n * - More robust to outliers than MSE\n *\n * **Properties:**\n * - Always non-negative\n * - Linear penalty for errors\n * - Less sensitive to outliers than MSE\n *\n * @param predictions - Predicted values\n * @param targets - True target values\n * @param reduction - How to reduce the loss: 'mean', 'sum', or 'none'\n * @returns Scalar loss value (or tensor if reduction='none')\n *\n * @category Loss Functions\n */\nexport function maeLoss(\n predictions: Tensor,\n targets: Tensor,\n reduction: \"mean\" | \"sum\" | \"none\" = \"mean\"\n): Tensor {\n validateReduction(reduction, \"maeLoss\");\n ensureNumeric(predictions, \"maeLoss\");\n ensureNumeric(targets, \"maeLoss\");\n ensureSameShape(predictions, targets, \"maeLoss\");\n\n const diff = sub(predictions, targets);\n const absDiff = abs(diff);\n\n if (reduction === \"none\") {\n return absDiff;\n }\n if (reduction === \"sum\") {\n return sum(absDiff);\n }\n return mean(absDiff);\n}\n\n/**\n * Binary Cross-Entropy (BCE) loss function.\n *\n * **Mathematical Formula:**\n * ```\n * BCE = -mean(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred))\n * ```\n *\n * **Use Cases:**\n * - Binary classification tasks\n * - Multi-label classification (independent binary decisions)\n * - Predictions should be probabilities in (0, 1)\n *\n * **Properties:**\n * - Requires predictions in range (0, 1) - use sigmoid activation\n * - Targets should be 0 or 1\n * - Numerically stable with epsilon for log\n *\n * @param predictions - Predicted probabilities (0 to 1)\n * @param targets - True binary labels (0 or 1)\n * @param reduction - How to reduce the loss: 'mean', 'sum', or 'none'\n * @returns Scalar loss value (or tensor if reduction='none')\n *\n * @category Loss Functions\n */\nexport function binaryCrossEntropyLoss(\n predictions: Tensor,\n targets: Tensor,\n reduction: \"mean\" | \"sum\" | \"none\" = \"mean\"\n): Tensor {\n validateReduction(reduction, \"binaryCrossEntropyLoss\");\n ensureNumeric(predictions, \"binaryCrossEntropyLoss\");\n ensureNumeric(targets, \"binaryCrossEntropyLoss\");\n ensureSameShape(predictions, targets, \"binaryCrossEntropyLoss\");\n\n const epsilon = 1e-7;\n const predClamped = clip(predictions, epsilon, 1 - epsilon);\n\n const logPred = log(predClamped);\n const term1 = mul(targets, logPred);\n\n const one = tensor(1, {\n dtype: predictions.dtype === \"float64\" ? \"float64\" : \"float32\",\n device: predictions.device,\n });\n const oneMinusTargets = sub(one, targets);\n const oneMinusPred = sub(one, predClamped);\n const logOneMinusPred = log(oneMinusPred);\n const term2 = mul(oneMinusTargets, logOneMinusPred);\n\n const loss = neg(add(term1, term2));\n\n if (reduction === \"none\") {\n return loss;\n }\n if (reduction === \"sum\") {\n return sum(loss);\n }\n return mean(loss);\n}\n\n/**\n * Root Mean Squared Error (RMSE) loss function.\n *\n * **Mathematical Formula:**\n * ```\n * RMSE = sqrt(mean((y_pred - y_true)^2))\n * ```\n *\n * **Use Cases:**\n * - Regression tasks\n * - When you want error in same units as target\n * - More interpretable than MSE\n *\n * @param predictions - Predicted values\n * @param targets - True target values\n * @returns Scalar loss value\n *\n * @category Loss Functions\n */\nexport function rmseLoss(predictions: Tensor, targets: Tensor): Tensor {\n ensureNumeric(predictions, \"rmseLoss\");\n ensureNumeric(targets, \"rmseLoss\");\n ensureSameShape(predictions, targets, \"rmseLoss\");\n\n const mse = mseLoss(predictions, targets, \"mean\");\n return sqrt(mse);\n}\n\n/**\n * Huber loss function - combines MSE and MAE.\n *\n * **Mathematical Formula:**\n * ```\n * Huber(a) = 0.5 * a^2 if |a| <= delta\n * = delta * (|a| - 0.5 * delta) otherwise\n * where a = y_pred - y_true\n * ```\n *\n * **Use Cases:**\n * - Regression with outliers\n * - Robust to outliers while maintaining MSE benefits for small errors\n *\n * **Properties:**\n * - Quadratic for small errors (like MSE)\n * - Linear for large errors (like MAE)\n * - Controlled by delta parameter\n *\n * @param predictions - Predicted values\n * @param targets - True target values\n * @param delta - Threshold where loss transitions from quadratic to linear\n * @param reduction - How to reduce the loss: 'mean', 'sum', or 'none'\n * @returns Scalar loss value (or tensor if reduction='none')\n *\n * @category Loss Functions\n */\nexport function huberLoss(\n predictions: Tensor,\n targets: Tensor,\n delta = 1.0,\n reduction: \"mean\" | \"sum\" | \"none\" = \"mean\"\n): Tensor {\n validateReduction(reduction, \"huberLoss\");\n ensureNumeric(predictions, \"huberLoss\");\n ensureNumeric(targets, \"huberLoss\");\n ensureSameShape(predictions, targets, \"huberLoss\");\n\n if (!Number.isFinite(delta) || delta <= 0) {\n throw new InvalidParameterError(`delta must be positive; got ${delta}`, \"delta\", delta);\n }\n\n const diff = sub(predictions, targets);\n const absDiff = abs(diff);\n\n const absData = absDiff.data;\n if (Array.isArray(absData)) {\n throw new DTypeError(\"huberLoss does not support string dtype\");\n }\n const dtype = predictions.dtype === \"float64\" ? \"float64\" : \"float32\";\n const lossData = dtype === \"float64\" ? new Float64Array(diff.size) : new Float32Array(diff.size);\n const logicalStrides = computeStrides(absDiff.shape);\n for (let i = 0; i < diff.size; i++) {\n const absVal = readNumericFlat(absData, i, logicalStrides, absDiff.strides, absDiff.offset);\n if (absVal <= delta) {\n lossData[i] = 0.5 * absVal * absVal;\n } else {\n lossData[i] = delta * (absVal - 0.5 * delta);\n }\n }\n\n const loss = Tensor.fromTypedArray({\n data: lossData,\n shape: predictions.shape,\n dtype,\n device: predictions.device,\n });\n\n if (reduction === \"none\") {\n return loss;\n }\n if (reduction === \"sum\") {\n return sum(loss);\n }\n return mean(loss);\n}\n"]}