docs: def optimize(self, objective_fct, iterations=None, min_iterations=1,
                   args=(), verb_disp=None, logger=None, call_back=None):
          """find minimizer of `objective_fct`.
  
          CAVEAT: the return value for `optimize` has changed to ``self``.
  
          Arguments
          ---------
  
              `objective_fct`
                  function be to minimized
              `iterations`
                  number of (maximal) iterations, while ``not self.stop()``
              `min_iterations`
                  minimal number of iterations, even if ``not self.stop()``
              `args`
                  arguments passed to `objective_fct`
              `verb_disp`
                  print to screen every `verb_disp` iteration, if ``None``
                  the value from ``self.logger`` is "inherited", if
                  available.
              ``logger``
                  a `BaseDataLogger` instance, which must be compatible
                  with the type of ``self``.
              ``call_back``
                  call back function called like ``call_back(self)`` or
                  a list of call back functions.
  
          ``return self``, that is, the `OOOptimizer` instance.
  
          Example
          -------
          >>> import cma
          >>> es = cma.CMAEvolutionStrategy(7 * [0.1], 0.5
          ...              ).optimize(cma.fcts.rosen, verb_disp=100)
          (4_w,9)-CMA-ES (mu_w=2.8,w_1=49%) in dimension 7 (seed=630721393)
          Iterat #Fevals   function value    axis ratio  sigma   minstd maxstd min:sec
              1       9 3.163954777181882e+01 1.0e+00 4.12e-01  4e-01  4e-01 0:0.0
              2      18 3.299006223906629e+01 1.0e+00 3.60e-01  3e-01  4e-01 0:0.0
              3      27 1.389129389866704e+01 1.1e+00 3.18e-01  3e-01  3e-01 0:0.0
            100     900 2.494847340045985e+00 8.6e+00 5.03e-02  2e-02  5e-02 0:0.3
            200    1800 3.428234862999135e-01 1.7e+01 3.77e-02  6e-03  3e-02 0:0.5
            300    2700 3.216640032470860e-04 5.6e+01 6.62e-03  4e-04  9e-03 0:0.8
            400    3600 6.155215286199821e-12 6.6e+01 7.44e-06  1e-07  4e-06 0:1.1
            438    3942 1.187372505161762e-14 6.0e+01 3.27e-07  4e-09  9e-08 0:1.2
            438    3942 1.187372505161762e-14 6.0e+01 3.27e-07  4e-09  9e-08 0:1.2
          ('termination by', {'tolfun': 1e-11})
          ('best f-value =', 1.1189867885201275e-14)
          ('solution =', array([ 1.        ,  1.        ,  1.        ,  0.99999999,  0.99999998,
                  0.99999996,  0.99999992]))
          >>> print(es.result()[0])
          array([ 1.          1.          1.          0.99999999  0.99999998  0.99999996
            0.99999992])
  
          """
          assert iterations is None or min_iterations <= iterations
          if not hasattr(self, 'logger'):
              self.logger = logger
          logger = self.logger = logger or self.logger
          if not isinstance(call_back, list):
              call_back = [call_back]
  
          citer = 0
          while not self.stop() or citer < min_iterations:
              if iterations is not None and citer >= iterations:
                  return self.result()
              citer += 1
  
              X = self.ask()  # deliver candidate solutions
              fitvals = [objective_fct(x, *args) for x in X]
              self.tell(X, fitvals)  # all the work is done here
              self.disp(verb_disp)
              for f in call_back:
                  f is None or f(self)
              logger.add(self) if logger else None
  
          # signal logger that we left the loop
          # TODO: this is very ugly, because it assumes modulo keyword
          #       argument *and* modulo attribute to be available
          try:
              logger.add(self, modulo=bool(logger.modulo)) if logger else None
          except TypeError:
              print('  suppressing the final call of the logger in ' +
                    'OOOptimizer.optimize (modulo keyword parameter not ' +
                    'available)')
          except AttributeError:
              print('  suppressing the final call of the logger in ' +
                    'OOOptimizer.optimize (modulo attribute not ' +
                    'available)')
          if verb_disp:
              self.disp(1)
          if verb_disp in (1, True):
              print('termination by', self.stop())
              print('best f-value =', self.result()[1])
              print('solution =', self.result()[0])
  
          return self