class_docstr: Generates a report based on the metrics and stages in the pipeline.
  
  Each ReportGenerator corresponds to one aggregation which contains an
  ordered set of stages. It collects information about the DP aggregation
  and generates a report.
docstr: Constructs a report based on stages and metrics.
docstr_tok: ["Constructs","a","report","based","on","stages","and","metrics","."]
code: def report(self) -> str:
      """Constructs a report based on stages and metrics."""
      if not self._params_str:
          return ""
      result = [f"DPEngine method: {self._method_name}"]
      result.append(self._params_str)
      result.append("Computation graph:")
      for i, stage_str in enumerate(self._stages):
          if hasattr(stage_str, "__call__"):
              result.append(f" {i+1}. {stage_str()}")
          else:
              result.append(f" {i+1}. {stage_str}")
      return "\n".join(result)
  
file_path: pipelinedp/pipeline_dp/report_generator.py
imports: from pipeline_dp import aggregate_params
  from typing import Optional, Union, Callable
label_desc: Use image node_id 3 for calling the ReportGenerator obj's underlying member method code with example usage: obj.report() and returns: str, str