Exemple #1
0
        private static List <Neighbor> GetNeighborsByDistance(LeafNode leafNode, IDictionary <int, List <LeafNode> > buckets, IDistanceMetric distanceMetric)
        {
            var neighbors = distanceMetric.SignificantCoordinates(leafNode.Coords)
                            // Get every node with at least one shared match in common
                            .SelectMany(coord => buckets.TryGetValue(coord, out var bucket) ? bucket : Enumerable.Empty <LeafNode>())
                            // We only need one direction A -> B (not also B -> A) since we're ultimately going to look at the smallest distances.
                            .Where(neighborNode => neighborNode.Index < leafNode.Index)
                            // Make sure that each node is considered only once (might have been in more than one bucket if more than one shared match in common.
                            .Distinct()
                            .Select(neighborNode => new Neighbor(neighborNode, leafNode))
                            .LowestN(neighbor => neighbor.DistanceSquared, _maxNeighbors)
                            .ToList();

            return(neighbors);
        }
Exemple #2
0
        private static List <Neighbor> GetNeighborsByDistance(IEnumerable <LeafNode> leafNodesAll, LeafNode leafNode, IDistanceMetric distanceMetric)
        {
            var neighbors = leafNodesAll
                            .Where(neighborNode => neighborNode.Index < leafNode.Index)
                            .Select(neighborNode => new Neighbor(neighborNode, leafNode))
                            .Where(neighbor => neighbor.DistanceSquared != double.PositiveInfinity)
                            .LowestN(neighbor => neighbor.DistanceSquared, _maxNeighbors)
                            .ToList();

            return(neighbors);
        }