code: def push_symbols(
      compressed_message: CrayCompressedMessage,
      cdf_low: ndarray,
      cdf_high: ndarray,
      precision: int,
  ) -> CrayCompressedMessage:
      """
      Pushes information corresponding to a symbol on the top of the stack.
  
      Args:
          compressed_message: Input stack to have data pushed to.
          cdf_low: The low CDF value, e.g., ``cdf[symbol]``.
          cdf_high: The high CDF, e.g., ``cdf[symbol+1]``.
          precision: Operating precision for push operations.
  
      Returns:
          Compressed message with information content pushed to top of stack.
      """
      head, tail = compressed_message
      frequencies = cdf_high - cdf_low
  
      # Why three writes you may ask?
      # The answer is to vectorize. In the pop function normally this is done
      # with a while loop that would renormalize the range in steps of 8 bits.
      # Since we're using 32 bits for the head the increments can come at levels
      # of 8, 16, or 24, depending on the starting value of the head. Since the
      # push operation is the inverse, we have three possible pushes.
  
      indices = (
          head >> 2 * TAIL_PRECISION + HEAD_PRECISION - precision
          >= frequencies
      )
      tail = tail_push(tail, indices, head.astype(TAIL_DTYPE))
      head = jnp.where(indices, head >> TAIL_PRECISION, head)
  
      indices = (
          head >> 1 * TAIL_PRECISION + HEAD_PRECISION - precision
          >= frequencies
      )
      tail = tail_push(tail, indices, head.astype(TAIL_DTYPE))
      head = jnp.where(indices, head >> TAIL_PRECISION, head)
  
      indices = head >> HEAD_PRECISION - precision >= frequencies
      tail = tail_push(tail, indices, head.astype(TAIL_DTYPE))
      head = jnp.where(indices, head >> TAIL_PRECISION, head)
  
      head_div_freqs, head_mod_freqs = jnp.divmod(head, frequencies)
  
      return CrayCompressedMessage(
          (head_div_freqs << precision) + head_mod_freqs + cdf_low, tail
      )
  
imports: from typing import NamedTuple, Sequence, Tuple
  import jax.lax
  import jax.numpy
  from jax.numpy import ndarray
  from jax.random import PRNGKey, randint
label_desc: Use image node_id 5 for calling a global function with example usage: push_symbols(compressed_message, cdf_low, cdf_high, precision) and returns: CrayCompressedMessage