code: def dense_hungarian(costs, num_rows, num_columns, epsilon=None):
      """
      Execute the Hungarian algorithm against a dense bipartite
      graph representation.
  
      *NOTE*: This API is unstable and subject to change
  
      The Hungarian algorithm identifies the lowest cost matching of vertices
      such that all workers that can be assigned work are assigned exactly
      on job.
  
      Parameters
      ----------
      costs : cudf.Series
          A dense representation (row major order) of the bipartite
          graph.  Each row represents a worker, each column represents
          a task, cost[i][j] represents the cost of worker i performing
          task j.
  
      num_rows : int
          Number of rows in the matrix
  
      num_columns : int
          Number of columns in the matrix
  
      epsilon : float or double (matching weight type in graph)
          Used for determining when value is close enough to zero to consider 0.
          Defaults (if not specified) to 1e-6 in the C++ code.  Unused for
          integer weight types.
  
      Returns
      -------
      cost : matches costs.dtype
          The cost of the overall assignment
  
      assignment : cudf.Series
          assignment[i] gives the vertex id of the task assigned to the
                      worker i
  
      Examples
      --------
      >>> workers, G, costs = cugraph.utils.create_random_bipartite(5, 5,
      ...                                                           100, float)
      >>> costs_flattened = cudf.Series(costs.flatten())
      >>> cost, assignment = cugraph.dense_hungarian(costs_flattened, 5, 5)
  
      """
  
      return lap_wrapper.dense_hungarian(
          costs, num_rows, num_columns, epsilon
      )
  
label_desc: Use image node_id 2 for calling a global function with example usage: dense_hungarian(costs, num_rows, num_columns, epsilon) and returns: lap_wrapper