code: def test_multi_parameters(self):
      # Arrange
      aggregate_params = pipeline_dp.AggregateParams(
          noise_kind=pipeline_dp.NoiseKind.GAUSSIAN,
          metrics=[pipeline_dp.Metrics.COUNT],
          max_partitions_contributed=1,
          max_contributions_per_partition=1,
      )
  
      multi_param = analysis.MultiParameterConfiguration(
          max_partitions_contributed=[1, 2],
          max_contributions_per_partition=[1, 2],
          partition_selection_strategy=[
              pipeline_dp.PartitionSelectionStrategy.TRUNCATED_GEOMETRIC,
              pipeline_dp.PartitionSelectionStrategy.GAUSSIAN_THRESHOLDING,
          ],
      )
  
      # Input collection has 1 privacy id, which contributes to 2 partitions
      # 1 and 2 times correspondingly.
      input = [(0, "pk0"), (0, "pk1"), (0, "pk1")]
      data_extractors = pipeline_dp.DataExtractors(
          privacy_id_extractor=lambda x: x[0],
          partition_extractor=lambda x: x[1],
          value_extractor=lambda x: 0,
      )
  
      output, _ = analysis.perform_utility_analysis(
          col=input,
          backend=pipeline_dp.LocalBackend(),
          options=analysis.UtilityAnalysisOptions(
              epsilon=2,
              delta=1e-10,
              aggregate_params=aggregate_params,
              multi_param_configuration=multi_param,
          ),
          data_extractors=data_extractors,
      )
  
      utility_reports = list(output)
  
      # Assert
      self.assertLen(
          utility_reports, 2
      )  # one report per each configuration.
  
      # Check the parameter configuration
      expected_noise_std = [5.9765625, 16.904271487740903]
      expected_l0_error = [-0.5, 0]
      for i_configuration, report in enumerate(utility_reports):
          self.assertEqual(report.configuration_index, i_configuration)
          self.assertFalse(report.partitions_info.public_partitions)
          self.assertEqual(
              report.partitions_info.num_dataset_partitions, 2
          )
          self.assertEqual(
              report.partitions_info.num_dataset_partitions, 2
          )
          self.assertEqual(
              report.partitions_info.strategy,
              multi_param.partition_selection_strategy[i_configuration],
          )
          self.assertLen(report.metric_errors, 1)  # metrics for COUNT
          errors = report.metric_errors[0]
          self.assertEqual(errors.metric, pipeline_dp.Metrics.COUNT)
          self.assertEqual(
              errors.noise_std, expected_noise_std[i_configuration]
          )
          self.assertEqual(
              errors.absolute_error.bounding_errors.l0.mean,
              expected_l0_error[i_configuration],
          )
  
imports: import copy
  from absl.testing import absltest
  from absl.testing import parameterized
  import pipeline_dp
  import analysis
  from analysis import metrics
  from analysis import utility_analysis
  from analysis.tests import common
  from typing import Optional
label_desc: Use image node_id 6 for calling the UtilityAnalysis obj's underlying member method code with example usage: obj.test_multi_parameters() without return types