parameters: (self, random_starts=None, **kwargs)
return_statement: return best_point, function_value_list
docstring: Perform multistart optimization with self.optimizer.
  
          .. Note:: comments copied from MultistartOptimizer::MultistartOptimize in gpp_optimization.hpp.
  
          Performs multistart optimization with the specified Optimizer (instance variable) to optimize the specified
          OptimizableInterface (objective function) over the specified DomainInterface. Optimizer behavior is controlled
          by the specified ParameterStruct. See class docs and header docs of this file, section 2c and 3b, iii),
          for more information.
  
          The method allows you to specify what the current best is, so that if optimization cannot beat it, no improvement will be
          reported.  It will otherwise report the overall best improvement (through io_container) as well as the result of every
          individual multistart run if desired (through function_values).
  
          :param random_starts: points from which to multistart ``self.optimizer``; if None, points are chosen randomly
          :type random_starts: array of float64 with shape (num_points, dim) or None
          :return: (best point found, objective function values at the end of each optimization run)
          :rtype: tuple: (array of float64 with shape (self.optimizer.dim), array of float64 with shape (self.num_multistarts))
docstring_summary: Perform multistart optimization with self.optimizer.
docstring_tokens: Perform multistart optimization with self . optimizer .
function: def optimize(self, random_starts=None, **kwargs):
          """Perform multistart optimization with self.optimizer.
  
          .. Note:: comments copied from MultistartOptimizer::MultistartOptimize in gpp_optimization.hpp.
  
          Performs multistart optimization with the specified Optimizer (instance variable) to optimize the specified
          OptimizableInterface (objective function) over the specified DomainInterface. Optimizer behavior is controlled
          by the specified ParameterStruct. See class docs and header docs of this file, section 2c and 3b, iii),
          for more information.
  
          The method allows you to specify what the current best is, so that if optimization cannot beat it, no improvement will be
          reported.  It will otherwise report the overall best improvement (through io_container) as well as the result of every
          individual multistart run if desired (through function_values).
  
          :param random_starts: points from which to multistart ``self.optimizer``; if None, points are chosen randomly
          :type random_starts: array of float64 with shape (num_points, dim) or None
          :return: (best point found, objective function values at the end of each optimization run)
          :rtype: tuple: (array of float64 with shape (self.optimizer.dim), array of float64 with shape (self.num_multistarts))
  
          """
          # TODO(GH-59): Pass the best point, fcn value, etc. in thru an IOContainer-like structure.
          if random_starts is None:
              random_starts = self.optimizer.domain.generate_uniform_random_points_in_domain(self.num_multistarts, None)
  
          best_function_value = -numpy.inf
          best_point = random_starts[0, ...]  # any point will do
          function_value_list = numpy.empty(random_starts.shape[0])
  
          for i, point in enumerate(random_starts):
              self.optimizer.objective_function.current_point = point
              self.optimizer.optimize(**kwargs)
              function_value = self.optimizer.objective_function.compute_objective_function(**kwargs)
              function_value_list[i] = function_value
  
              if function_value > best_function_value:
                  best_function_value = function_value
                  best_point = self.optimizer.objective_function.current_point
  
          return best_point, function_value_list
function_tokens: def optimize ( self , random_starts = None , * * kwargs ) : # TODO(GH-59): Pass the best point, fcn value, etc. in thru an IOContainer-like structure. if random_starts is None : random_starts = self . optimizer . domain . generate_uniform_random_points_in_domain ( self . num_multistarts , None ) best_function_value = - numpy . inf best_point = random_starts [ 0 , ... ] # any point will do function_value_list = numpy . empty ( random_starts . shape [ 0 ] ) for i , point in enumerate ( random_starts ) : self . optimizer . objective_function . current_point = point self . optimizer . optimize ( * * kwargs ) function_value = self . optimizer . objective_function . compute_objective_function ( * * kwargs ) function_value_list [ i ] = function_value if function_value > best_function_value : best_function_value = function_value best_point = self . optimizer . objective_function . current_point return best_point , function_value_list