diff --git a/TestHNSW/HNSWDemo/Program.cs b/TestHNSW/HNSWDemo/Program.cs index afc4524..ba378e6 100644 --- a/TestHNSW/HNSWDemo/Program.cs +++ b/TestHNSW/HNSWDemo/Program.cs @@ -9,8 +9,6 @@ namespace HNSWDemo { static void Main(string[] args) { - - new LALTest().Run(); // new AutoClusteringMNISTTest().Run(); // new AccuracityTest().Run(); diff --git a/TestHNSW/HNSWDemo/Tests/LALTest.cs b/TestHNSW/HNSWDemo/Tests/LALTest.cs index 5db13da..b0f85e0 100644 --- a/TestHNSW/HNSWDemo/Tests/LALTest.cs +++ b/TestHNSW/HNSWDemo/Tests/LALTest.cs @@ -10,8 +10,7 @@ namespace HNSWDemo.Tests internal class LALTest : ITest { - private const int count = 5000; - private const int testCount = 100; + private const int count = 20000; private const int dimensionality = 128; public void Run() @@ -83,19 +82,24 @@ namespace HNSWDemo.Tests } var contexts = mappers.CreateContext(null, entries); - var result = worlds.KNearest(10, contexts); + var result = worlds.KNearest(5000, contexts); - Console.WriteLine("Entries:"); + Console.WriteLine($"Found: {result.Sum(r=>r.Value.Count)}"); + + /*Console.WriteLine("Entries:"); foreach (var n in entries) { Console.WriteLine($"\t{n}"); } Console.WriteLine("Extensions:"); - foreach (var n in mappers.ConvertIdsToFeatures(result)) + foreach (var r in result) { - Console.WriteLine($"\t[{n}]"); - } + foreach (var n in mappers.ConvertIdsToFeatures(r.Key, r.Value)) + { + Console.WriteLine($"\t[{n}]"); + } + }*/ } } } diff --git a/ZeroLevel.HNSW/Services/HNSWMappers.cs b/ZeroLevel.HNSW/Services/HNSWMappers.cs index 859f638..5db34e9 100644 --- a/ZeroLevel.HNSW/Services/HNSWMappers.cs +++ b/ZeroLevel.HNSW/Services/HNSWMappers.cs @@ -17,14 +17,11 @@ namespace ZeroLevel.HNSW _mappers.Add(c, map); } - public IEnumerable ConvertIdsToFeatures(IEnumerable ids) + public IEnumerable ConvertIdsToFeatures(int c, IEnumerable ids) { - foreach (var map in _mappers) + foreach (var feature in _mappers[c].ConvertIdsToFeatures(ids)) { - foreach (var feature in map.Value.ConvertIdsToFeatures(ids)) - { - yield return feature; - } + yield return feature; } } diff --git a/ZeroLevel.HNSW/Services/LAL/LALGraph.cs b/ZeroLevel.HNSW/Services/LAL/LALGraph.cs index eeb2d5f..9528cb5 100644 --- a/ZeroLevel.HNSW/Services/LAL/LALGraph.cs +++ b/ZeroLevel.HNSW/Services/LAL/LALGraph.cs @@ -28,7 +28,7 @@ namespace ZeroLevel.HNSW { var v = new VisitedBitSet(_links.Count, 1); var C = new Queue(); - var W = new List(); + var W = new HashSet(); var entryPoints = context.EntryPoints; do @@ -55,7 +55,7 @@ namespace ZeroLevel.HNSW if (W.Count > k) { var loser_id = DefaultRandomGenerator.Instance.Next(0, W.Count - 1); - W.RemoveAt(loser_id); + W.Remove(W.First()); } } } diff --git a/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs b/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs index d46f441..04b2c64 100644 --- a/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs +++ b/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs @@ -11,16 +11,17 @@ namespace ZeroLevel.HNSW _graphs.Add(c, graph); } - public IEnumerable KNearest(int k, IDictionary contexts) + public IDictionary> KNearest(int k, IDictionary contexts) { var partial_k = 1 + (k / _graphs.Count); - var result = new List(); + var result = new Dictionary>(); foreach (var graph in _graphs) { + result.Add(graph.Key, new List()); var context = contexts[graph.Key]; if (context.EntryPoints != null) { - result.AddRange(graph.Value.KNearest(partial_k, context)); + result[graph.Key].AddRange(graph.Value.KNearest(partial_k, context)); } } return result; diff --git a/ZeroLevel.HNSW/ZeroLevel.HNSW.csproj b/ZeroLevel.HNSW/ZeroLevel.HNSW.csproj index b7c936a..d47a175 100644 --- a/ZeroLevel.HNSW/ZeroLevel.HNSW.csproj +++ b/ZeroLevel.HNSW/ZeroLevel.HNSW.csproj @@ -5,7 +5,7 @@ AnyCPU;x64 x64 full - 1.0.0.1 + 1.0.0.3 ogoun Ogoun Copyright Ogoun 2022 @@ -13,6 +13,7 @@ zero.png https://github.com/ogoun/Zero git + Fix search output.