code: def test_aggregate_report(self):
      col = [[1], [2], [3], [3]]
      data_extractor = pipeline_dp.DataExtractors(
          privacy_id_extractor=lambda x: f"pid{x}",
          partition_extractor=lambda x: f"pk{x}",
          value_extractor=lambda x: x,
      )
      params1 = pipeline_dp.AggregateParams(
          noise_kind=pipeline_dp.NoiseKind.GAUSSIAN,
          max_partitions_contributed=3,
          max_contributions_per_partition=2,
          min_value=1,
          max_value=5,
          metrics=[
              pipeline_dp.Metrics.PRIVACY_ID_COUNT,
              pipeline_dp.Metrics.COUNT,
              pipeline_dp.Metrics.MEAN,
          ],
      )
      params2 = pipeline_dp.AggregateParams(
          noise_kind=pipeline_dp.NoiseKind.GAUSSIAN,
          max_partitions_contributed=1,
          max_contributions_per_partition=3,
          min_value=2,
          max_value=10,
          metrics=[pipeline_dp.Metrics.SUM, pipeline_dp.Metrics.MEAN],
      )
  
      select_partitions_params = pipeline_dp.SelectPartitionsParams(
          max_partitions_contributed=2
      )
  
      budget_accountant = NaiveBudgetAccountant(
          total_epsilon=1, total_delta=1e-10
      )
      engine = pipeline_dp.DPEngine(
          budget_accountant=budget_accountant,
          backend=pipeline_dp.LocalBackend(),
      )
      engine.aggregate(col, params1, data_extractor)
      engine.aggregate(col, params2, data_extractor, list(range(1, 40)))
      engine.select_partitions(
          col, select_partitions_params, data_extractor
      )
      self.assertEqual(
          3, len(engine._report_generators)
      )  # pylint: disable=protected-access
      budget_accountant.compute_budgets()
      self._check_string_contains_strings(
          engine._report_generators[0].report(),
          [
              "DPEngine method: aggregate",
              "metrics=['PRIVACY_ID_COUNT', 'COUNT', 'MEAN']",
              " noise_kind=gaussian",
              "max_value=5",
              "Partition selection: private partitions",
              "Cross-partition contribution bounding: for each privacy id "
              "randomly select max(actual_partition_contributed, 3)",
              "Private Partition selection: using Truncated Geometric "
              "method with (eps=",
          ],
      )
  
      self._check_string_contains_strings(
          engine._report_generators[1].report(),
          [
              "metrics=['SUM', 'MEAN']",
              " noise_kind=gaussian",
              "max_value=5",
              "Partition selection: public partitions",
              "Per-partition contribution bounding: for each privacy_id and "
              "eachpartition, randomly select max("
              "actual_contributions_per_partition, 3)",
              "Adding empty partitions for public partitions that are "
              "missing in data",
          ],
      )
  
      self._check_string_contains_strings(
          engine._report_generators[2].report(),
          [
              "DPEngine method: select_partitions",
              " budget_weight=1",
              "max_partitions_contributed=2",
              "Private Partition selection: using Truncated Geometric "
              "method with",
          ],
      )
  
imports: import sys
  import unittest
  from typing import List, Optional, Tuple
  from unittest.mock import patch
  import numpy
  import apache_beam
  import apache_beam.testing.test_pipeline
  import apache_beam.testing.util
  import pydp.algorithms.partition_selection
  from absl.testing import absltest
  from absl.testing import parameterized
  import pipeline_dp
  from pipeline_dp import aggregate_params
  from pipeline_dp import budget_accounting
  from pipeline_dp import dp_computations
  from pipeline_dp.budget_accounting import NaiveBudgetAccountant
  from pipeline_dp.pipeline_backend import PipelineBackend
  from pipeline_dp.pipeline_functions import collect_to_container
  from pipeline_dp.report_generator import ReportGenerator
label_desc: Use image node_id 16 for calling the DpEngineTest obj's underlying member method code with example usage: obj.test_aggregate_report() without return types