warpvector 0.1.1 → 0.1.2

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.
package/dist/index.d.mts CHANGED
@@ -533,6 +533,7 @@ declare class MlpAdapter implements WarpAdapter {
533
533
  private layerDimsPtr;
534
534
  private activationsPtr;
535
535
  private bufferPtr;
536
+ private bufBPtr;
536
537
  constructor(layers: MlpLayer[]);
537
538
  /**
538
539
  * WASMの初期化と、MLP構造をWASMメモリに書き込む準備を行います。
@@ -585,6 +586,10 @@ declare class WhiteningAdapter implements WarpAdapter {
585
586
  private count;
586
587
  private learningRate;
587
588
  private numComponents;
589
+ private componentsPtr;
590
+ private xResidualPtr;
591
+ private isWasmReady;
592
+ init(): Promise<void>;
588
593
  /**
589
594
  * 新しい WhiteningAdapter を作成します。
590
595
  * @param dim ベクトルの次元数
@@ -837,6 +842,12 @@ interface QuantizationConfig {
837
842
  * 量子化するベクトルの次元数
838
843
  */
839
844
  dim: number;
845
+ /**
846
+ * 動的キャリブレーション(スケール算出)を有効にするか。
847
+ * trueの場合、ベクトルの絶対値の最大値 max(abs(v)) を算出し、
848
+ * scale = 127 / max(abs(v)) を用いて量子化します。
849
+ */
850
+ dynamic?: boolean;
840
851
  }
841
852
  /**
842
853
  * QuantizationAdapter は、Float32のベクトルを Int8 や Binary に圧縮し、
@@ -845,6 +856,7 @@ interface QuantizationConfig {
845
856
  declare class QuantizationAdapter implements WarpAdapter {
846
857
  private type;
847
858
  private dim;
859
+ private dynamic;
848
860
  constructor(config: QuantizationConfig);
849
861
  tune(vector: number[] | Float32Array): Int8Array | Uint8Array;
850
862
  /**
@@ -854,6 +866,7 @@ declare class QuantizationAdapter implements WarpAdapter {
854
866
  static hammingDistance(a: Uint8Array, b: Uint8Array): number;
855
867
  /**
856
868
  * Int8量子化された2つのベクトル間のドット積(内積)を計算します。
869
+ * 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
857
870
  */
858
871
  static int8DotProduct(a: Int8Array, b: Int8Array): number;
859
872
  exportState(): string;
package/dist/index.d.ts CHANGED
@@ -533,6 +533,7 @@ declare class MlpAdapter implements WarpAdapter {
533
533
  private layerDimsPtr;
534
534
  private activationsPtr;
535
535
  private bufferPtr;
536
+ private bufBPtr;
536
537
  constructor(layers: MlpLayer[]);
537
538
  /**
538
539
  * WASMの初期化と、MLP構造をWASMメモリに書き込む準備を行います。
@@ -585,6 +586,10 @@ declare class WhiteningAdapter implements WarpAdapter {
585
586
  private count;
586
587
  private learningRate;
587
588
  private numComponents;
589
+ private componentsPtr;
590
+ private xResidualPtr;
591
+ private isWasmReady;
592
+ init(): Promise<void>;
588
593
  /**
589
594
  * 新しい WhiteningAdapter を作成します。
590
595
  * @param dim ベクトルの次元数
@@ -837,6 +842,12 @@ interface QuantizationConfig {
837
842
  * 量子化するベクトルの次元数
838
843
  */
839
844
  dim: number;
845
+ /**
846
+ * 動的キャリブレーション(スケール算出)を有効にするか。
847
+ * trueの場合、ベクトルの絶対値の最大値 max(abs(v)) を算出し、
848
+ * scale = 127 / max(abs(v)) を用いて量子化します。
849
+ */
850
+ dynamic?: boolean;
840
851
  }
841
852
  /**
842
853
  * QuantizationAdapter は、Float32のベクトルを Int8 や Binary に圧縮し、
@@ -845,6 +856,7 @@ interface QuantizationConfig {
845
856
  declare class QuantizationAdapter implements WarpAdapter {
846
857
  private type;
847
858
  private dim;
859
+ private dynamic;
848
860
  constructor(config: QuantizationConfig);
849
861
  tune(vector: number[] | Float32Array): Int8Array | Uint8Array;
850
862
  /**
@@ -854,6 +866,7 @@ declare class QuantizationAdapter implements WarpAdapter {
854
866
  static hammingDistance(a: Uint8Array, b: Uint8Array): number;
855
867
  /**
856
868
  * Int8量子化された2つのベクトル間のドット積(内積)を計算します。
869
+ * 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
857
870
  */
858
871
  static int8DotProduct(a: Int8Array, b: Int8Array): number;
859
872
  exportState(): string;
package/dist/index.js CHANGED
@@ -829,7 +829,7 @@ function applyAffine(matrix, bias, vector, result, inDim, outDim = inDim) {
829
829
  }
830
830
 
831
831
  // src/wasm/wasm-binary.ts
832
- var wasmBase64 = "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";
832
+ var wasmBase64 = "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";
833
833
 
834
834
  // src/wasm/wasm-loader.ts
835
835
  var wasmInstance = null;
@@ -867,6 +867,22 @@ function ensureWasmMemory(requiredBytes) {
867
867
  return false;
868
868
  }
869
869
  }
