You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel.HNSW/Services/LAL/SplittedLALGraph.cs

85 lines
2.5 KiB

using System.Collections.Generic;
using System.IO;
using System.Linq;
using ZeroLevel.Services.Serialization;
namespace ZeroLevel.HNSW
{
public class SplittedLALGraph
: IBinarySerializable
{
private IDictionary<int, LALGraph> _graphs;
public SplittedLALGraph()
{
_graphs = new Dictionary<int, LALGraph>();
}
public SplittedLALGraph(string filePath)
{
using (var fs = File.OpenRead(filePath))
{
using (var bs = new BufferedStream(fs, 1024 * 1024 * 32))
{
using (var reader = new MemoryStreamReader(bs))
{
Deserialize(reader);
}
}
}
}
public void Save(string filePath)
{
using (var fs = File.OpenWrite(filePath))
{
using (var bs = new BufferedStream(fs, 1024 * 1024 * 32))
{
using (var writer = new MemoryStreamWriter(bs))
{
Serialize(writer);
}
}
}
}
public void Append(LALGraph graph, int c)
{
_graphs.Add(c, graph);
}
public IDictionary<int, List<int>> KNearest(int k, IDictionary<int, SearchContext> contexts)
{
var partial_k = 1 + (k / _graphs.Count);
var result = new Dictionary<int, List<int>>();
int step = 1;
foreach (var graph in _graphs)
{
result.Add(graph.Key, new List<int>());
var context = contexts[graph.Key];
if (context.EntryPoints != null)
{
var r = graph.Value.KNearest(partial_k, context) as HashSet<int>;
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;
}
public void Serialize(IBinaryWriter writer)
{
writer.WriteDictionary<int, LALGraph>(this._graphs);
}
public void Deserialize(IBinaryReader reader)
{
this._graphs = reader.ReadDictionary<int, LALGraph>();
}
}
}

Powered by TurnKey Linux.