UNPKG

@leolee9086/hnsw

Version:

JavaScript HNSW (Hierarchical Navigable Small World) 向量索引库,支持动态操作和泛型搜索

1 lines 73.2 kB
{"version":3,"sources":["../src/binary-heap.ts","../src/midi-heap.ts","../src/generic.ts","../src/vector.ts","../src/index.ts"],"names":["M","visited","createHNSWIndex"],"mappings":"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","file":"index.mjs","sourcesContent":["\nexport class BinaryHeap {\n private data: number[];\n private size: number;\n\n constructor(data: number[] = []) {\n this.data = data.slice(); // 创建副本避免外部修改\n this.size = this.data.length;\n\n if (this.size > 0) {\n this.heapify();\n }\n }\n\n get length(): number {\n return this.size;\n }\n\n /**\n * 插入元素 - 优化版本\n */\n push(item: number): void {\n const data = this.data;\n const pos = this.size++;\n \n data[pos] = item;\n this.upHeap(pos, data);\n }\n\n /**\n * 批量插入 - 保持V1简洁性的高效实现\n */\n pushBulk(items: number[]): void {\n if (items.length === 0) return;\n\n // 预分配空间避免多次扩容\n const currentSize = this.size;\n const newSize = currentSize + items.length;\n \n // 确保数组有足够容量\n if (newSize > this.data.length) {\n const newCapacity = Math.max(newSize, this.data.length * 2);\n const newData = new Array(newCapacity);\n for (let i = 0; i < currentSize; i++) {\n newData[i] = this.data[i]!;\n }\n this.data = newData;\n }\n\n // 批量策略:根据数据量选择最优方法\n if (items.length < currentSize / 8) {\n // 小批量:逐个插入(保持V1的单操作优势)\n for (const item of items) {\n this.push(item);\n }\n } else {\n // 大批量:直接追加 + heapify(类似构造函数的策略)\n for (let i = 0; i < items.length; i++) {\n this.data[currentSize + i] = items[i]!;\n }\n this.size = newSize;\n this.heapify();\n }\n }\n\n /**\n * 提取最小值 - 优化版本\n */\n pop(): number | undefined {\n const size = this.size;\n if (size === 0) return undefined;\n\n const data = this.data;\n const top = data[0]!;\n \n const newSize = size - 1;\n this.size = newSize;\n \n if (newSize > 0) {\n data[0] = data[newSize]!;\n this.downHeap(0, data, newSize);\n }\n\n return top;\n }\n\n /**\n * 查看最小值\n */\n peek(): number | undefined {\n return this.data[0];\n }\n\n /**\n * 批量创建堆 - Floyd 算法优化版本\n */\n private heapify(): void {\n const data = this.data;\n const size = this.size;\n \n // 从最后一个非叶子节点开始\n for (let i = (size >>> 1) - 1; i >= 0; i--) {\n this.downHeap(i, data, size);\n }\n }\n\n /**\n * 上浮操作 - 激进优化版本\n */\n private upHeap(pos: number, data: number[]): void {\n const item = data[pos]!;\n \n // 展开循环的前几次迭代,减少分支开销\n if (pos > 0) {\n const parent = (pos - 1) >>> 1;\n const parentValue = data[parent]!;\n if (item < parentValue) {\n data[pos] = parentValue;\n pos = parent;\n \n // 继续向上\n while (pos > 0) {\n const nextParent = (pos - 1) >>> 1;\n const nextParentValue = data[nextParent]!;\n if (item >= nextParentValue) break;\n \n data[pos] = nextParentValue;\n pos = nextParent;\n }\n }\n }\n \n data[pos] = item;\n }\n\n /**\n * 下沉操作 - 超级优化版本\n */\n private downHeap(pos: number, data: number[], size: number): void {\n const halfLength = size >>> 1;\n const item = data[pos]!;\n \n while (pos < halfLength) {\n let bestChild = (pos << 1) + 1; // 左子节点\n let bestValue = data[bestChild]!;\n const rightChild = bestChild + 1;\n \n // 优化:先检查右子节点是否存在,再比较值\n if (rightChild < size) {\n const rightValue = data[rightChild]!;\n if (rightValue < bestValue) {\n bestChild = rightChild;\n bestValue = rightValue;\n }\n }\n \n // 如果当前项已经小于等于最佳子节点,结束\n if (item <= bestValue) break;\n \n data[pos] = bestValue;\n pos = bestChild;\n }\n \n data[pos] = item;\n }\n\n /**\n * 检查堆的有效性(调试用)\n */\n isValid(): boolean {\n const data = this.data;\n const size = this.size;\n \n for (let i = 0; i < (size >>> 1); i++) {\n const left = (i << 1) + 1;\n const right = left + 1;\n \n if (left < size && data[i]! > data[left]!) return false;\n if (right < size && data[i]! > data[right]!) return false;\n }\n \n return true;\n }\n\n /**\n * 转换为数组(调试用)\n */\n toArray(): number[] {\n const result: number[] = [];\n const tempHeap = new BinaryHeap(this.data.slice(0, this.size));\n \n while (tempHeap.length > 0) {\n result.push(tempHeap.pop()!);\n }\n \n return result;\n }\n\n /**\n * 清空堆\n */\n clear(): void {\n this.size = 0;\n }\n}\n\n/**\n * 泛型版本 - 支持自定义比较函数,但性能稍低\n */\nexport class BinaryHeapGeneric<T> {\n private data: T[];\n private size: number;\n private compare: (a: T, b: T) => number;\n\n constructor(data: T[] = [], compare: (a: T, b: T) => number = defaultCompare) {\n this.data = data.slice();\n this.size = this.data.length;\n this.compare = compare;\n\n if (this.size > 0) {\n this.heapify();\n }\n }\n\n get length(): number {\n return this.size;\n }\n\n push(item: T): void {\n const data = this.data;\n const pos = this.size++;\n \n data[pos] = item;\n this.upHeap(pos, data);\n }\n\n /**\n * 批量插入 - 泛型版本的高效实现\n */\n pushBulk(items: T[]): void {\n if (items.length === 0) return;\n\n // 预分配空间避免多次扩容\n const currentSize = this.size;\n const newSize = currentSize + items.length;\n \n // 确保数组有足够容量\n if (newSize > this.data.length) {\n const newCapacity = Math.max(newSize, this.data.length * 2);\n const newData = new Array<T>(newCapacity);\n for (let i = 0; i < currentSize; i++) {\n newData[i] = this.data[i]!;\n }\n this.data = newData;\n }\n\n // 批量策略:根据数据量选择最优方法\n if (items.length < currentSize / 8) {\n // 小批量:逐个插入(利用单操作优势)\n for (const item of items) {\n this.push(item);\n }\n } else {\n // 大批量:直接追加 + heapify\n for (let i = 0; i < items.length; i++) {\n this.data[currentSize + i] = items[i]!;\n }\n this.size = newSize;\n this.heapify();\n }\n }\n\n pop(): T | undefined {\n const size = this.size;\n if (size === 0) return undefined;\n\n const data = this.data;\n const top = data[0]!;\n \n const newSize = size - 1;\n this.size = newSize;\n \n if (newSize > 0) {\n data[0] = data[newSize]!;\n this.downHeap(0, data, newSize);\n }\n\n return top;\n }\n\n peek(): T | undefined {\n return this.data[0];\n }\n\n private heapify(): void {\n const data = this.data;\n const size = this.size;\n \n for (let i = (size >>> 1) - 1; i >= 0; i--) {\n this.downHeap(i, data, size);\n }\n }\n\n private upHeap(pos: number, data: T[]): void {\n const item = data[pos]!;\n const compare = this.compare;\n \n while (pos > 0) {\n const parent = (pos - 1) >>> 1;\n const parentValue = data[parent]!;\n if (compare(item, parentValue) >= 0) break;\n \n data[pos] = parentValue;\n pos = parent;\n }\n \n data[pos] = item;\n }\n\n private downHeap(pos: number, data: T[], size: number): void {\n const halfLength = size >>> 1;\n const item = data[pos]!;\n const compare = this.compare;\n \n while (pos < halfLength) {\n let bestChild = (pos << 1) + 1;\n let bestValue = data[bestChild]!;\n const rightChild = bestChild + 1;\n \n if (rightChild < size && compare(data[rightChild]!, bestValue) < 0) {\n bestChild = rightChild;\n bestValue = data[rightChild]!;\n }\n \n if (compare(item, bestValue) <= 0) break;\n \n data[pos] = bestValue;\n pos = bestChild;\n }\n \n data[pos] = item;\n }\n}\n\nfunction defaultCompare<T>(a: T, b: T): number {\n return a < b ? -1 : a > b ? 1 : 0;\n} ","/**\n * MidiHeap - 中等容量优化的固定大小二叉堆\n * \n * 基于MicroHeap的设计,但容量可配置。\n * 专为HNSW算法中的中等大小集合(例如64-1024个元素)优化,\n * 结合了数组的缓存友好性与预分配带来的高性能。\n */\nexport class MidiHeapGeneric<T> {\n private data: T[];\n private capacity: number;\n private size = 0;\n private compare: (a: T, b: T) => number;\n\n constructor(capacity: number, compare: (a: T, b: T) => number, initialData?: T[]) {\n if (capacity <= 0) {\n throw new Error('Heap capacity must be greater than 0');\n }\n this.capacity = capacity;\n this.data = new Array(capacity);\n this.compare = compare;\n\n if (initialData && initialData.length > 0) {\n const initialSize = Math.min(initialData.length, this.capacity);\n this.size = initialSize;\n for (let i = 0; i < initialSize; i++) {\n this.data[i] = initialData[i]!;\n }\n this.heapify();\n }\n }\n \n get length(): number {\n return this.size;\n }\n\n isFull(): boolean {\n return this.size >= this.capacity;\n }\n\n /**\n * 向堆中添加一个元素。\n * @注意 如果堆已满,此操作会静默失败。请使用 isFull() 检查。\n */\n push(item: T): void {\n if (this.isFull()) {\n return;\n }\n\n const data = this.data;\n const compare = this.compare;\n let pos = this.size++;\n \n while (pos > 0) {\n const parent = (pos - 1) >>> 1;\n if (compare(item, data[parent]!) >= 0) break;\n \n data[pos] = data[parent]!;\n pos = parent;\n }\n \n data[pos] = item;\n }\n\n pop(): T | undefined {\n if (this.size === 0) return undefined;\n\n const data = this.data;\n const top = data[0]!;\n const newSize = --this.size;\n \n if (newSize > 0) {\n data[0] = data[newSize]!;\n this.downHeap(0, newSize);\n }\n\n return top;\n }\n\n /**\n * 替换堆顶元素,比 pop() + push() 更高效。\n * @returns 返回被替换掉的原堆顶元素。\n */\n replace(item: T): T {\n const top = this.data[0]!;\n this.data[0] = item;\n this.downHeap(0, this.size);\n return top;\n }\n\n private downHeap(pos: number, size: number): void {\n const data = this.data;\n const compare = this.compare;\n const item = data[pos]!;\n \n while (true) {\n const leftChild = (pos << 1) + 1;\n if (leftChild >= size) break;\n \n let bestChild = leftChild;\n \n const rightChild = leftChild + 1;\n if (rightChild < size && compare(data[rightChild]!, data[leftChild]!) < 0) {\n bestChild = rightChild;\n }\n \n if (compare(item, data[bestChild]!) <= 0) break;\n \n data[pos] = data[bestChild]!;\n pos = bestChild;\n }\n \n data[pos] = item;\n }\n\n peek(): T | undefined {\n return this.size > 0 ? this.data[0] : undefined;\n }\n\n private heapify(): void {\n const size = this.size;\n for (let i = (size >>> 1) - 1; i >= 0; i--) {\n this.downHeap(i, size);\n }\n }\n\n clear(): void {\n this.size = 0;\n }\n \n toArray(): T[] {\n return this.data.slice(0, this.size);\n }\n\n toSortedArray(): T[] {\n // 哥哥说得对,这里直接复制数组然后排序,比新建一个堆实例效率高得多!\n // 1. 复制数组的有效部分\n const sorted = this.data.slice(0, this.size);\n \n // 2. 使用与堆相同的比较逻辑进行排序。\n sorted.sort(this.compare);\n\n // 3. 不再画蛇添足地反转,将排序结果直接返回\n return sorted;\n }\n} ","import { BinaryHeapGeneric } from './binary-heap';\nimport { MidiHeapGeneric } from './midi-heap';\n\nexport interface HNSWConfig<T> {\n M: number;\n efConstruction: number;\n distanceFunction: (a: T, b: T) => number;\n distanceToQuery?: (query: T, target: T) => number; // 可选,如果未提供则使用distanceFunction\n}\n\ninterface Neighbor {\n idx: number;\n distance: number;\n}\n\nexport interface HNSWIndex<T> {\n insertNode: (vector: T) => void;\n search: (queryVector: T, k: number, efSearch?: number) => Neighbor[];\n deleteNode: (nodeIdx: number) => boolean;\n getStats: () => { \n nodeCount: number; \n activeNodeCount: number;\n deletedNodeCount: number;\n entryPoint: { idx: number; level: number } \n };\n}\n\nexport function createHNSWIndex<T>(config: HNSWConfig<T>): HNSWIndex<T> {\n const { M, efConstruction, distanceFunction, distanceToQuery } = config;\n\n // --- 数据存储 ---\n const vectors: T[] = [];\n const neighbors: number[][][] = []; // [nodeId][level] -> [neighborId, ...]\n const entryPoint = { idx: -1, level: -1 };\n\n // --- 删除功能相关数据结构 ---\n const deletedNodes: Set<number> = new Set();\n const nodeToLevels: Map<number, number> = new Map(); // 记录每个节点的最高层级\n\n // --- 性能优化组件 ---\n // 在构造时分配,避免重复创建\n let visited: Uint8Array | null = null;\n const maxNodes = 10000; // 预设最大容量\n visited = new Uint8Array(maxNodes);\n\n // --- 核心算法 ---\n\n /**\n * 检查节点是否有效(未被删除)\n */\n function isValidNode(idx: number): boolean {\n return idx >= 0 && idx < vectors.length && !deletedNodes.has(idx);\n }\n\n /**\n * 计算两个已存在节点之间的距离\n */\n function distance(idxA: number, idxB: number): number {\n // 检查节点有效性\n if (!isValidNode(idxA) || !isValidNode(idxB)) {\n return Infinity; // 无效节点返回无穷大距离\n }\n\n return distanceFunction(vectors[idxA]!, vectors[idxB]!);\n }\n\n /**\n * 计算查询向量到目标节点的距离\n */\n function distanceToTarget(queryVector: T, targetIdx: number): number {\n // 检查目标节点有效性\n if (!isValidNode(targetIdx)) {\n return Infinity; // 无效节点返回无穷大距离\n }\n\n const targetVector = vectors[targetIdx]!;\n \n // 如果提供了专门的distanceToQuery函数,使用它\n if (distanceToQuery) {\n return distanceToQuery(queryVector, targetVector);\n }\n \n // 否则使用通用的distanceFunction\n return distanceFunction(queryVector, targetVector);\n }\n\n /**\n * 在指定层级上搜索最近的 ef 个邻居 - 使用优化的堆算法\n */\n function searchLayerWithQuery(\n queryVector: T,\n startNodeIdx: number,\n level: number,\n ef: number\n ): Neighbor[] {\n if (!visited) throw new Error(\"Visited set not initialized\");\n visited.fill(0);\n\n // 检查起始节点有效性\n if (!isValidNode(startNodeIdx)) {\n return []; // 如果起始节点无效,返回空结果\n }\n\n // 使用动态二叉堆处理大小不定的候选集\n const candidates = new BinaryHeapGeneric<Neighbor>([], (a, b) => a.distance - b.distance);\n // 使用固定容量的MidiHeap处理Top-K结果集,性能更高\n const results = new MidiHeapGeneric<Neighbor>(ef, (a, b) => b.distance - a.distance);\n\n const startNodeDist = distanceToTarget(queryVector, startNodeIdx);\n visited[startNodeIdx] = 1;\n candidates.push({ idx: startNodeIdx, distance: startNodeDist });\n results.push({ idx: startNodeIdx, distance: startNodeDist });\n\n while (candidates.length > 0) {\n const bestCandidate = candidates.peek()!;\n const farthestResult = results.peek();\n\n // MidiHeap优化 - 剪枝逻辑更清晰\n if (farthestResult && bestCandidate.distance > farthestResult.distance && results.isFull()) {\n break; \n }\n const cand = candidates.pop()!;\n\n const nodeNeighbors = neighbors[cand.idx]?.[level] || [];\n for (const neighborIdx of nodeNeighbors) {\n // 只处理有效的邻居节点\n if (visited[neighborIdx] === 0 && isValidNode(neighborIdx)) {\n visited[neighborIdx] = 1;\n const dist = distanceToTarget(queryVector, neighborIdx);\n const currentFarthest = results.peek();\n \n // MidiHeap优化 - 使用isFull和replace API,效率更高\n if (!currentFarthest || !results.isFull() || dist < currentFarthest.distance) {\n candidates.push({ idx: neighborIdx, distance: dist });\n\n if (!results.isFull()) {\n results.push({ idx: neighborIdx, distance: dist });\n } else {\n results.replace({ idx: neighborIdx, distance: dist });\n }\n }\n }\n }\n }\n \n // MidiHeap优化 - toSortedArray 直接返回有序数组\n return results.toSortedArray().reverse();\n }\n\n /**\n * 通过启发式方法选择邻居\n * 这是保证图连接多样性、避免陷入局部最优的关键\n */\n function getNeighborsByHeuristic(candidates: Neighbor[], M: number): Neighbor[] {\n if (candidates.length <= M) {\n return candidates;\n }\n\n const result: Neighbor[] = [];\n const visited = new Set<number>();\n\n for (const cand of candidates) {\n if (result.length >= M) break;\n if (visited.has(cand.idx)) continue;\n \n let good = true;\n for (const res of result) {\n if (distance(cand.idx, res.idx) < cand.distance) {\n good = false;\n break;\n }\n }\n\n if (good) {\n result.push(cand);\n visited.add(cand.idx);\n }\n }\n return result;\n }\n\n /**\n * 从邻居列表中移除指定节点\n */\n function removeNodeFromNeighbors(nodeIdx: number) {\n // 遍历所有节点,从它们的邻居列表中移除被删除的节点\n for (let i = 0; i < neighbors.length; i++) {\n if (!isValidNode(i)) continue; // 跳过已删除的节点\n \n const nodeNeighbors = neighbors[i];\n if (!nodeNeighbors) continue;\n \n for (let level = 0; level < nodeNeighbors.length; level++) {\n const levelNeighbors = nodeNeighbors[level];\n if (!levelNeighbors) continue;\n \n // 过滤掉被删除的节点\n nodeNeighbors[level] = levelNeighbors.filter(neighborIdx => neighborIdx !== nodeIdx);\n }\n }\n }\n\n /**\n * 重新选择入口点\n */\n function reselectEntryPoint() {\n let newEntryPoint = { idx: -1, level: -1 };\n \n // 找到层级最高的有效节点作为新入口点\n for (let i = 0; i < vectors.length; i++) {\n if (!isValidNode(i)) continue;\n \n const nodeLevel = nodeToLevels.get(i) || 0;\n if (nodeLevel > newEntryPoint.level) {\n newEntryPoint = { idx: i, level: nodeLevel };\n }\n }\n \n // 如果没有找到有效节点,重置入口点\n if (newEntryPoint.idx === -1) {\n entryPoint.idx = -1;\n entryPoint.level = -1;\n } else {\n entryPoint.idx = newEntryPoint.idx;\n entryPoint.level = newEntryPoint.level;\n }\n }\n\n /**\n * 连接新节点和它的邻居\n */\n function connectNeighbors(nodeIdx: number, level: number, nearestNeighbors: Neighbor[]) {\n // 根据层级使用正确的最大连接数:底层M*2,其他层M\n const maxConnections = level === 0 ? M * 2 : M;\n \n // 应用启发式算法选择最多样化的邻居\n const selectedNeighbors = getNeighborsByHeuristic(nearestNeighbors, maxConnections);\n neighbors[nodeIdx]![level] = selectedNeighbors.map(n => n.idx);\n\n for (const neighbor of selectedNeighbors) {\n \n if (!Array.isArray(neighbors[neighbor.idx])) {\n neighbors[neighbor.idx] = [];\n }\n if (!Array.isArray(neighbors[neighbor.idx]![level])) {\n neighbors[neighbor.idx]![level] = [];\n }\n\n neighbors[neighbor.idx]![level]!.push(nodeIdx);\n\n // MidiHeap优化 + BUG修复 - 使用层级对应的最大连接数进行修剪\n if (neighbors[neighbor.idx]![level]!.length > maxConnections) {\n const connections = neighbors[neighbor.idx]![level]!;\n \n // 使用MidiHeap选出Top-maxConnections最近的邻居\n const heap = new MidiHeapGeneric<Neighbor>(maxConnections, (a, b) => b.distance - a.distance);\n\n for(const connIdx of connections) {\n const dist = distance(neighbor.idx, connIdx);\n const connNode = { idx: connIdx, distance: dist };\n\n if (!heap.isFull()) {\n heap.push(connNode);\n } else if (dist < heap.peek()!.distance) {\n heap.replace(connNode);\n }\n }\n neighbors[neighbor.idx]![level] = heap.toArray().map(c => c.idx);\n }\n }\n }\n\n // --- 公共 API ---\n\n function insertNode(vector: T) {\n const newNodeIdx = vectors.length;\n\n vectors.push(vector);\n neighbors.push([]);\n\n if (entryPoint.idx === -1) {\n entryPoint.idx = newNodeIdx;\n entryPoint.level = 0;\n neighbors[newNodeIdx]![0] = [];\n nodeToLevels.set(newNodeIdx, 0);\n return;\n }\n \n // 🎯 确定性层级分配函数\n function assignLevelDeterministic(arrayIndex: number, maxLevels: number): number {\n const internalId = arrayIndex + 1;\n const lowestBit = internalId & -internalId;\n const level = 31 - Math.clz32(lowestBit);\n return Math.min(level, maxLevels - 1);\n }\n\n // 确定新节点的最高层级 - 使用确定性算法\n const max_level = 16; // 与Current HNSW保持一致\n const randomLevel = assignLevelDeterministic(newNodeIdx, max_level);\n const topLevel = entryPoint.level;\n \n // 记录节点的最高层级\n nodeToLevels.set(newNodeIdx, randomLevel);\n \n let currentNode