class_docstr: Defines a set of plots to produce.
  
  This will create plots for the cartesian product of the parameters in this class.
  See :class:`BenchmarkSuite` if you want a union of parameters.
class_docstr_tok: ["Defines","a","set","of","plots","to","produce",".","This","will","create","plots","for","the","cartesian","product","of","the","parameters","in","this","class",".","See",":","class",":","`","BenchmarkSuite","`","if","you","want","a","union","of","parameters","."]
code: def __post_init__(self) -> None:
      def has_unique_values(values: Collection[Any]) -> bool:
          return len(values) == len(set(values))
  
      def assert_unique_names(attr: str) -> None:
          names = [v.name for v in getattr(self, attr)]
          assert has_unique_values(
              names
          ), f"'{attr}' must have unique names. Found: {names}."
  
      assert_unique_names("datasets")
      assert_unique_names("models")
      assert_unique_names("plots")
  
      def assert_unique_values(attr: str) -> None:
          values = getattr(self, attr)
          assert has_unique_values(
              values
          ), f"'{attr}' must have unique values. Found: {values}."
  
      assert_unique_values("do_compile")
      assert_unique_values("do_optimise")
  
      def assert_disjoint_by(attr1: str, attr2: str) -> None:
          values1 = getattr(self, attr1).by
          values2 = getattr(self, attr2).by
          assert not (set(values1) & set(values2)), (
              f"'{attr1}.by' and '{attr2}.by' must be disjoint."
              f" Found: {attr1}.by={values1} and {attr2}.by={values2}."
          )
  
      assert_disjoint_by("file_by", "column_by")
      assert_disjoint_by("file_by", "row_by")
      assert_disjoint_by("column_by", "row_by")
      if self.line_by:
          assert_disjoint_by("file_by", "line_by")
          assert_disjoint_by("column_by", "line_by")
          assert_disjoint_by("row_by", "line_by")
  
      def assert_grouping_by(by: GroupingKey) -> None:
          assert (
              (by in self.file_by.by)
              or (by in self.column_by.by)
              or (by in self.row_by.by)
          ), (
              f"Must group by '{by}' above the 'line' level. Found:"
              f" file_by={self.file_by.by},"
              f" column_by={self.column_by.by},"
              f" row_by={self.row_by.by}."
          )
  
      assert_grouping_by(GroupingKey.METRIC)
      assert_grouping_by(GroupingKey.PLOTTER)
  
imports: from dataclasses import dataclass
  from typing import Any, Collection, Dict, List, Optional, Sequence, Set, Tuple
  import pandas
  from benchmark.dataset_api import DatasetFactory
  from benchmark.grouping import GroupingKey, GroupingSpec
  from benchmark.model_api import ModelFactory
  from benchmark.plotter_api import Plotter
  from benchmark.registry import Named, Registry
label_desc: Use image node_id 1 for calling the BenchmarkSet obj's underlying member method code with example usage: obj.__post_init__() and returns: unknown