code: def get_next_sample(x, y, min_limit=-np.inf, max_limit=np.inf):
      """Get the next point to try, given the previous samples.
  
      We use [Bergstra2013]_ to compute the point that gives the largest
      Expected improvement (EI) in the optimization function. This model fits 2
      different GMMs - one for points that have loss values in the bottom 15%
      and another for the rest. Then we sample from the former distribution
      and estimate EI as the ratio of the likelihoods of the 2 distributions.
      We pick the point with the best EI among the samples that is also not
      very close to a point we have sampled earlier.
  
      Arguments
      ---------
      x : 1D array
          Samples generated from the distribution so far
  
      y : 1D array
          Loss values at the corresponding samples
  
      min_limit : float, default : -inf
          Minimum limit for the distribution
  
      max_limit : float, default : +inf
          Maximum limit for the distribution
  
      Returns
      -------
      float
          Next value to use for HPO
      """
  
      z = np.array(
          list(zip(x, y)), dtype=np.dtype([("x", float), ("y", float)])
      )
      z = np.sort(z, order="y")
      n = y.shape[0]
      g = int(np.round(np.ceil(0.15 * n)))
      ldata = z[0:g]
      gdata = z[g:n]
      lymin = ldata["y"].min()
      lymax = ldata["y"].max()
      weights = (lymax - ldata["y"]) / (lymax - lymin)
      lx = gmm_1d_distribution(
          ldata["x"],
          min_limit=min_limit,
          max_limit=max_limit,
          weights=weights,
      )
      gx = gmm_1d_distribution(
          gdata["x"], min_limit=min_limit, max_limit=max_limit
      )
  
      samples = lx.get_samples(n=1000)
      ei = lx(samples) / gx(samples)
  
      h = (x.max() - x.min()) / (10 * x.size)
      # TODO
      # assumes prior of x is uniform; should ideally change for other priors
      # d = np.abs(x - samples[ei.argmax()]).min()
      # CDF(x+d/2) - CDF(x-d/2) < 1/(10*x.size) then reject else accept
      s = 0
      while np.abs(x - samples[ei.argmax()]).min() < h:
          ei[ei.argmax()] = 0
          s = s + 1
          if s == samples.size:
              break
      xnext = samples[ei.argmax()]
  
      return xnext
  
file_path: brainiak/brainiak/hyperparamopt/hpo.py
imports: import logging
  import math
  import numpy
  from scipy.special import erf
  import scipy.stats
label_desc: Use image node_id 2 for calling a global function with example usage: get_next_sample(x, y, min_limit, max_limit) and returns: xnext