code: def _set_reflect_both(
      padded, axis, width_pair, method, include_edge=False
  ):
      """Pads an `axis` of `arr` using reflection.
  
      Args:
        padded(cupy.ndarray): Input array of arbitrary shape.
        axis(int): Axis along which to pad `arr`.
        width_pair((int, int)): Pair of widths that mark the pad area on both
            sides in the given dimension.
        method(str): Controls method of reflection; options are 'even' or 'odd'.
        include_edge(bool, optional): If true, edge value is included in
            reflection, otherwise the edge value forms the symmetric axis to the
            reflection. (Default value = False)
      """
      left_pad, right_pad = width_pair
      old_length = padded.shape[axis] - right_pad - left_pad
  
      if include_edge:
          # Edge is included, we need to offset the pad amount by 1
          edge_offset = 1
      else:
          edge_offset = (
              0  # Edge is not included, no need to offset pad amount
          )
          old_length -= 1  # but must be omitted from the chunk
  
      if left_pad > 0:
          # Pad with reflected values on left side:
          # First limit chunk size which can't be larger than pad area
          chunk_length = min(old_length, left_pad)
          # Slice right to left, stop on or next to edge, start relative to stop
          stop = left_pad - edge_offset
          start = stop + chunk_length
          left_slice = _slice_at_axis(slice(start, stop, -1), axis)
          left_chunk = padded[left_slice]
  
          if method == "odd":
              # Negate chunk and align with edge
              edge_slice = _slice_at_axis(
                  slice(left_pad, left_pad + 1), axis
              )
              left_chunk = 2 * padded[edge_slice] - left_chunk
  
          # Insert chunk into padded area
          start = left_pad - chunk_length
          stop = left_pad
          pad_area = _slice_at_axis(slice(start, stop), axis)
          padded[pad_area] = left_chunk
          # Adjust pointer to left edge for next iteration
          left_pad -= chunk_length
  
      if right_pad > 0:
          # Pad with reflected values on right side:
          # First limit chunk size which can't be larger than pad area
          chunk_length = min(old_length, right_pad)
          # Slice right to left, start on or next to edge, stop relative to start
          start = -right_pad + edge_offset - 2
          stop = start - chunk_length
          right_slice = _slice_at_axis(slice(start, stop, -1), axis)
          right_chunk = padded[right_slice]
  
          if method == "odd":
              # Negate chunk and align with edge
              edge_slice = _slice_at_axis(
                  slice(-right_pad - 1, -right_pad), axis
              )
              right_chunk = 2 * padded[edge_slice] - right_chunk
  
          # Insert chunk into padded area
          start = padded.shape[axis] - right_pad
          stop = start + chunk_length
          pad_area = _slice_at_axis(slice(start, stop), axis)
          padded[pad_area] = right_chunk
          # Adjust pointer to right edge for next iteration
          right_pad -= chunk_length
  
      return left_pad, right_pad
  
file_path: cupy/cupy/_padding/pad.py
imports: import numbers
  import numpy
  import cupy
label_desc: Use image node_id 9 for calling a global function with example usage: _set_reflect_both(padded, axis, width_pair, method, include_edge) and returns: left_pad,  right_pad