code: def heap_push(heap, row, weight, index, flag):
      
      indices = heap[0, row]
      weights = heap[1, row]
      is_new = heap[2, row]
  
      if weight >= weights[0]:
          return 0
  
      # break if we already have this element.
      for i in range(indices.shape[0]):
          if index == indices[i]:
              return 0
  
      # insert val at position zero
      weights[0] = weight
      indices[0] = index
      is_new[0] = flag
  
      # descend the heap, swapping values until the max heap criterion is met
      i = 0
      while True:
          ic1 = 2 * i + 1
          ic2 = ic1 + 1
  
          if ic1 >= heap.shape[2]:
              break
          elif ic2 >= heap.shape[2]:
              if weights[ic1] > weight:
                  i_swap = ic1
              else:
                  break
          elif weights[ic1] >= weights[ic2]:
              if weight < weights[ic1]:
                  i_swap = ic1
              else:
                  break
          else:
              if weight < weights[ic2]:
                  i_swap = ic2
              else:
                  break
  
          weights[i] = weights[i_swap]
          indices[i] = indices[i_swap]
          is_new[i] = is_new[i_swap]
  
          i = i_swap
  
      weights[i] = weight
      indices[i] = index
      is_new[i] = flag
  
      return 1
docs: Push a new element onto the heap. The heap stores potential neighbors
      for each data point. The ``row`` parameter determines which data point we
      are addressing, the ``weight`` determines the distance (for heap sorting),
      the ``index`` is the element to add, and the flag determines whether this
      is to be considered a new addition.
  
      Parameters
      ----------
      heap: ndarray generated by ``make_heap``
          The heap object to push into
  
      row: int
          Which actual heap within the heap object to push to
  
      weight: float
          The priority value of the element to push onto the heap
  
      index: int
          The actual value to be pushed
  
      flag: int
          Whether to flag the newly added element or not.
  
      Returns
      -------
      success: The number of new elements successfully pushed into the heap.