{"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 currentNodeIdx = entryPoint.idx;\n    \n    // 从顶层向下搜索\n    for (let level = topLevel; level > randomLevel; level--) {\n        const results = searchLayerWithQuery(vector, currentNodeIdx, level, 1);\n        if (results.length > 0) {\n          currentNodeIdx = results[0]!.idx;\n        }\n    }\n\n    // 在每一层连接邻居\n    for (let level = Math.min(randomLevel, topLevel); level >= 0; level--) {\n        const nearestCandidates = searchLayerWithQuery(vector, currentNodeIdx, level, efConstruction);\n        \n        // 确保即使候选者少于M个也能正确处理\n        const M_level = level === 0 ? M * 2 : M;\n        const selectedNeighbors = getNeighborsByHeuristic(nearestCandidates, M_level);\n\n        connectNeighbors(newNodeIdx, level, selectedNeighbors);\n\n        // 从已选出的、最多样化的邻居中选择下一层的入口点\n        if (selectedNeighbors.length > 0) {\n          currentNodeIdx = selectedNeighbors[0]!.idx; \n        }\n    }\n    \n    // 如果新节点的层级更高，则更新入口点\n    if (randomLevel > topLevel) {\n        entryPoint.idx = newNodeIdx;\n        entryPoint.level = randomLevel;\n    }\n  }\n\n  function deleteNode(nodeIdx: number): boolean {\n    // 检查节点是否存在且有效\n    if (nodeIdx < 0 || nodeIdx >= vectors.length || deletedNodes.has(nodeIdx)) {\n      return false; // 节点不存在或已被删除\n    }\n\n    // 标记节点为已删除\n    deletedNodes.add(nodeIdx);\n\n    // 从所有邻居的连接中移除该节点\n    removeNodeFromNeighbors(nodeIdx);\n\n    // 如果删除的是入口点，需要重新选择入口点\n    if (nodeIdx === entryPoint.idx) {\n      reselectEntryPoint();\n    }\n\n    return true;\n  }\n\n  function search(queryVector: T, k: number, efSearch?: number) {\n    if (entryPoint.idx === -1 || !isValidNode(entryPoint.idx)) return [];\n\n    let currentNodeIdx = entryPoint.idx;\n    const topLevel = entryPoint.level;\n    \n    // 使用新的searchLayerWithQuery函数\n    for (let level = topLevel; level > 0; level--) {\n        const results = searchLayerWithQuery(queryVector, currentNodeIdx, level, 1);\n        if (results.length > 0) {\n          currentNodeIdx = results[0]!.idx;\n        } else {\n          // 如果当前层级没有找到有效结果，尝试重新选择入口点\n          reselectEntryPoint();\n          if (entryPoint.idx === -1) return [];\n          currentNodeIdx = entryPoint.idx;\n          break;\n        }\n    }\n    \n    const finalEf = Math.max(k, efSearch || efConstruction);\n    const finalResults = searchLayerWithQuery(queryVector, currentNodeIdx, 0, finalEf);\n\n    return finalResults.slice(0, k);\n  }\n\n  return {\n    insertNode,\n    search,\n    deleteNode,\n    getStats: () => ({\n        nodeCount: vectors.length,\n        activeNodeCount: vectors.length - deletedNodes.size,\n        deletedNodeCount: deletedNodes.size,\n        entryPoint: { ...entryPoint }\n    }),\n  };\n}\n\n/**\n * 泛型HNSW索引实现\n * \n * 🚀 主要特性：\n * 1. 完全泛型化 - 支持任意数据类型和距离函数\n * 2. 自定义距离函数 - 支持传入任意的距离计算函数\n * 3. 优化性能 - 使用MidiHeap和BinaryHeap优化\n * 4. 删除功能 - 完整的软删除支持\n * \n * 📊 适用场景：\n * - 向量相似性搜索（使用欧几里得距离、余弦距离等）\n * - 字符串相似性搜索（使用编辑距离、Jaccard距离等）\n * - 图节点相似性搜索（使用图距离函数）\n * - 任意自定义距离度量的相似性搜索\n * \n * 🎯 使用示例：\n * ```typescript\n * // 向量相似性搜索\n * const vectorIndex = createHNSWIndex({\n *   M: 16,\n *   efConstruction: 200,\n *   distanceFunction: (a, b) => cosineDistance(a, b)\n * });\n * \n * // 字符串相似性搜索\n * const stringIndex = createHNSWIndex({\n *   M: 16,\n *   efConstruction: 200,\n *   distanceFunction: (a, b) => editDistance(a, b)\n * });\n * ```\n */ ","import { BinaryHeapGeneric } from './binary-heap';\nimport { MidiHeapGeneric } from './midi-heap';\n\ninterface HNSWConfig {\n  M: number;\n  efConstruction: number;\n  metricType: 'cosine' | 'l2';\n}\n\ninterface Neighbor {\n  idx: number;\n  distance: number;\n}\n\nexport interface HNSWIndex {\n  insertNode: (vector: number[]) => void;\n  search: (queryVector: number[], 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(config: HNSWConfig): HNSWIndex {\n  const { M, efConstruction, metricType } = config;\n\n  // --- 数据存储 ---\n  // 使用最直接、最高效的数据结构\n  const vectors: number[][] = [];\n  const norms: number[] = [];\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   * - 循环展开以提升JIT效率\n   */\n  function distance(idxA: number, idxB: number): number {\n    // 检查节点有效性\n    if (!isValidNode(idxA) || !isValidNode(idxB)) {\n      return Infinity; // 无效节点返回无穷大距离\n    }\n\n    const vecA = vectors[idxA]!;\n    const vecB = vectors[idxB]!;\n    const normA = norms[idxA]!;\n    const normB = norms[idxB]!;\n    const len = vecA.length;\n\n    if (metricType === 'l2') {\n      let d = 0;\n      for (let j = 0; j < len; j++) {\n        const diff = vecA[j]! - vecB[j]!;\n        d += diff * diff;\n      }\n      return d;\n    }\n\n    // Default to cosine distance\n    let dotProduct = 0;\n    let i = 0;\n\n    // 循环展开 (手动SIMD)\n    for (; i < len - 3; i += 4) {\n      dotProduct +=\n        vecA[i]! * vecB[i]! +\n        vecA[i + 1]! * vecB[i + 1]! +\n        vecA[i + 2]! * vecB[i + 2]! +\n        vecA[i + 3]! * vecB[i + 3]!;\n    }\n\n    // 处理剩余部分\n    for (; i < len; i++) {\n      dotProduct += vecA[i]! * vecB[i]!;\n    }\n    \n    return (normA === 0 || normB === 0) ? 1.0 : 1.0 - dotProduct / (normA * normB);\n  }\n\n  /**\n   * 优化的距离计算函数 - 支持查询向量到目标节点\n   */\n  function distanceToQuery(queryVector: number[], queryNorm: number, targetIdx: number): number {\n    // 检查目标节点有效性\n    if (!isValidNode(targetIdx)) {\n      return Infinity; // 无效节点返回无穷大距离\n    }\n\n    const targetVector = vectors[targetIdx]!;\n    const targetNorm = norms[targetIdx]!;\n    const len = queryVector.length;\n\n    if (metricType === 'l2') {\n      let d = 0;\n      for (let j = 0; j < len; j++) {\n        const diff = queryVector[j]! - targetVector[j]!;\n        d += diff * diff;\n      }\n      return d;\n    }\n\n    // Default to cosine distance\n    let dotProduct = 0;\n    let i = 0;\n\n    for (; i < len - 3; i += 4) {\n      dotProduct +=\n        queryVector[i]! * targetVector[i]! +\n        queryVector[i + 1]! * targetVector[i + 1]! +\n        queryVector[i + 2]! * targetVector[i + 2]! +\n        queryVector[i + 3]! * targetVector[i + 3]!;\n    }\n\n    // 处理剩余部分\n    for (; i < len; i++) {\n      dotProduct += queryVector[i]! * targetVector[i]!;\n    }\n    \n    return (queryNorm === 0 || targetNorm === 0) ? 1.0 : 1.0 - dotProduct / (queryNorm * targetNorm);\n  }\n\n  /**\n   * 在指定层级上搜索最近的 ef 个邻居 - 使用优化的堆算法\n   * @织: 关键优化 - 使用MidiHeap处理有界结果集，用BinaryHeap处理无界候选集\n   */\n  function searchLayerWithQuery(\n    queryVector: number[],\n    queryNorm: number,\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 = distanceToQuery(queryVector, queryNorm, 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 = distanceToQuery(queryVector, queryNorm, 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   * 通过启发式方法选择邻居 (来自Current版本的核心逻辑)\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    // @织: 此处逻辑较复杂，暂时保持原样，未来可进一步优化\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   * @织: 性能优化 - 在邻居修剪时使用MidiHeap代替排序，性能更佳\n   * @织: BUG修复 - 正确处理底层（level 0）的 M*2 连接数限制\n   */\n  function connectNeighbors(nodeIdx: number, level: number, nearestNeighbors: Neighbor[]) {\n    // @织: BUG修复 - 根据层级使用正确的最大连接数：底层M*2，其他层M\n    const maxConnections = level === 0 ? M * 2 : M;\n    \n    // @织: BUG修复 - 应用启发式算法选择最多样化的邻居\n    const selectedNeighbors = getNeighborsByHeuristic(nearestNeighbors, maxConnections);\n    neighbors[nodeIdx]![level] = selectedNeighbors.map(n => n.idx);\n\n    for (const neighbor of selectedNeighbors) { // @织: BUG修复 - 只连接被选中的邻居\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\n  // --- 公共 API ---\n\n  function insertNode(vector: number[]) {\n    const newNodeIdx = vectors.length;\n    let norm = 0;\n    for (let i = 0; i < vector.length; i++) {\n        norm += vector[i]! * vector[i]!;\n    }\n    norm = Math.sqrt(norm);\n\n    vectors.push(vector);\n    norms.push(norm);\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 currentNodeIdx = entryPoint.idx;\n    \n    // 从顶层向下搜索\n    for (let level = topLevel; level > randomLevel; level--) {\n        const results = searchLayerWithQuery(vector, norm, currentNodeIdx, level, 1);\n        if (results.length > 0) {\n          currentNodeIdx = results[0]!.idx;\n        }\n    }\n\n    // 在每一层连接邻居\n    for (let level = Math.min(randomLevel, topLevel); level >= 0; level--) {\n        const nearestCandidates = searchLayerWithQuery(vector, norm, currentNodeIdx, level, efConstruction);\n        \n        // @织: BUG修复 - 确保即使候选者少于M个也能正确处理\n        const M_level = level === 0 ? M * 2 : M;\n        const selectedNeighbors = getNeighborsByHeuristic(nearestCandidates, M_level);\n\n        connectNeighbors(newNodeIdx, level, selectedNeighbors);\n\n        // @织: BUG修复 - 从已选出的、最多样化的邻居中选择下一层的入口点\n        if (selectedNeighbors.length > 0) {\n          currentNodeIdx = selectedNeighbors[0]!.idx; \n        }\n    }\n    \n    // 如果新节点的层级更高，则更新入口点\n    if (randomLevel > topLevel) {\n        entryPoint.idx = newNodeIdx;\n        entryPoint.level = randomLevel;\n    }\n  }\n\n  function deleteNode(nodeIdx: number): boolean {\n    // 检查节点是否存在且有效\n    if (nodeIdx < 0 || nodeIdx >= vectors.length || deletedNodes.has(nodeIdx)) {\n      return false; // 节点不存在或已被删除\n    }\n\n    // 标记节点为已删除\n    deletedNodes.add(nodeIdx);\n\n    // 从所有邻居的连接中移除该节点\n    removeNodeFromNeighbors(nodeIdx);\n\n    // 如果删除的是入口点，需要重新选择入口点\n    if (nodeIdx === entryPoint.idx) {\n      reselectEntryPoint();\n    }\n\n    return true;\n  }\n\n  function search(queryVector: number[], k: number, efSearch?: number) {\n    // @织: BUG修复 - 避免修改全局数组，直接计算查询向量的范数\n    let queryNorm = 0;\n    for (let i = 0; i < queryVector.length; i++) {\n        queryNorm += queryVector[i]! * queryVector[i]!;\n    }\n    queryNorm = Math.sqrt(queryNorm);\n\n    if (entryPoint.idx === -1 || !isValidNode(entryPoint.idx)) return [];\n\n    let currentNodeIdx = entryPoint.idx;\n    const topLevel = entryPoint.level;\n    \n    // @织: 使用新的searchLayerWithQuery函数\n    for (let level = topLevel; level > 0; level--) {\n        const results = searchLayerWithQuery(queryVector, queryNorm, currentNodeIdx, level, 1);\n        if (results.length > 0) {\n          currentNodeIdx = results[0]!.idx;\n        } else {\n          // 如果当前层级没有找到有效结果，尝试重新选择入口点\n          reselectEntryPoint();\n          if (entryPoint.idx === -1) return [];\n          currentNodeIdx = entryPoint.idx;\n          break;\n        }\n    }\n    \n    const finalEf = Math.max(k, efSearch || efConstruction);\n    const finalResults = searchLayerWithQuery(queryVector, queryNorm, currentNodeIdx, 0, finalEf);\n\n    return finalResults.slice(0, k);\n  }\n\n  return {\n    insertNode,\n    search,\n    deleteNode,\n    getStats: () => ({\n        nodeCount: vectors.length,\n        activeNodeCount: vectors.length - deletedNodes.size,\n        deletedNodeCount: deletedNodes.size,\n        entryPoint: { ...entryPoint }\n    }),\n  };\n}\n\n/**\n * 性能优化总结：\n * \n * 🚀 主要优化点：\n * 1. MidiHeapGeneric 引入 - 针对HNSW中固定大小（ef, M）的集合进行终极优化。\n * 2. 混合堆策略 - 对大小不定的候选集使用BinaryHeap，对Top-K结果集使用MidiHeap，实现最佳平衡。\n * 3. 高效剪枝 - 在邻居连接阶段使用MidiHeap代替Array.sort，显著降低CPU开销。\n * 4. 删除功能 - 软删除方案，保持高性能的同时支持节点删除。\n * \n * 📊 预期性能提升：\n * - 搜索操作：显著提升，MidiHeap在小数据集上的性能优势是数量级的。\n * - 插入操作：显著提升，connectNeighbors是插入时的热点之一。\n * - 删除操作：O(1)删除状态检查，软删除避免复杂图重构。\n * \n * 🎯 适用场景：\n * - 追求极致低延迟的在线查询服务。\n * - 需要快速构建索引的离线任务。\n * - 需要支持动态删除的应用场景。\n */\n\n// 导出泛型版本\nexport * from './generic';","import { createHNSWIndex } from './vector';\r\nimport { createHNSWIndex as createHNSWIndexGeneric } from './generic';\r\nexport const hnsw = {\r\n  createIndex: createHNSWIndex,\r\n  createIndexGeneric: createHNSWIndexGeneric,\r\n}"]}