using System.Collections.Generic; using System.IO; using ZeroLevel.Services.Serialization; namespace ZeroLevel.HNSW { // object -> vector -> vectorId // HNSW vectorId + vector // Map object feature - vectorId public class HNSWMap : IBinarySerializable { private Dictionary _map; private Dictionary _reverse_map; public int this[TFeature feature] => _map.GetValueOrDefault(feature); public HNSWMap() { } public HNSWMap(int capacity = -1) { if (capacity > 0) { _map = new Dictionary(capacity); _reverse_map = new Dictionary(capacity); } else { _map = new Dictionary(); _reverse_map = new Dictionary(); } } public HNSWMap(Stream stream) { using (var reader = new MemoryStreamReader(stream)) { Deserialize(reader); } } public void Append(TFeature feature, int vectorId) { _map[feature] = vectorId; _reverse_map[vectorId] = feature; } public IEnumerable ConvertFeaturesToIds(IEnumerable features) { int id; foreach (var feature in features) { if (_map.TryGetValue(feature, out id)) { yield return id; } } } public IEnumerable ConvertIdsToFeatures(IEnumerable ids) { TFeature feature; foreach (var id in ids) { if (_reverse_map.TryGetValue(id, out feature)) { yield return feature; } } } public void Deserialize(IBinaryReader reader) { this._map = reader.ReadDictionary(); this._reverse_map = reader.ReadDictionary(); } public void Serialize(IBinaryWriter writer) { writer.WriteDictionary(this._map); writer.WriteDictionary(this._reverse_map); } } }