class_docstr: Abstract implementation of an intensifier supporting multi-fidelity, multi-objective, and multi-threading.
  The abstract intensifier keeps track of the incumbent, which is updated everytime the runhistory changes.
  
  Parameters
  ----------
  n_seeds : int | None, defaults to None
      How many seeds to use for each instance. It is used in the abstract intensifier to determine validation trials.
  max_config_calls : int, defaults to None
      Maximum number of configuration evaluations. Basically, how many instance-seed keys should be max evaluated
      for a configuration. It is used in the abstract intensifier to determine validation trials.
  max_incumbents : int, defaults to 10
      How many incumbents to keep track of in the case of multi-objective.
  seed : int, defaults to None
      Internal seed used for random events like shuffle seeds.
class_docstr_tok: ["Abstract","implementation","of","an","intensifier","supporting","multi-fidelity",",","multi-objective",",","and","multi-threading",".","The","abstract","intensifier","keeps","track","of","the","incumbent",",","which","is","updated","everytime","the","runhistory","changes",".","Parameters","--","--","--","--","--","n_seeds",":","int","|","None",",","defaults","to","None","How","many","seeds","to","use","for","each","instance",".","It","is","used","in","the","abstract","intensifier","to","determine","validation","trials",".","max_config_calls",":","int",",","defaults","to","None","Maximum","number","of","configuration","evaluations",".","Basically",",","how","many","instance-seed","keys","should","be","max","evaluated","for","a","configuration",".","It","is","used","in","the","abstract","intensifier","to","determine","validation","trials",".","max_incumbents",":","int",",","defaults","to","10","How","many","incumbents","to","keep","track","of","in","the","case","of","multi-objective",".","seed",":","int",",","defaults","to","None","Internal","seed","used","for","random","events","like","shuffle","seeds","."]
docstr: Fills ``self._tf_seeds`` and ``self._tf_instances``. Moreover, the incumbents are updated.
code: def __post_init__(self) -> None:
      """Fills ``self._tf_seeds`` and ``self._tf_instances``. Moreover, the incumbents are updated."""
      rh = self.runhistory
  
      # Validate runhistory: Are seeds/instances/budgets used?
      # Add seed/instance/budget to the cache
      for k in rh.keys():
          if self.uses_seeds:
              if k.seed is None:
                  raise ValueError(
                      "Trial contains no seed information but intensifier expects seeds to be used."
                  )
  
              if k.seed not in self._tf_seeds:
                  self._tf_seeds.append(k.seed)
  
          if self.uses_instances:
              if (
                  self._scenario.instances is None
                  and k.instance is not None
              ):
                  raise ValueError(
                      "Scenario does not specify any instances but found instance information in runhistory."
                  )
  
              if (
                  self._scenario.instances is not None
                  and k.instance not in self._scenario.instances
              ):
                  raise ValueError(
                      "Instance information in runhistory is not part of the defined instances in scenario."
                  )
  
              if k.instance not in self._tf_instances:
                  self._tf_instances.append(k.instance)
  
          if self.uses_budgets:
              if k.budget is None:
                  raise ValueError(
                      "Trial contains no budget information but intensifier expects budgets to be used."
                  )
  
              if k.budget not in self._tf_budgets:
                  self._tf_budgets.append(k.budget)
  
      # Add all other instances to ``_tf_instances``
      # Behind idea: Prioritize instances that are found in the runhistory
      if (instances := self._scenario.instances) is not None:
          for inst in instances:
              if inst not in self._tf_instances:
                  self._tf_instances.append(inst)
  
      if len(self._tf_instances) == 0:
          self._tf_instances = [None]
  
      if len(self._tf_budgets) == 0:
          self._tf_budgets = [None]
  
      # Update our incumbents here
      for config in rh.get_configs():
          self.update_incumbents(config)
  
imports: from __future__ import annotations
  from abc import abstractmethod
  from typing import Any, Callable, Iterator
  import dataclasses
  import json
  from collections import defaultdict
  from pathlib import Path
  import numpy
  from ConfigSpace import Configuration
  import smac
  from smac.callback.callback import Callback
  from smac.constants import MAXINT
  from smac.main.config_selector import ConfigSelector
  from smac.runhistory import TrialInfo
  from smac.runhistory.dataclasses import InstanceSeedBudgetKey, InstanceSeedKey, TrajectoryItem, TrialValue
  from smac.runhistory.runhistory import RunHistory
  from smac.scenario import Scenario
  from smac.utils.configspace import get_config_hash, print_config_changes
  from smac.utils.logging import get_logger
  from smac.utils.pareto_front import calculate_pareto_front, sort_by_crowding_distance
label_desc: Use image node_id 9 for calling the AbstractIntensifier obj's underlying member method code with example usage: obj.__post_init__() without return types