using System.Collections.Concurrent; using System.Collections.Generic; namespace ZeroLevel.HNSW { // object -> vector -> vectorId // HNSW vectorId + vector // Map object feature - vectorId public class HNSWMap { private readonly ConcurrentDictionary _map = new ConcurrentDictionary(); private readonly ConcurrentDictionary _reverse_map = new ConcurrentDictionary(); 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; } } } } }