|
|
@ -298,24 +298,10 @@ namespace ZeroLevel.HNSW
|
|
|
|
return Enumerable.Empty<(int, float)>();
|
|
|
|
return Enumerable.Empty<(int, float)>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var distance = new Func<int, int, float>((id1, id2) => _options.Distance(_vectors[id1], _vectors[id2]));
|
|
|
|
var distance = new Func<int, int, float>((id1, id2) => _options.Distance(_vectors[id1], _vectors[id2]));
|
|
|
|
|
|
|
|
|
|
|
|
// W ← ∅ // set for the current nearest elements
|
|
|
|
// W ← ∅ // set for the current nearest elements
|
|
|
|
var W = new Dictionary<int, float>(k + 1);
|
|
|
|
var W = new Dictionary<int, float>(k + 1);
|
|
|
|
// ep ← get enter point for hnsw
|
|
|
|
|
|
|
|
var ep = EntryPoint;
|
|
|
|
|
|
|
|
// L ← level of ep // top layer for hnsw
|
|
|
|
|
|
|
|
var L = MaxLayer;
|
|
|
|
|
|
|
|
// for lc ← L … 1
|
|
|
|
|
|
|
|
for (int layer = L; layer > 0; --layer)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// W ← SEARCH-LAYER(q, ep, ef = 1, lc)
|
|
|
|
|
|
|
|
_layers[layer].KNearestAtLayer(ep, W, 1, context);
|
|
|
|
|
|
|
|
// ep ← get nearest element from W to q
|
|
|
|
|
|
|
|
ep = W.OrderBy(p => p.Value).First().Key;
|
|
|
|
|
|
|
|
W.Clear();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// W ← SEARCH-LAYER(q, ep, ef, lc =0)
|
|
|
|
// W ← SEARCH-LAYER(q, ep, ef, lc =0)
|
|
|
|
_layers[0].KNearestAtLayer(ep, W, k, context);
|
|
|
|
_layers[0].KNearestAtLayer(W, k, context);
|
|
|
|
// return K nearest elements from W to q
|
|
|
|
// return K nearest elements from W to q
|
|
|
|
return W.Select(p => (p.Key, p.Value));
|
|
|
|
return W.Select(p => (p.Key, p.Value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|