class_docstr: Represents a benchmark "run", which can be executed by calling the run()
  method, and results are saved as BenchmarkedResult instances in the results
  list member.
docstr: Run and time the graph construction step, then run and time each algo.
code: def run(self):
      """
      Run and time the graph construction step, then run and time each algo.
      """
      self.results = []
  
      self.__log(f"running {self.construct_graph.name}...", end="")
      result = self.construct_graph(
          self.input_dataframe, *self.construct_graph_func_args
      )
      self.__log("done.")
      G = result.retval
      self.results.append(result)
      #
      # Algos with transposed=True : PageRank, Katz.
      # Algos with transposed=False: BFS, SSSP, Louvain, HITS,
      # Neighborhood_sampling.
      #
      for i in range(len(self.algos)):
          # set transpose=True when renumbering
          if self.algos[i][0].name in ["pagerank", "katz"]:
              if self.algos[i][0].name == "katz":
                  if (
                      self.construct_graph.name
                      == "from_dask_cudf_edgelist"
                  ):
                      # compute out_degree before renumbering because out_degree
                      # has transpose=False
                      degree_max = G.degree()["degree"].max().compute()
                      katz_alpha = 1 / (degree_max)
                      self.algos[i][1]["alpha"] = katz_alpha
                  elif (
                      self.construct_graph.name == "from_cudf_edgelist"
                  ):
                      degree_max = G.degree()["degree"].max()
                      katz_alpha = 1 / (degree_max)
                      self.algos[i][1]["alpha"] = katz_alpha
                  if hasattr(G, "compute_renumber_edge_list"):
                      G.compute_renumber_edge_list(transposed=True)
              else:
                  # FIXME: Pagerank still follows the old path. Update this once it
                  # follows the pylibcugraph/C path
                  if hasattr(G, "compute_renumber_edge_list"):
                      G.compute_renumber_edge_list(transposed=True)
          else:  # set transpose=False when renumbering
              self.__log(
                  "running compute_renumber_edge_list...", end=""
              )
              if hasattr(G, "compute_renumber_edge_list"):
                  if self.algos[i][0].name in ["wcc", "louvain"]:
                      # FIXME: Pagerank and Louvain still follow the old path.
                      # Update this once it follows the pylibcugraph/C path
                      G.compute_renumber_edge_list(transposed=False)
                  else:
                      G.compute_renumber_edge_list(transposed=False)
              self.__log("done.")
      # FIXME: need to handle individual algo args
      for (algo, params), validator in zip(self.algos, self.validators):
          self.__log(f"running {algo.name} (warmup)...", end="")
          algo(G, **params)
          self.__log("done.")
          self.__log(f"running {algo.name}...", end="")
          result = algo(G, **params)
          self.__log("done.")
  
          if validator:
              result.validator_result = validator(result.retval, G)
  
          self.results.append(result)
          # Reclaim memory since computed algo result is no longer needed
          result.retval = None
  
      return False not in [r.validator_result for r in self.results]
  
file_path: cugraph/benchmarks/cugraph/standalone/benchmark.py
imports: import sys
  import time
  from functools import wraps
label_desc: Use image node_id 3 for calling the BenchmarkRun obj's underlying member method code with example usage: obj.run() and returns: unknown