870
+ var globalOffset = 65536;
871
+ function allocateWasmMemory(bytes) {
872
+ const ptr = globalOffset;
873
+ globalOffset += bytes;
874
+ if (globalOffset % 4 !== 0) {
875
+ globalOffset += 4 - globalOffset % 4;
876
+ }
877
+ ensureWasmMemory(globalOffset);
878
+ return ptr;
879
+ }
880
+ function getWasmAllocatorOffset() {
881
+ return globalOffset;
882
+ }
883
+ function setWasmAllocatorOffset(offset) {
884
+ globalOffset = offset;
885
+ }
870
886
  function writeFloat32ArrayToWasm(memory, data, byteOffset) {
871
887
  const f32 = new Float32Array(memory.buffer);
872
888
  const floatOffset = byteOffset / 4;
@@ -1706,6 +1722,7 @@ var MlpAdapter = class _MlpAdapter {
1706
1722
  layerDimsPtr = 0;
1707
1723
  activationsPtr = 0;
1708
1724
  bufferPtr = 0;
1725
+ bufBPtr = 0;
1709
1726
  constructor(layers) {
1710
1727
  if (layers.length === 0) {
1711
1728
  throw new Error("MlpAdapter requires at least one layer.");
@@ -1756,21 +1773,13 @@ var MlpAdapter = class _MlpAdapter {
1756
1773
  }
1757
1774
  this.inputDim = layerDims[0];
1758
1775
  this.outputDim = layerDims[layerDims.length - 1];
1759
- let offset = 65536;
1760
- this.inputPtr = offset;
1761
- offset += this.inputDim * 4;
1762
- this.outputPtr = offset;
1763
- offset += this.outputDim * 4;
1764
- this.layerDimsPtr = offset;
1765
- offset += (this.numLayers + 1) * 4;
1766
- this.activationsPtr = offset;
1767
- offset += this.numLayers * 4;
1768
- if (offset % 4 !== 0) offset += 4 - offset % 4;
1769
- this.weightsPtr = offset;
1770
- offset += totalWeights * 4;
1771
- this.bufferPtr = offset;
1772
- offset += maxDim * 8 + 8192;
1773
- ensureWasmMemory(offset);
1776
+ this.inputPtr = allocateWasmMemory(this.inputDim * 4);
1777
+ this.outputPtr = allocateWasmMemory(this.outputDim * 4);
1778
+ this.layerDimsPtr = allocateWasmMemory((this.numLayers + 1) * 4);
1779
+ this.activationsPtr = allocateWasmMemory(this.numLayers * 4);
1780
+ this.weightsPtr = allocateWasmMemory(totalWeights * 4);
1781
+ this.bufferPtr = allocateWasmMemory(maxDim * 4);
1782
+ this.bufBPtr = allocateWasmMemory(maxDim * 4);
1774
1783
  const memoryBuffer = memory.buffer;
1775
1784
  const f32 = new Float32Array(memoryBuffer);
1776
1785
  const i32 = new Int32Array(memoryBuffer);
@@ -1830,7 +1839,8 @@ var MlpAdapter = class _MlpAdapter {
1830
1839
  this.layerDimsPtr,
1831
1840
  this.activationsPtr,
1832
1841
  this.numLayers,
1833
- this.bufferPtr
1842
+ this.bufferPtr,
1843
+ this.bufBPtr
1834
1844
  );
1835
1845
  const result = new Float32Array(this.outputDim);
1836
1846
  const outF32 = new Float32Array(memory.buffer);
@@ -1884,6 +1894,19 @@ var WhiteningAdapter = class _WhiteningAdapter {
1884
1894
  count = 0;
1885
1895
  learningRate;
1886
1896
  numComponents;
1897
+ componentsPtr = 0;
1898
+ xResidualPtr = 0;
1899
+ isWasmReady = false;
1900
+ async init() {
1901
+ const instance = await initWasm();
1902
+ if (instance) {
1903
+ const componentsSize = this.numComponents * this.dim * 4;
1904
+ const xResidualSize = this.dim * 4;
1905
+ this.componentsPtr = allocateWasmMemory(componentsSize);
1906
+ this.xResidualPtr = allocateWasmMemory(xResidualSize);
1907
+ this.isWasmReady = true;
1908
+ }
1909
+ }
1887
1910
  /**
1888
1911
  * 新しい WhiteningAdapter を作成します。
1889
1912
  * @param dim ベクトルの次元数
@@ -1927,13 +1950,17 @@ var WhiteningAdapter = class _WhiteningAdapter {
1927
1950
  }
1928
1951
  const x_residual = new Float32Array(x);
1929
1952
  const instance = getWasmInstance();
1930
- const componentsSize = this.numComponents * this.dim * 4;
1931
- const xResidualSize = this.dim * 4;
1932
- const requiredBytes = componentsSize + xResidualSize;
1933
- if (instance && instance.exports.sangerUpdateWasm && ensureWasmMemory(requiredBytes)) {
1953
+ if (instance && instance.exports.sangerUpdateWasm) {
1954
+ if (!this.isWasmReady) {
1955
+ const componentsSize = this.numComponents * this.dim * 4;
1956
+ const xResidualSize = this.dim * 4;
1957
+ this.componentsPtr = allocateWasmMemory(componentsSize);
1958
+ this.xResidualPtr = allocateWasmMemory(xResidualSize);
1959
+ this.isWasmReady = true;
1960
+ }
1934
1961
  const memory = instance.exports.memory;
1935
- const componentsPtr = 0;
1936
- const xResidualPtr = componentsSize;
1962
+ const componentsPtr = this.componentsPtr;
1963
+ const xResidualPtr = this.xResidualPtr;
1937
1964
  const f32 = new Float32Array(memory.buffer);
1938
1965
  for (let k = 0; k < this.numComponents; k++) {
1939
1966
  const comp = this.components[k];
@@ -2048,19 +2075,22 @@ var ColbertAdapter = class {
2048
2075
  const { memory, colbertMaxSimWasm } = this.wasm.exports;
2049
2076
  const queryBytes = queryTokens.byteLength;
2050
2077
  const docBytes = documentTokens.byteLength;
2051
- const totalBytes = queryBytes + docBytes;
2052
- ensureWasmMemory(totalBytes);
2053
- const queryPtr = 0;
2054
- const docPtr = queryBytes;
2055
- writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2056
- writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
2057
- return colbertMaxSimWasm(
2058
- queryPtr,
2059
- docPtr,
2060
- numQueryTokens,
2061
- numDocTokens,
2062
- dim
2063
- );
2078
+ const initialOffset = getWasmAllocatorOffset();
2079
+ try {
2080
+ const queryPtr = allocateWasmMemory(queryBytes);
2081
+ const docPtr = allocateWasmMemory(docBytes);
2082
+ writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2083
+ writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
2084
+ return colbertMaxSimWasm(
2085
+ queryPtr,
2086
+ docPtr,
2087
+ numQueryTokens,
2088
+ numDocTokens,
2089
+ dim
2090
+ );
2091
+ } finally {
2092
+ setWasmAllocatorOffset(initialOffset);
2093
+ }
2064
2094
  }
2065
2095
  /**
2066
2096
  * クエリと複数のドキュメント間の MaxSim スコアを計算し、スコアの降順にソートして返します。
@@ -2084,27 +2114,30 @@ var ColbertAdapter = class {
2084
2114
  }
2085
2115
  const queryBytes = queryTokens.byteLength;
2086
2116
  const maxDocBytes = maxDocLen * Float32Array.BYTES_PER_ELEMENT;
2087
- const totalBytes = queryBytes + maxDocBytes;
2088
- ensureWasmMemory(totalBytes);
2089
- const queryPtr = 0;
2090
- const docPtr = queryBytes;
2091
- writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2092
- const results = documentTokensArray.map((doc, index) => {
2093
- const numDocTokens = doc.length / dim;
2094
- if (numDocTokens % 1 !== 0) {
2095
- throw new Error(`Invalid documentTokens length at index ${index}`);
2096
- }
2097
- writeFloat32ArrayToWasm(memory, doc, docPtr);
2098
- const score = colbertMaxSimWasm(
2099
- queryPtr,
2100
- docPtr,
2101
- numQueryTokens,
2102
- numDocTokens,
2103
- dim
2104
- );
2105
- return { index, score };
2106
- });
2107
- return results.sort((a, b) => b.score - a.score);
2117
+ const initialOffset = getWasmAllocatorOffset();
2118
+ try {
2119
+ const queryPtr = allocateWasmMemory(queryBytes);
2120
+ const docPtr = allocateWasmMemory(maxDocBytes);
2121
+ writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2122
+ const results = documentTokensArray.map((doc, index) => {
2123
+ const numDocTokens = doc.length / dim;
2124
+ if (numDocTokens % 1 !== 0) {
2125
+ throw new Error(`Invalid documentTokens length at index ${index}`);
2126
+ }
2127
+ writeFloat32ArrayToWasm(memory, doc, docPtr);
2128
+ const score = colbertMaxSimWasm(
2129
+ queryPtr,
2130
+ docPtr,
2131
+ numQueryTokens,
2132
+ numDocTokens,
2133
+ dim
2134
+ );
2135
+ return { index, score };
2136
+ });
2137
+ return results.sort((a, b) => b.score - a.score);
2138
+ } finally {
2139
+ setWasmAllocatorOffset(initialOffset);
2140
+ }
2108
2141
  }
2109
2142
  };
2110
2143
 
@@ -2124,6 +2157,13 @@ var VectorDBAdapter = class {
2124
2157
  * @returns {string} `'[0.1, 0.2, 0.3]'` のような文字列表現
2125
2158
  */
2126
2159
  static toPgvector(vector) {
2160
+ if (vector instanceof Uint8Array) {
2161
+ let bitString = "";
2162
+ for (let i = 0; i < vector.length; i++) {
2163
+ bitString += vector[i].toString(2).padStart(8, "0");
2164
+ }
2165
+ return bitString;
2166
+ }
2127
2167
  return `[${Array.from(vector).join(", ")}]`;
2128
2168
  }
2129
2169
  /**
@@ -2187,18 +2227,37 @@ var withWarpVector = (config) => {
2187
2227
  */
2188
2228
  async searchByVector(args) {
2189
2229
  const context = import_extension.Prisma.getExtensionContext(this);
2190
- const tableName = context.$name;
2230
+ const tableName = context.$name || "document";
2231
+ if (!/^[a-zA-Z0-9_]+$/.test(tableName)) {
2232
+ throw new Error(`Invalid table name: ${tableName}`);
2233
+ }
2234
+ if (!/^[a-zA-Z0-9_]+$/.test(vectorField)) {
2235
+ throw new Error(`Invalid vector field name: ${vectorField}`);
2236
+ }
2237
+ if (!["<->", "<#>", "<=>"].includes(distanceOp)) {
2238
+ throw new Error(`Invalid distance operator: ${distanceOp}`);
2239
+ }
2240
+ let whereClause = "";
2241
+ if (args.where) {
2242
+ const trimmedWhere = args.where.trim();
2243
+ if (/;|--|\/\*/.test(trimmedWhere)) {
2244
+ throw new Error("Potential SQL injection detected in where clause.");
2245
+ }
2246
+ whereClause = `WHERE ${trimmedWhere}`;
2247
+ }
2248
+ const limit = args.topK ?? 10;
2249
+ if (typeof limit !== "number" || isNaN(limit) || limit < 0) {
2250
+ throw new Error("Invalid topK value.");
2251
+ }
2191
2252
  const tunedVector = config.adapter.tune(args.vector);
2192
2253
  const pgVectorStr = VectorDBAdapter.toPgvector(tunedVector);
2193
- const limit = args.topK ?? 10;
2194
- const whereClause = args.where ? `WHERE ${args.where}` : "";
2195
2254
  const sql = `
2196
2255
  SELECT *
2197
2256
  FROM "${tableName}"
2198
2257
  ${whereClause}
2199
2258
  ORDER BY "${vectorField}" ${distanceOp} '${pgVectorStr}'::vector
2200
2259
  LIMIT ${limit};
2201
- `;
2260
+ `.trim();
2202
2261
  return client.$queryRawUnsafe(sql);
2203
2262
  }
2204
2263
  }
@@ -2570,9 +2629,11 @@ var WarpLlamaIndexEmbeddings = class {
2570
2629
  var QuantizationAdapter = class _QuantizationAdapter {
2571
2630
  type;
2572
2631
  dim;
2632
+ dynamic;
2573
2633
  constructor(config) {
2574
2634
  this.type = config.type;
2575
2635
  this.dim = config.dim;
2636
+ this.dynamic = config.dynamic ?? false;
2576
2637
  if (this.type === "binary" && this.dim % 8 !== 0) {
2577
2638
  throw new Error(
2578
2639
  `Binary quantization requires dimension to be a multiple of 8. Got ${this.dim}`
@@ -2582,14 +2643,33 @@ var QuantizationAdapter = class _QuantizationAdapter {
2582
2643
  tune(vector) {
2583
2644
  assertDimension(vector, this.dim, "QuantizationAdapter.tune");
2584
2645
  if (this.type === "int8") {
2585
- const result = new Int8Array(this.dim);
2586
- for (let i = 0; i < this.dim; i++) {
2587
- let val = Math.round(vector[i] * 127);
2588
- if (val > 127) val = 127;
2589
- if (val < -128) val = -128;
2590
- result[i] = val;
2646
+ if (this.dynamic) {
2647
+ let maxVal = 1e-8;
2648
+ for (let i = 0; i < this.dim; i++) {
2649
+ const abs = Math.abs(vector[i]);
2650
+ if (abs > maxVal) maxVal = abs;
2651
+ }
2652
+ const scale = 127 / maxVal;
2653
+ const result = new Int8Array(this.dim + 4);
2654
+ for (let i = 0; i < this.dim; i++) {
2655
+ let val = Math.round(vector[i] * scale);
2656
+ if (val > 127) val = 127;
2657
+ if (val < -128) val = -128;
2658
+ result[i] = val;
2659
+ }
2660
+ const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
2661
+ view.setFloat32(this.dim, maxVal, true);
2662
+ return result;
2663
+ } else {
2664
+ const result = new Int8Array(this.dim);
2665
+ for (let i = 0; i < this.dim; i++) {
2666
+ let val = Math.round(vector[i] * 127);
2667
+ if (val > 127) val = 127;
2668
+ if (val < -128) val = -128;
2669
+ result[i] = val;
2670
+ }
2671
+ return result;
2591
2672
  }
2592
- return result;
2593
2673
  } else if (this.type === "binary") {
2594
2674
  const bytesLength = this.dim / 8;
2595
2675
  const result = new Uint8Array(bytesLength);
@@ -2622,17 +2702,45 @@ var QuantizationAdapter = class _QuantizationAdapter {
2622
2702
  }
2623
2703
  /**
2624
2704
  * Int8量子化された2つのベクトル間のドット積(内積)を計算します。
2705
+ * 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
2625
2706
  */
2626
2707
  static int8DotProduct(a, b) {
2627
2708
  if (a.length !== b.length) throw new Error("Length mismatch");
2628
- let dot = 0;
2629
- for (let i = 0; i < a.length; i++) {
2630
- dot += a[i] * b[i];
2709
+ const hasScaleBytes = a.length > 4;
2710
+ let isDynamic = false;
2711
+ let maxA = 1;
2712
+ let maxB = 1;
2713
+ if (hasScaleBytes) {
2714
+ const dim = a.length - 4;
2715
+ try {
2716
+ const viewA = new DataView(a.buffer, a.byteOffset, a.byteLength);
2717
+ const viewB = new DataView(b.buffer, b.byteOffset, b.byteLength);
2718
+ maxA = viewA.getFloat32(dim, true);
2719
+ maxB = viewB.getFloat32(dim, true);
2720
+ if (!isNaN(maxA) && !isNaN(maxB) && maxA > 0 && maxA < 1e3 && maxB > 0 && maxB < 1e3) {
2721
+ isDynamic = true;
2722
+ }
2723
+ } catch (e) {
2724
+ isDynamic = false;
2725
+ }
2726
+ }
2727
+ if (isDynamic) {
2728
+ const dim = a.length - 4;
2729
+ let dot = 0;
2730
+ for (let i = 0; i < dim; i++) {
2731
+ dot += a[i] * b[i];
2732
+ }
2733
+ return dot * (maxA / 127) * (maxB / 127);
2734
+ } else {
2735
+ let dot = 0;
2736
+ for (let i = 0; i < a.length; i++) {
2737
+ dot += a[i] * b[i];
2738
+ }
2739
+ return dot;
2631
2740
  }
2632
- return dot;
2633
2741
  }
2634
2742
  exportState() {
2635
- return JSON.stringify({ type: this.type, dim: this.dim });
2743
+ return JSON.stringify({ type: this.type, dim: this.dim, dynamic: this.dynamic });
2636
2744
  }
2637
2745
  static importState(stateJson) {
2638
2746
  const config = JSON.parse(stateJson);
@@ -2667,22 +2775,78 @@ var AbstractAdamTrainer = class {
2667
2775
  const beta1 = 0.9;
2668
2776
  const beta2 = 0.999;
2669
2777
  const epsilon = 1e-8;
2670
- for (let i = 0; i < tDim; i++) {
2671
- const bGrad = outputGradients[i];
2672
- mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
2673
- vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
2674
- const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
2675
- const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
2676
- bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
2677
- const rowOffset = i * sDim;
2678
- for (let j = 0; j < sDim; j++) {
2679
- const wIdx = rowOffset + j;
2680
- const wGrad = bGrad * input[j] + reg * matrix[wIdx];
2681
- mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
2682
- vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
2683
- const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
2684
- const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
2685
- matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
2778
+ const instance = getWasmInstance();
2779
+ if (instance && instance.exports.adamUpdateWasm) {
2780
+ const memory = instance.exports.memory;
2781
+ const matrixBytes = matrix.byteLength;
2782
+ const biasBytes = bias.byteLength;
2783
+ const inputBytes = sDim * 4;
2784
+ const gradBytes = tDim * 4;
2785
+ const initialOffset = getWasmAllocatorOffset();
2786
+ try {
2787
+ const matrixPtr = allocateWasmMemory(matrixBytes);
2788
+ const biasPtr = allocateWasmMemory(biasBytes);
2789
+ const mMatrixPtr = allocateWasmMemory(matrixBytes);
2790
+ const vMatrixPtr = allocateWasmMemory(matrixBytes);
2791
+ const mBiasPtr = allocateWasmMemory(biasBytes);
2792
+ const vBiasPtr = allocateWasmMemory(biasBytes);
2793
+ const inputPtr = allocateWasmMemory(inputBytes);
2794
+ const gradPtr = allocateWasmMemory(gradBytes);
2795
+ writeFloat32ArrayToWasm(memory, matrix, matrixPtr);
2796
+ writeFloat32ArrayToWasm(memory, bias, biasPtr);
2797
+ writeFloat32ArrayToWasm(memory, mMatrix, mMatrixPtr);
2798
+ writeFloat32ArrayToWasm(memory, vMatrix, vMatrixPtr);
2799
+ writeFloat32ArrayToWasm(memory, mBias, mBiasPtr);
2800
+ writeFloat32ArrayToWasm(memory, vBias, vBiasPtr);
2801
+ writeFloat32ArrayToWasm(memory, input, inputPtr);
2802
+ writeFloat32ArrayToWasm(memory, outputGradients, gradPtr);
2803
+ const adamUpdateWasm = instance.exports.adamUpdateWasm;
2804
+ adamUpdateWasm(
2805
+ matrixPtr,
2806
+ biasPtr,
2807
+ mMatrixPtr,
2808
+ vMatrixPtr,
2809
+ mBiasPtr,
2810
+ vBiasPtr,
2811
+ inputPtr,
2812
+ gradPtr,
2813
+ lr,
2814
+ reg,
2815
+ beta1,
2816
+ beta2,
2817
+ epsilon,
2818
+ t,
2819
+ sDim,
2820
+ tDim
2821
+ );
2822
+ const f32 = new Float32Array(memory.buffer);
2823
+ matrix.set(f32.subarray(matrixPtr / 4, matrixPtr / 4 + matrix.length));
2824
+ bias.set(f32.subarray(biasPtr / 4, biasPtr / 4 + bias.length));
2825
+ mMatrix.set(f32.subarray(mMatrixPtr / 4, mMatrixPtr / 4 + mMatrix.length));
2826
+ vMatrix.set(f32.subarray(vMatrixPtr / 4, vMatrixPtr / 4 + vMatrix.length));
2827
+ mBias.set(f32.subarray(mBiasPtr / 4, mBiasPtr / 4 + mBias.length));
2828
+ vBias.set(f32.subarray(vBiasPtr / 4, vBiasPtr / 4 + vBias.length));
2829
+ } finally {
2830
+ setWasmAllocatorOffset(initialOffset);
2831
+ }
2832
+ } else {
2833
+ for (let i = 0; i < tDim; i++) {
2834
+ const bGrad = outputGradients[i];
2835
+ mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
2836
+ vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
2837
+ const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
2838
+ const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
2839
+ bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
2840
+ const rowOffset = i * sDim;
2841
+ for (let j = 0; j < sDim; j++) {
2842
+ const wIdx = rowOffset + j;
2843
+ const wGrad = bGrad * input[j] + reg * matrix[wIdx];
2844
+ mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
2845
+ vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
2846
+ const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
2847
+ const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
2848
+ matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
2849
+ }
2686
2850
  }
2687
2851
  }
2688
2852
  }
package/dist/index.mjs CHANGED
@@ -788,7 +788,7 @@ function applyAffine(matrix, bias, vector, result, inDim, outDim = inDim) {
788
788
  }
789
789
 
790
790
  // src/wasm/wasm-binary.ts
791
- var wasmBase64 = "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";
791
+ var wasmBase64 = "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";
792
792
 
793
793
  // src/wasm/wasm-loader.ts
794
794
  var wasmInstance = null;
@@ -826,6 +826,22 @@ function ensureWasmMemory(requiredBytes) {
826
826
  return false;
827
827
  }
828
828
  }
829
+ var globalOffset = 65536;
830
+ function allocateWasmMemory(bytes) {
831
+ const ptr = globalOffset;
832
+ globalOffset += bytes;
833
+ if (globalOffset % 4 !== 0) {
834
+ globalOffset += 4 - globalOffset % 4;
835
+ }
836
+ ensureWasmMemory(globalOffset);
837
+ return ptr;
838
+ }
839
+ function getWasmAllocatorOffset() {
840
+ return globalOffset;
841
+ }
842
+ function setWasmAllocatorOffset(offset) {
843
+ globalOffset = offset;
844
+ }
829
845
  function writeFloat32ArrayToWasm(memory, data, byteOffset) {
830
846
  const f32 = new Float32Array(memory.buffer);
831
847
  const floatOffset = byteOffset / 4;
@@ -1665,6 +1681,7 @@ var MlpAdapter = class _MlpAdapter {
1665
1681
  layerDimsPtr = 0;
1666
1682
  activationsPtr = 0;
1667
1683
  bufferPtr = 0;
1684
+ bufBPtr = 0;
1668
1685
  constructor(layers) {
1669
1686
  if (layers.length === 0) {
1670
1687
  throw new Error("MlpAdapter requires at least one layer.");
@@ -1715,21 +1732,13 @@ var MlpAdapter = class _MlpAdapter {
1715
1732
  }
1716
1733
  this.inputDim = layerDims[0];
1717
1734
  this.outputDim = layerDims[layerDims.length - 1];
1718
- let offset = 65536;
1719
- this.inputPtr = offset;
1720
- offset += this.inputDim * 4;
1721
- this.outputPtr = offset;
1722
- offset += this.outputDim * 4;
1723
- this.layerDimsPtr = offset;
1724
- offset += (this.numLayers + 1) * 4;
1725
- this.activationsPtr = offset;
1726
- offset += this.numLayers * 4;
1727
- if (offset % 4 !== 0) offset += 4 - offset % 4;
1728
- this.weightsPtr = offset;
1729
- offset += totalWeights * 4;
1730
- this.bufferPtr = offset;
1731
- offset += maxDim * 8 + 8192;
1732
- ensureWasmMemory(offset);
1735
+ this.inputPtr = allocateWasmMemory(this.inputDim * 4);
1736
+ this.outputPtr = allocateWasmMemory(this.outputDim * 4);
1737
+ this.layerDimsPtr = allocateWasmMemory((this.numLayers + 1) * 4);
1738
+ this.activationsPtr = allocateWasmMemory(this.numLayers * 4);
1739
+ this.weightsPtr = allocateWasmMemory(totalWeights * 4);
1740
+ this.bufferPtr = allocateWasmMemory(maxDim * 4);
1741
+ this.bufBPtr = allocateWasmMemory(maxDim * 4);
1733
1742
  const memoryBuffer = memory.buffer;
1734
1743
  const f32 = new Float32Array(memoryBuffer);
1735
1744
  const i32 = new Int32Array(memoryBuffer);
@@ -1789,7 +1798,8 @@ var MlpAdapter = class _MlpAdapter {
1789
1798
  this.layerDimsPtr,
1790
1799
  this.activationsPtr,
1791
1800
  this.numLayers,
1792
- this.bufferPtr
1801
+ this.bufferPtr,
1802
+ this.bufBPtr
1793
1803
  );
1794
1804
  const result = new Float32Array(this.outputDim);
1795
1805
  const outF32 = new Float32Array(memory.buffer);
@@ -1843,6 +1853,19 @@ var WhiteningAdapter = class _WhiteningAdapter {
1843
1853
  count = 0;
1844
1854
  learningRate;
1845
1855
  numComponents;
1856
+ componentsPtr = 0;
1857
+ xResidualPtr = 0;
1858
+ isWasmReady = false;
1859
+ async init() {
1860
+ const instance = await initWasm();
1861
+ if (instance) {
1862
+ const componentsSize = this.numComponents * this.dim * 4;
1863
+ const xResidualSize = this.dim * 4;
1864
+ this.componentsPtr = allocateWasmMemory(componentsSize);
1865
+ this.xResidualPtr = allocateWasmMemory(xResidualSize);
1866
+ this.isWasmReady = true;
1867
+ }
1868
+ }
1846
1869
  /**
1847
1870
  * 新しい WhiteningAdapter を作成します。
1848
1871
  * @param dim ベクトルの次元数
@@ -1886,13 +1909,17 @@ var WhiteningAdapter = class _WhiteningAdapter {
1886
1909
  }
1887
1910
  const x_residual = new Float32Array(x);
1888
1911
  const instance = getWasmInstance();
1889
- const componentsSize = this.numComponents * this.dim * 4;
1890
- const xResidualSize = this.dim * 4;
1891
- const requiredBytes = componentsSize + xResidualSize;
1892
- if (instance && instance.exports.sangerUpdateWasm && ensureWasmMemory(requiredBytes)) {
1912
+ if (instance && instance.exports.sangerUpdateWasm) {
1913
+ if (!this.isWasmReady) {
1914
+ const componentsSize = this.numComponents * this.dim * 4;
1915
+ const xResidualSize = this.dim * 4;
1916
+ this.componentsPtr = allocateWasmMemory(componentsSize);
1917
+ this.xResidualPtr = allocateWasmMemory(xResidualSize);
1918
+ this.isWasmReady = true;
1919
+ }
1893
1920
  const memory = instance.exports.memory;
1894
- const componentsPtr = 0;
1895
- const xResidualPtr = componentsSize;
1921
+ const componentsPtr = this.componentsPtr;
1922
+ const xResidualPtr = this.xResidualPtr;
1896
1923
  const f32 = new Float32Array(memory.buffer);
1897
1924
  for (let k = 0; k < this.numComponents; k++) {
1898
1925
  const comp = this.components[k];
@@ -2007,19 +2034,22 @@ var ColbertAdapter = class {
2007
2034
  const { memory, colbertMaxSimWasm } = this.wasm.exports;
2008
2035
  const queryBytes = queryTokens.byteLength;
2009
2036
  const docBytes = documentTokens.byteLength;
2010
- const totalBytes = queryBytes + docBytes;
2011
- ensureWasmMemory(totalBytes);
2012
- const queryPtr = 0;
2013
- const docPtr = queryBytes;
2014
- writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2015
- writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
2016
- return colbertMaxSimWasm(
2017
- queryPtr,
2018
- docPtr,
2019
- numQueryTokens,
2020
- numDocTokens,
2021
- dim
2022
- );
2037
+ const initialOffset = getWasmAllocatorOffset();
2038
+ try {
2039
+ const queryPtr = allocateWasmMemory(queryBytes);
2040
+ const docPtr = allocateWasmMemory(docBytes);
2041
+ writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2042
+ writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
2043
+ return colbertMaxSimWasm(
2044
+ queryPtr,
2045
+ docPtr,
2046
+ numQueryTokens,
2047
+ numDocTokens,
2048
+ dim
2049
+ );
2050
+ } finally {
2051
+ setWasmAllocatorOffset(initialOffset);
2052
+ }
2023
2053
  }
2024
2054
  /**
2025
2055
  * クエリと複数のドキュメント間の MaxSim スコアを計算し、スコアの降順にソートして返します。
@@ -2043,27 +2073,30 @@ var ColbertAdapter = class {
2043
2073
  }
2044
2074
  const queryBytes = queryTokens.byteLength;
2045
2075
  const maxDocBytes = maxDocLen * Float32Array.BYTES_PER_ELEMENT;
2046
- const totalBytes = queryBytes + maxDocBytes;
2047
- ensureWasmMemory(totalBytes);
2048
- const queryPtr = 0;
2049
- const docPtr = queryBytes;
2050
- writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2051
- const results = documentTokensArray.map((doc, index) => {
2052
- const numDocTokens = doc.length / dim;
2053
- if (numDocTokens % 1 !== 0) {
2054
- throw new Error(`Invalid documentTokens length at index ${index}`);
2055
- }
2056
- writeFloat32ArrayToWasm(memory, doc, docPtr);
2057
- const score = colbertMaxSimWasm(
2058
- queryPtr,
2059
- docPtr,
2060
- numQueryTokens,
2061
- numDocTokens,
2062
- dim
2063
- );
2064
- return { index, score };
2065
- });
2066
- return results.sort((a, b) => b.score - a.score);
2076
+ const initialOffset = getWasmAllocatorOffset();
2077
+ try {
2078
+ const queryPtr = allocateWasmMemory(queryBytes);
2079
+ const docPtr = allocateWasmMemory(maxDocBytes);
2080
+ writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
2081
+ const results = documentTokensArray.map((doc, index) => {
2082
+ const numDocTokens = doc.length / dim;
2083
+ if (numDocTokens % 1 !== 0) {
2084
+ throw new Error(`Invalid documentTokens length at index ${index}`);
2085
+ }
2086
+ writeFloat32ArrayToWasm(memory, doc, docPtr);
2087
+ const score = colbertMaxSimWasm(
2088
+ queryPtr,
2089
+ docPtr,
2090
+ numQueryTokens,
2091
+ numDocTokens,
2092
+ dim
2093
+ );
2094
+ return { index, score };
2095
+ });
2096
+ return results.sort((a, b) => b.score - a.score);
2097
+ } finally {
2098
+ setWasmAllocatorOffset(initialOffset);
2099
+ }
2067
2100
  }
2068
2101
  };
2069
2102
 
@@ -2083,6 +2116,13 @@ var VectorDBAdapter = class {
2083
2116
  * @returns {string} `'[0.1, 0.2, 0.3]'` のような文字列表現
2084
2117
  */
2085
2118
  static toPgvector(vector) {
2119
+ if (vector instanceof Uint8Array) {
2120
+ let bitString = "";
2121
+ for (let i = 0; i < vector.length; i++) {
2122
+ bitString += vector[i].toString(2).padStart(8, "0");
2123
+ }
2124
+ return bitString;
2125
+ }
2086
2126
  return `[${Array.from(vector).join(", ")}]`;
2087
2127
  }
2088
2128
  /**
@@ -2146,18 +2186,37 @@ var withWarpVector = (config) => {
2146
2186
  */
2147
2187
  async searchByVector(args) {
2148
2188
  const context = Prisma.getExtensionContext(this);
2149
- const tableName = context.$name;
2189
+ const tableName = context.$name || "document";
2190
+ if (!/^[a-zA-Z0-9_]+$/.test(tableName)) {
2191
+ throw new Error(`Invalid table name: ${tableName}`);
2192
+ }
2193
+ if (!/^[a-zA-Z0-9_]+$/.test(vectorField)) {
2194
+ throw new Error(`Invalid vector field name: ${vectorField}`);
2195
+ }
2196
+ if (!["<->", "<#>", "<=>"].includes(distanceOp)) {
2197
+ throw new Error(`Invalid distance operator: ${distanceOp}`);
2198
+ }
2199
+ let whereClause = "";
2200
+ if (args.where) {
2201
+ const trimmedWhere = args.where.trim();
2202
+ if (/;|--|\/\*/.test(trimmedWhere)) {
2203
+ throw new Error("Potential SQL injection detected in where clause.");
2204
+ }
2205
+ whereClause = `WHERE ${trimmedWhere}`;
2206
+ }
2207
+ const limit = args.topK ?? 10;
2208
+ if (typeof limit !== "number" || isNaN(limit) || limit < 0) {
2209
+ throw new Error("Invalid topK value.");
2210
+ }
2150
2211
  const tunedVector = config.adapter.tune(args.vector);
2151
2212
  const pgVectorStr = VectorDBAdapter.toPgvector(tunedVector);
2152
- const limit = args.topK ?? 10;
2153
- const whereClause = args.where ? `WHERE ${args.where}` : "";
2154
2213
  const sql = `
2155
2214
  SELECT *
2156
2215
  FROM "${tableName}"
2157
2216
  ${whereClause}
2158
2217
  ORDER BY "${vectorField}" ${distanceOp} '${pgVectorStr}'::vector
2159
2218
  LIMIT ${limit};
2160
- `;
2219
+ `.trim();
2161
2220
  return client.$queryRawUnsafe(sql);
2162
2221
  }
2163
2222
  }
@@ -2529,9 +2588,11 @@ var WarpLlamaIndexEmbeddings = class {
2529
2588
  var QuantizationAdapter = class _QuantizationAdapter {
2530
2589
  type;
2531
2590
  dim;
2591
+ dynamic;
2532
2592
  constructor(config) {
2533
2593
  this.type = config.type;
2534
2594
  this.dim = config.dim;
2595
+ this.dynamic = config.dynamic ?? false;
2535
2596
  if (this.type === "binary" && this.dim % 8 !== 0) {
2536
2597
  throw new Error(
2537
2598
  `Binary quantization requires dimension to be a multiple of 8. Got ${this.dim}`
@@ -2541,14 +2602,33 @@ var QuantizationAdapter = class _QuantizationAdapter {
2541
2602
  tune(vector) {
2542
2603
  assertDimension(vector, this.dim, "QuantizationAdapter.tune");
2543
2604
  if (this.type === "int8") {
2544
- const result = new Int8Array(this.dim);
2545
- for (let i = 0; i < this.dim; i++) {
2546
- let val = Math.round(vector[i] * 127);
2547
- if (val > 127) val = 127;
2548
- if (val < -128) val = -128;
2549
- result[i] = val;
2605
+ if (this.dynamic) {
2606
+ let maxVal = 1e-8;
2607
+ for (let i = 0; i < this.dim; i++) {
2608
+ const abs = Math.abs(vector[i]);
2609
+ if (abs > maxVal) maxVal = abs;
2610
+ }
2611
+ const scale = 127 / maxVal;
2612
+ const result = new Int8Array(this.dim + 4);
2613
+ for (let i = 0; i < this.dim; i++) {
2614
+ let val = Math.round(vector[i] * scale);
2615
+ if (val > 127) val = 127;
2616
+ if (val < -128) val = -128;
2617
+ result[i] = val;
2618
+ }
2619
+ const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
2620
+ view.setFloat32(this.dim, maxVal, true);
2621
+ return result;
2622
+ } else {
2623
+ const result = new Int8Array(this.dim);
2624
+ for (let i = 0; i < this.dim; i++) {
2625
+ let val = Math.round(vector[i] * 127);
2626
+ if (val > 127) val = 127;
2627
+ if (val < -128) val = -128;
2628
+ result[i] = val;
2629
+ }
2630
+ return result;
2550
2631
  }
2551
- return result;
2552
2632
  } else if (this.type === "binary") {
2553
2633
  const bytesLength = this.dim / 8;
2554
2634
  const result = new Uint8Array(bytesLength);
@@ -2581,17 +2661,45 @@ var QuantizationAdapter = class _QuantizationAdapter {
2581
2661
  }
2582
2662
  /**
2583
2663
  * Int8量子化された2つのベクトル間のドット積(内積)を計算します。
2664
+ * 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
2584
2665
  */
2585
2666
  static int8DotProduct(a, b) {
2586
2667
  if (a.length !== b.length) throw new Error("Length mismatch");
2587
- let dot = 0;
2588
- for (let i = 0; i < a.length; i++) {
2589
- dot += a[i] * b[i];
2668
+ const hasScaleBytes = a.length > 4;
2669
+ let isDynamic = false;
2670
+ let maxA = 1;
2671
+ let maxB = 1;
2672
+ if (hasScaleBytes) {
2673
+ const dim = a.length - 4;
2674
+ try {
2675
+ const viewA = new DataView(a.buffer, a.byteOffset, a.byteLength);
2676
+ const viewB = new DataView(b.buffer, b.byteOffset, b.byteLength);
2677
+ maxA = viewA.getFloat32(dim, true);
2678
+ maxB = viewB.getFloat32(dim, true);
2679
+ if (!isNaN(maxA) && !isNaN(maxB) && maxA > 0 && maxA < 1e3 && maxB > 0 && maxB < 1e3) {
2680
+ isDynamic = true;
2681
+ }
2682
+ } catch (e) {
2683
+ isDynamic = false;
2684
+ }
2685
+ }
2686
+ if (isDynamic) {
2687
+ const dim = a.length - 4;
2688
+ let dot = 0;
2689
+ for (let i = 0; i < dim; i++) {
2690
+ dot += a[i] * b[i];
2691
+ }
2692
+ return dot * (maxA / 127) * (maxB / 127);
2693
+ } else {
2694
+ let dot = 0;
2695
+ for (let i = 0; i < a.length; i++) {
2696
+ dot += a[i] * b[i];
2697
+ }
2698
+ return dot;
2590
2699
  }
2591
- return dot;
2592
2700
  }
2593
2701
  exportState() {
2594
- return JSON.stringify({ type: this.type, dim: this.dim });
2702
+ return JSON.stringify({ type: this.type, dim: this.dim, dynamic: this.dynamic });
2595
2703
  }
2596
2704
  static importState(stateJson) {
2597
2705
  const config = JSON.parse(stateJson);
@@ -2626,22 +2734,78 @@ var AbstractAdamTrainer = class {
2626
2734
  const beta1 = 0.9;
2627
2735
  const beta2 = 0.999;
2628
2736
  const epsilon = 1e-8;
2629
- for (let i = 0; i < tDim; i++) {
2630
- const bGrad = outputGradients[i];
2631
- mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
2632
- vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
2633
- const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
2634
- const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
2635
- bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
2636
- const rowOffset = i * sDim;
2637
- for (let j = 0; j < sDim; j++) {
2638
- const wIdx = rowOffset + j;
2639
- const wGrad = bGrad * input[j] + reg * matrix[wIdx];
2640
- mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
2641
- vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
2642
- const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
2643
- const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
2644
- matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
2737
+ const instance = getWasmInstance();
2738
+ if (instance && instance.exports.adamUpdateWasm) {
2739
+ const memory = instance.exports.memory;
2740
+ const matrixBytes = matrix.byteLength;
2741
+ const biasBytes = bias.byteLength;
2742
+ const inputBytes = sDim * 4;
2743
+ const gradBytes = tDim * 4;
2744
+ const initialOffset = getWasmAllocatorOffset();
2745
+ try {
2746
+ const matrixPtr = allocateWasmMemory(matrixBytes);
2747
+ const biasPtr = allocateWasmMemory(biasBytes);
2748
+ const mMatrixPtr = allocateWasmMemory(matrixBytes);
2749
+ const vMatrixPtr = allocateWasmMemory(matrixBytes);
2750
+ const mBiasPtr = allocateWasmMemory(biasBytes);
2751
+ const vBiasPtr = allocateWasmMemory(biasBytes);
2752
+ const inputPtr = allocateWasmMemory(inputBytes);
2753
+ const gradPtr = allocateWasmMemory(gradBytes);
2754
+ writeFloat32ArrayToWasm(memory, matrix, matrixPtr);
2755
+ writeFloat32ArrayToWasm(memory, bias, biasPtr);
2756
+ writeFloat32ArrayToWasm(memory, mMatrix, mMatrixPtr);
2757
+ writeFloat32ArrayToWasm(memory, vMatrix, vMatrixPtr);
2758
+ writeFloat32ArrayToWasm(memory, mBias, mBiasPtr);
2759
+ writeFloat32ArrayToWasm(memory, vBias, vBiasPtr);
2760
+ writeFloat32ArrayToWasm(memory, input, inputPtr);
2761
+ writeFloat32ArrayToWasm(memory, outputGradients, gradPtr);
2762
+ const adamUpdateWasm = instance.exports.adamUpdateWasm;
2763
+ adamUpdateWasm(
2764
+ matrixPtr,
2765
+ biasPtr,
2766
+ mMatrixPtr,
2767
+ vMatrixPtr,
2768
+ mBiasPtr,
2769
+ vBiasPtr,
2770
+ inputPtr,
2771
+ gradPtr,
2772
+ lr,
2773
+ reg,
2774
+ beta1,
2775
+ beta2,
2776
+ epsilon,
2777
+ t,
2778
+ sDim,
2779
+ tDim
2780
+ );
2781
+ const f32 = new Float32Array(memory.buffer);
2782
+ matrix.set(f32.subarray(matrixPtr / 4, matrixPtr / 4 + matrix.length));
2783
+ bias.set(f32.subarray(biasPtr / 4, biasPtr / 4 + bias.length));
2784
+ mMatrix.set(f32.subarray(mMatrixPtr / 4, mMatrixPtr / 4 + mMatrix.length));
2785
+ vMatrix.set(f32.subarray(vMatrixPtr / 4, vMatrixPtr / 4 + vMatrix.length));
2786
+ mBias.set(f32.subarray(mBiasPtr / 4, mBiasPtr / 4 + mBias.length));
2787
+ vBias.set(f32.subarray(vBiasPtr / 4, vBiasPtr / 4 + vBias.length));
2788
+ } finally {
2789
+ setWasmAllocatorOffset(initialOffset);
2790
+ }
2791
+ } else {
2792
+ for (let i = 0; i < tDim; i++) {
2793
+ const bGrad = outputGradients[i];
2794
+ mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
2795
+ vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
2796
+ const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
2797
+ const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
2798
+ bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
2799
+ const rowOffset = i * sDim;
2800
+ for (let j = 0; j < sDim; j++) {
2801
+ const wIdx = rowOffset + j;
2802
+ const wGrad = bGrad * input[j] + reg * matrix[wIdx];
2803
+ mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
2804
+ vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
2805
+ const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
2806
+ const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
2807
+ matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
2808
+ }
2645
2809
  }
2646
2810
  }
2647
2811
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "warpvector",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "A lightweight, zero-dependency TypeScript middleware for dynamic vector space transformation (affine transformation).",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",