示例#1
0
def _distances_from_bounds(bounds, total_bounds, p):
    n = bounds.shape[1] // 2
    dim_ranges = [(total_bounds[d], total_bounds[d + n]) for d in range(n)]
    # Avoid degenerate case where there is a single unique rectangle that is a
    # single point. Increase the range by 1.0 to prevent divide by zero error
    for d in range(n):
        if dim_ranges[d][0] == dim_ranges[d][1]:
            dim_ranges[d] = (dim_ranges[d][0], dim_ranges[d][1] + 1)
    # Compute hilbert distance of the middle of each bounding box
    dim_mids = [(bounds[:, d] + bounds[:, d + n]) / 2.0 for d in range(n)]
    side_length = 2**p
    coords = np.zeros((bounds.shape[0], n), dtype=np.int64)
    for d in range(n):
        coords[:, d] = _data2coord(dim_mids[d], dim_ranges[d], side_length)
    hilbert_distances = distances_from_coordinates(p, coords)
    return hilbert_distances
def test_distance_from_coordinates(p, n):
    side_len = 2**p

    # build matrix of all possible coordinate
    coords = np.array(list(product(range(side_len), repeat=n)))

    # Compute distances as vector result
    vector_result = distances_from_coordinates(p, coords)

    # Compare with reference
    reference_hc = HilbertCurve(p, n)
    for i in range(coords.shape[0]):
        coord = coords[i, :]

        # Reference
        expected = reference_hc.distance_from_coordinates(coord)

        # Compute scalar distance and compare
        scalar_result = distance_from_coordinate(p, coord)
        assert scalar_result == expected

        # Compare with vector distance compute above
        assert vector_result[i] == expected