From 8fab18b0f674ade9cc2137f161d0a4db6738adf4 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2022 18:26:03 +0300 Subject: [PATCH] Fix partial lal graph --- ZeroLevel.HNSW/Services/LAL/LALGraph.cs | 12 ++++++++---- ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs | 10 +++++++++- ZeroLevel/Services/Transliteration.cs | 9 +++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/ZeroLevel.HNSW/Services/LAL/LALGraph.cs b/ZeroLevel.HNSW/Services/LAL/LALGraph.cs index 9528cb5..588e062 100644 --- a/ZeroLevel.HNSW/Services/LAL/LALGraph.cs +++ b/ZeroLevel.HNSW/Services/LAL/LALGraph.cs @@ -30,7 +30,7 @@ namespace ZeroLevel.HNSW var C = new Queue(); var W = new HashSet(); var entryPoints = context.EntryPoints; - + var nextEntry = new HashSet(); do { foreach (var ep in entryPoints) @@ -38,7 +38,11 @@ namespace ZeroLevel.HNSW var neighboursIds = _links.FindNeighbors(ep); for (int i = 0; i < neighboursIds.Length; ++i) { - C.Enqueue(neighboursIds[i]); + if (v.Contains(neighboursIds[i]) == false) + { + C.Enqueue(neighboursIds[i]); + nextEntry.Add(neighboursIds[i]); + } } v.Add(ep); } @@ -54,13 +58,13 @@ namespace ZeroLevel.HNSW W.Add(toExpand); if (W.Count > k) { - var loser_id = DefaultRandomGenerator.Instance.Next(0, W.Count - 1); W.Remove(W.First()); } } } } - entryPoints = W.Select(id => id).ToList(); + entryPoints = nextEntry.Select(id => id).ToList(); + nextEntry.Clear(); } while (W.Count < k && entryPoints.Any()); C.Clear(); diff --git a/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs b/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs index 04b2c64..fcdd4ec 100644 --- a/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs +++ b/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs @@ -15,14 +15,22 @@ namespace ZeroLevel.HNSW { var partial_k = 1 + (k / _graphs.Count); var result = new Dictionary>(); + int step = 1; foreach (var graph in _graphs) { result.Add(graph.Key, new List()); var context = contexts[graph.Key]; if (context.EntryPoints != null) { - result[graph.Key].AddRange(graph.Value.KNearest(partial_k, context)); + var r = graph.Value.KNearest(partial_k, context) as HashSet; + if (r.Count < partial_k) + { + var diff = partial_k - r.Count; + partial_k += diff / (_graphs.Count - step); + } + result[graph.Key].AddRange(r); } + step++; } return result; } diff --git a/ZeroLevel/Services/Transliteration.cs b/ZeroLevel/Services/Transliteration.cs index 9512485..f24c5a9 100644 --- a/ZeroLevel/Services/Transliteration.cs +++ b/ZeroLevel/Services/Transliteration.cs @@ -59,6 +59,15 @@ namespace ZeroLevel.Services return tdict; } + public static bool HasCyrillicSymbols(string line) + { + foreach (var ch in line) + { + if(gost.ContainsKey(ch.ToString()) || iso.ContainsKey(ch.ToString())) return true; + } + return false; + } + static Transliteration() { gost.Add("Є", "EH");