mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-31 19:51:36 +08:00
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
/**
|
|
* Computes the cosine similarity between two vectors
|
|
*/
|
|
export function cosineSimilarity(a: Float32Array, b: Float32Array): number {
|
|
if (a.length !== b.length) {
|
|
throw new Error(`Vector dimensions don't match: ${a.length} vs ${b.length}`);
|
|
}
|
|
|
|
let dotProduct = 0;
|
|
let aMagnitude = 0;
|
|
let bMagnitude = 0;
|
|
|
|
for (let i = 0; i < a.length; i++) {
|
|
dotProduct += a[i] * b[i];
|
|
aMagnitude += a[i] * a[i];
|
|
bMagnitude += b[i] * b[i];
|
|
}
|
|
|
|
aMagnitude = Math.sqrt(aMagnitude);
|
|
bMagnitude = Math.sqrt(bMagnitude);
|
|
|
|
if (aMagnitude === 0 || bMagnitude === 0) {
|
|
return 0;
|
|
}
|
|
|
|
return dotProduct / (aMagnitude * bMagnitude);
|
|
}
|
|
|
|
/**
|
|
* Converts embedding Float32Array to Buffer for storage in SQLite
|
|
*/
|
|
export function embeddingToBuffer(embedding: Float32Array): Buffer {
|
|
return Buffer.from(embedding.buffer);
|
|
}
|
|
|
|
/**
|
|
* Converts Buffer from SQLite back to Float32Array
|
|
*/
|
|
export function bufferToEmbedding(buffer: Buffer, dimension: number): Float32Array {
|
|
return new Float32Array(buffer.buffer, buffer.byteOffset, dimension);
|
|
}
|