docstr: FIXME: Should this also return the edge ids and types?
  
  Display the edge list. Compute it if needed.
  NOTE: If the graph is of type Graph() then the displayed undirected
  edges are the same as displayed by networkx Graph(), but the direction
  could be different i.e. an edge displayed by cugraph as (src, dst)
  could be displayed as (dst, src) by networkx.
  cugraph.Graph stores symmetrized edgelist internally. For displaying
  undirected edgelist for a Graph the upper trianglar matrix of the
  symmetrized edgelist is returned.
  networkx.Graph renumbers the input and stores the upper triangle of
  this renumbered input. Since the internal renumbering of networx and
  cugraph is different, the upper triangular matrix of networkx
  renumbered input may not be the same as cugraph's upper trianglar
  matrix of the symmetrized edgelist. Hence the displayed source and
  destination pairs in both will represent the same edge but node values
  could be swapped.
  
  Returns
  -------
  df : dask_cudf.DataFrame
      This dask_cudf.DataFrame wraps source, destination and weight
      df[src] : dask_cudf.Series
          contains the source index for each edge
      df[dst] : dask_cudf.Series
          contains the destination index for each edge
      df[weight] : dask_cudf.Series
          Column is only present for weighted Graph,
          then containing the weight value for each edge
docstr_tok: ["FIXME",":","Should","this","also","return","the","edge","ids","and","types","?","Display","the","edge","list",".","Compute","it","if","needed",".","NOTE",":","If","the","graph","is","of","type","Graph","(",")","then","the","displayed","undirected","edges","are","the","same","as","displayed","by","networkx","Graph","(",")",",","but","the","direction","could","be","different","i.e",".","an","edge","displayed","by","cugraph","as","(","src",",","dst",")","could","be","displayed","as","(","dst",",","src",")","by","networkx",".","cugraph.Graph","stores","symmetrized","edgelist","internally",".","For","displaying","undirected","edgelist","for","a","Graph","the","upper","trianglar","matrix","of","the","symmetrized","edgelist","is","returned",".","networkx.Graph","renumbers","the","input","and","stores","the","upper","triangle","of","this","renumbered","input",".","Since","the","internal","renumbering","of","networx","and","cugraph","is","different",",","the","upper","triangular","matrix","of","networkx","renumbered","input","may","not","be","the","same","as","cugraph","'s","upper","trianglar","matrix","of","the","symmetrized","edgelist",".","Hence","the","displayed","source","and","destination","pairs","in","both","will","represent","the","same","edge","but","node","values","could","be","swapped",".","Returns","--","--","--","-","df",":","dask_cudf.DataFrame","This","dask_cudf.DataFrame","wraps","source",",","destination","and","weight","df","[","src","]",":","dask_cudf.Series","contains","the","source","index","for","each","edge","df","[","dst","]",":","dask_cudf.Series","contains","the","destination","index","for","each","edge","df","[","weight","]",":","dask_cudf.Series","Column","is","only","present","for","weighted","Graph",",","then","containing","the","weight","value","for","each","edge"]
code: def view_edge_list(self):
      """
      FIXME: Should this also return the edge ids and types?
  
      Display the edge list. Compute it if needed.
      NOTE: If the graph is of type Graph() then the displayed undirected
      edges are the same as displayed by networkx Graph(), but the direction
      could be different i.e. an edge displayed by cugraph as (src, dst)
      could be displayed as (dst, src) by networkx.
      cugraph.Graph stores symmetrized edgelist internally. For displaying
      undirected edgelist for a Graph the upper trianglar matrix of the
      symmetrized edgelist is returned.
      networkx.Graph renumbers the input and stores the upper triangle of
      this renumbered input. Since the internal renumbering of networx and
      cugraph is different, the upper triangular matrix of networkx
      renumbered input may not be the same as cugraph's upper trianglar
      matrix of the symmetrized edgelist. Hence the displayed source and
      destination pairs in both will represent the same edge but node values
      could be swapped.
  
      Returns
      -------
      df : dask_cudf.DataFrame
          This dask_cudf.DataFrame wraps source, destination and weight
          df[src] : dask_cudf.Series
              contains the source index for each edge
          df[dst] : dask_cudf.Series
              contains the destination index for each edge
          df[weight] : dask_cudf.Series
              Column is only present for weighted Graph,
              then containing the weight value for each edge
      """
      if self.edgelist is None:
          raise RuntimeError("Graph has no Edgelist.")
  
      edgelist_df = self.input_df
      is_string_dtype = False
      is_multi_column = False
      wgtCol = simpleDistributedGraphImpl.edgeWeightCol
      if not self.properties.directed:
          srcCol = self.source_columns
          dstCol = self.destination_columns
          if self.renumber_map.unrenumbered_id_type == "object":
              # FIXME: Use the renumbered vertices instead and then un-renumber.
              # This operation can be expensive.
              is_string_dtype = True
              edgelist_df = self.edgelist.edgelist_df
              srcCol = self.renumber_map.renumbered_src_col_name
              dstCol = self.renumber_map.renumbered_dst_col_name
  
          if isinstance(srcCol, list):
              srcCol = self.renumber_map.renumbered_src_col_name
              dstCol = self.renumber_map.renumbered_dst_col_name
              edgelist_df = self.edgelist.edgelist_df
              # unrenumber before extracting the upper triangular part
              if len(self.source_columns) == 1:
                  edgelist_df = self.renumber_map.unrenumber(
                      edgelist_df, srcCol
                  )
                  edgelist_df = self.renumber_map.unrenumber(
                      edgelist_df, dstCol
                  )
              else:
                  is_multi_column = True
  
          edgelist_df[srcCol], edgelist_df[dstCol] = edgelist_df[
              [srcCol, dstCol]
          ].min(axis=1), edgelist_df[[srcCol, dstCol]].max(axis=1)
  
          edgelist_df = (
              edgelist_df.groupby(by=[srcCol, dstCol])
              .sum()
              .reset_index()
          )
          if wgtCol in edgelist_df.columns:
              # FIXME: This breaks if there are are multi edges as those will
              # be dropped during the symmetrization step and the original 'weight'
              # will be halved.
              edgelist_df[wgtCol] /= 2
  
      if is_string_dtype or is_multi_column:
          # unrenumber the vertices
          edgelist_df = self.renumber_map.unrenumber(
              edgelist_df, srcCol
          )
          edgelist_df = self.renumber_map.unrenumber(
              edgelist_df, dstCol
          )
  
      if self.properties.renumbered:
          edgelist_df = edgelist_df.rename(
              columns=self.renumber_map.internal_to_external_col_names
          )
  
      # If there is no 'wgt' column, nothing will happen
      edgelist_df = edgelist_df.rename(
          columns={wgtCol: self.weight_column}
      )
  
      self.properties.edge_count = len(edgelist_df)
      return edgelist_df
  
imports: import gc
  from typing import Union
  import warnings
  import cudf
  import cupy
  import dask
  import dask_cudf
  from dask import delayed
  from dask.distributed import wait, default_client
  import numpy
  from pylibcugraph import MGGraph, ResourceHandle, GraphProperties, get_two_hop_neighbors, select_random_vertices
  from cugraph.structure import graph_primtypes_wrapper
  from cugraph.structure.graph_primtypes_wrapper import Direction
  from cugraph.structure.number_map import NumberMap
  from cugraph.structure.symmetrize import symmetrize
  from cugraph.dask.common.part_utils import get_persisted_df_worker_map, persist_dask_df_equal_parts_per_worker
  from cugraph.dask.common.mg_utils import run_gc_on_dask_cluster
  from cugraph.dask import get_n_workers
  import cugraph.dask.comms.comms
label_desc: Use image node_id 5 for calling the simpleDistributedGraphImpl obj's underlying member method code with example usage: obj.view_edge_list() and returns: edgelist_df