<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_heap_initializer(dist, dist_args):
 """Create a numba accelerated version of heap initialization for the alternative k-neighbor graph algorithm. This approach builds two heaps of neighbors simultaneously, one is a heap used to construct a very approximate k-neighbor graph for searching; the other is the initialization for searching. Parameters dist: function A numba JITd distance function which, given two arrays computes a dissimilarity between them. dist_args: tuple Any extra arguments that need to be passed to the distance function beyond the two arrays to be compared. Returns ------- A numba JITd function for for heap initialization that is specialised to the given metric. """


    @numba.njit(parallel=True)
    def initialize_heaps(data, n_neighbors, leaf_array):
        graph_heap = make_heap(data.shape[0], 10)
        search_heap = make_heap(data.shape[0], n_neighbors * 2)
        tried = set([(-1, -1)])
        for n in range(leaf_array.shape[0]):
            for i in range(leaf_array.shape[1]):
                if leaf_array[n, i] < 0:
                    break
                for j in range(i + 1, leaf_array.shape[1]):
                    if leaf_array[n, j] < 0:
                        break
                    if (leaf_array[n, i], leaf_array[n, j]) in tried:
                        continue

                    d = dist(data[leaf_array[n, i]], data[leaf_array[n, j]], *dist_args)
                    unchecked_heap_push(
                        graph_heap, leaf_array[n, i], d, leaf_array[n, j], 1
                    )
                    unchecked_heap_push(
                        graph_heap, leaf_array[n, j], d, leaf_array[n, i], 1
                    )
                    unchecked_heap_push(
                        search_heap, leaf_array[n, i], d, leaf_array[n, j], 1
                    )
                    unchecked_heap_push(
                        search_heap, leaf_array[n, j], d, leaf_array[n, i], 1
                    )
                    tried.add((leaf_array[n, i], leaf_array[n, j]))

        return graph_heap, search_heap

    return initialize_heaps