def METHOD_NAME(self, x, N=10000, var=0.0001, fit_weights=False, verbose=False):
    (
        acceptances,
        stochastic_rejections,
        pathological_rejections,
        way_off_rejections,
    ) = (0, 0, 0, 0)
    self.fit(x, fit_weights)  # initialize with mle estimates for each model
    curvelen = x.shape[0]
    start = time.time()
    params = self.params.copy()
    weights = self.weights.copy()
    sigma_sq = self.sigma_sq
    self.mcmc_sample_params = []
    zero_likelihood = False
    # sampling loop
    for t in range(N):
        self.mcmc_sample_params.append((params, weights))
        if verbose:
            if t == 1:
                last_power_two = t
            elif t == 2 * last_power_two:
                last_power_two = t
                print(
                    f"Completed {t} Metropolis steps in {time.time() - start} seconds."
                )
        current_log_likelihood = 0
        for j in range(curvelen):
            jth_error = self.predict(j + 1, params=params, weights=weights) - x[j]
            point_likelihood = norm.pdf(jth_error, scale=np.sqrt(sigma_sq))
            if not point_likelihood > 0:
                point_likelihood = 1e-10
                if not zero_likelihood:
                    zero_likelihood = True
                    print("point likelihood was 0")
            current_log_likelihood += np.log(point_likelihood)
        (
            candidate_params,
            candidate_weights,
            candidate_sigma_sq,
        ) = self.perturb_params(params, weights, sigma_sq, var)
        if candidate_sigma_sq <= 0:
            # reject, sigma squared must be positive
            continue
        candidate_log_likelihood = 0
        min_point_likelihood = 1
        for j in range(curvelen):
            jth_error = (
                self.predict(
                    j + 1, params=candidate_params, weights=candidate_weights
                )
                - x[j]
            )
            point_likelihood = norm.pdf(
                jth_error, scale=np.sqrt(candidate_sigma_sq)
            )
            min_point_likelihood = min(min_point_likelihood, point_likelihood)
            if point_likelihood > 0:
                candidate_log_likelihood += np.log(point_likelihood)
        if min_point_likelihood == 0:
            # reject due to vanishing point likelihood
            continue
        acceptance_probability = min(
            1, np.exp(candidate_log_likelihood - current_log_likelihood)
        )
        if self.predict(
            curvelen + 1, params=candidate_params, weights=candidate_weights
        ) > self.predict(1, params=candidate_params, weights=candidate_weights):
            if np.random.random() < acceptance_probability:
                params = candidate_params
                weights = candidate_weights
                sigma_sq = candidate_sigma_sq
                acceptances += 1
    print(
        f"Completed with acceptance rate {acceptances / N} in {time.time() - start} seconds."
    )