code: def on_tell_end(
      self,
      smbo: smac.main.smbo.SMBO,
      info: TrialInfo,
      value: TrialValue,
  ) -> bool | None:
      self.trials_counter += 1
      if self.trials_counter % 10 == 0:
          print(f"Evaluated {self.trials_counter} trials so far.")
  
          incumbent = smbo.intensifier.get_incumbent()
          assert incumbent is not None
          print(f"Current incumbent: {incumbent.get_dictionary()}")
          print(
              f"Current incumbent value: {smbo.runhistory.get_cost(incumbent)}"
          )
          print("")
  
      if self.trials_counter == 50:
          print(
              f"We just triggered to stop the optimization after {smbo.runhistory.finished} finished trials."
          )
          return False
  
      return None
  
file_path: SMAC3/examples/1_basics/4_callback.py
imports: from __future__ import annotations
  from ConfigSpace import Configuration, ConfigurationSpace, Float
  import smac
  from smac import Callback
  from smac import HyperparameterOptimizationFacade
  from smac import Scenario
  from smac.runhistory import TrialInfo, TrialValue
label_desc: Use image node_id 3 for calling the CustomCallback obj's underlying member method code with example usage: obj.on_tell_end(smbo, info, value) and returns: None, False