export function float32ArrayToBuffer(vector: number[]): Buffer { const array = Float32Array.from(vector) return Buffer.from(array.buffer, array.byteOffset, array.byteLength) } export function bufferToFloat32Array(buffer: Buffer): number[] { const view = new Float32Array(buffer.buffer, buffer.byteOffset, Math.floor(buffer.byteLength / Float32Array.BYTES_PER_ELEMENT)) return Array.from(view) } export function normalizeVector(vector: number[]): number[] { const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0)) if (!Number.isFinite(norm) || norm === 0) return vector.map(() => 0) return vector.map((value) => value / norm) } export function cosineSimilarity(a: number[], b: number[]): number { const length = Math.min(a.length, b.length) if (length === 0) return 0 let dot = 0 let normA = 0 let normB = 0 for (let index = 0; index < length; index += 1) { const av = a[index] ?? 0 const bv = b[index] ?? 0 dot += av * bv normA += av * av normB += bv * bv } if (normA === 0 || normB === 0) return 0 return dot / (Math.sqrt(normA) * Math.sqrt(normB)) }