From 34c156fc6000218590b2ebca94683d0c460c560d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 00:56:09 +0000 Subject: [PATCH 1/3] Initial plan From 0a79ac30a66a39252ab28fde0caa3ffded804d04 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 00:59:14 +0000 Subject: [PATCH 2/3] Optimize quantizeToUint8 and quantizeToUint16 with single-pass min/max Co-authored-by: sroussey <127349+sroussey@users.noreply.github.com> --- packages/ai/src/task/VectorQuantizeTask.ts | 30 +++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/ai/src/task/VectorQuantizeTask.ts b/packages/ai/src/task/VectorQuantizeTask.ts index 4c8ea05c..16139d0a 100644 --- a/packages/ai/src/task/VectorQuantizeTask.ts +++ b/packages/ai/src/task/VectorQuantizeTask.ts @@ -187,6 +187,26 @@ export class VectorQuantizeTask extends Task< } } + /** + * Find min and max values in a single pass for better performance + */ + private findMinMax(values: number[]): { min: number; max: number } { + if (values.length === 0) { + return { min: 0, max: 0 }; + } + + let min = values[0]; + let max = values[0]; + + for (let i = 1; i < values.length; i++) { + const val = values[i]; + if (val < min) min = val; + if (val > max) max = val; + } + + return { min, max }; + } + private quantizeToInt8(values: number[]): Int8Array { // Assume values are in [-1, 1] range after normalization // Scale to [-127, 127] to avoid overflow at -128 @@ -194,9 +214,8 @@ export class VectorQuantizeTask extends Task< } private quantizeToUint8(values: number[]): Uint8Array { - // Find min/max for scaling - const min = Math.min(...values); - const max = Math.max(...values); + // Find min/max for scaling in a single pass + const { min, max } = this.findMinMax(values); const range = max - min || 1; // Scale to [0, 255] @@ -210,9 +229,8 @@ export class VectorQuantizeTask extends Task< } private quantizeToUint16(values: number[]): Uint16Array { - // Find min/max for scaling - const min = Math.min(...values); - const max = Math.max(...values); + // Find min/max for scaling in a single pass + const { min, max } = this.findMinMax(values); const range = max - min || 1; // Scale to [0, 65535] From 406a385059693d484225c51eb617353f5c9920cd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 01:00:06 +0000 Subject: [PATCH 3/3] Fix edge case: return non-zero range for empty arrays in findMinMax Co-authored-by: sroussey <127349+sroussey@users.noreply.github.com> --- packages/ai/src/task/VectorQuantizeTask.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ai/src/task/VectorQuantizeTask.ts b/packages/ai/src/task/VectorQuantizeTask.ts index 16139d0a..0277468a 100644 --- a/packages/ai/src/task/VectorQuantizeTask.ts +++ b/packages/ai/src/task/VectorQuantizeTask.ts @@ -192,7 +192,7 @@ export class VectorQuantizeTask extends Task< */ private findMinMax(values: number[]): { min: number; max: number } { if (values.length === 0) { - return { min: 0, max: 0 }; + return { min: 0, max: 1 }; } let min = values[0];