embeddings.js•1.63 kB
/**
* Embedding Utilities
* Shared utilities for working with embeddings
*/
/**
* Calculate cosine similarity between two vectors
* @param {Array<number>} vecA - First vector
* @param {Array<number>} vecB - Second vector
* @returns {number} Similarity score (0-1)
*/
export function cosineSimilarity(vecA, vecB) {
if (!vecA || !vecB || vecA.length !== vecB.length) {
throw new Error('Invalid vectors for similarity calculation');
}
let dotProduct = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < vecA.length; i++) {
dotProduct += vecA[i] * vecB[i];
normA += vecA[i] * vecA[i];
normB += vecB[i] * vecB[i];
}
normA = Math.sqrt(normA);
normB = Math.sqrt(normB);
if (normA === 0 || normB === 0) {
return 0;
}
return dotProduct / (normA * normB);
}
/**
* Calculate euclidean distance between two vectors
* @param {Array<number>} vecA - First vector
* @param {Array<number>} vecB - Second vector
* @returns {number} Distance
*/
export function euclideanDistance(vecA, vecB) {
if (!vecA || !vecB || vecA.length !== vecB.length) {
throw new Error('Invalid vectors for distance calculation');
}
let sum = 0;
for (let i = 0; i < vecA.length; i++) {
const diff = vecA[i] - vecB[i];
sum += diff * diff;
}
return Math.sqrt(sum);
}
/**
* Normalize a vector to unit length
* @param {Array<number>} vec - Vector to normalize
* @returns {Array<number>} Normalized vector
*/
export function normalize(vec) {
const norm = Math.sqrt(vec.reduce((sum, val) => sum + val * val, 0));
if (norm === 0) return vec;
return vec.map(val => val / norm);
}