code: def step(self):
          
          logy = self.loglike - rexponential(1)
  
          L = self.stochastic.value - runiform(0, self.w)
          R = L + self.w
  
          if self.doubling:
              # Doubling procedure
              K = self.m
              while (K and (logy < self.fll(L) or logy < self.fll(R))):
                  if random() < 0.5:
                      L -= R - L
                  else:
                      R += R - L
                  K -= 1
          else:
              # Stepping out procedure
              J = np.floor(runiform(0, self.m))
              K = (self.m - 1) - J
              while(J > 0 and logy < self.fll(L)):
                  L -= self.w
                  J -= 1
              while(K > 0 and logy < self.fll(R)):
                  R += self.w
                  K -= 1
  
          # Shrinkage procedure
          self.stochastic.value = runiform(L, R)
          try:
              logy_new = self.loglike
          except ZeroProbability:
              logy_new = -np.infty
          while(logy_new < logy):
              if (self.stochastic.value < self.stochastic.last_value):
                  L = float(self.stochastic.value)
              else:
                  R = float(self.stochastic.value)
              self.stochastic.revert()
              self.stochastic.value = runiform(L, R)
              try:
                  logy_new = self.loglike
              except ZeroProbability:
                  logy_new = -np.infty
docs: Slice step method
  
          From Neal 2003 (doi:10.1214/aos/1056562461)