docs: def run(self, n_iter=-1, bg=False):
          """ Run the experiment.
  
              :param int n_iter: Number of run iterations, by default will run until the last evaluation step.
              :param bool bg: whether to run in background (using a Thread)
  
          """
          if n_iter == -1:
              if not self.eval_at:
                  raise ValueError('Set n_iter or define evaluate_at.')
  
              n_iter = self.eval_at[-1] + 1
  
          self._running.set()
  
          if bg:
              self._t = threading.Thread(target=lambda: self._run(n_iter))
              self._t.start()
          else:
              self._run(n_iter)