def METHOD_NAME(self, start, p0, step_size: float) -> HMCStepData:
    n_steps = max(1, int(self.path_length / step_size))
    n_steps = min(self.max_steps, n_steps)
    energy_change = np.inf
    state = start
    last = state
    div_info = None
    try:
        for _ in range(n_steps):
            last = state
            state = self.integrator.step(step_size, state)
    except IntegrationError as e:
        div_info = DivergenceInfo("Integration failed.", e, last, None)
    else:
        if not np.isfinite(state.energy):
            div_info = DivergenceInfo("Divergence encountered, bad energy.", None, last, state)
        energy_change = state.energy - start.energy
        if np.isnan(energy_change):
            energy_change = np.inf
        if np.abs(energy_change) > self.Emax:
            div_info = DivergenceInfo(
                f"Divergence encountered, energy change larger than {self.Emax}.",
                None,
                last,
                state,
            )
    accept_stat = min(1, np.exp(-energy_change))
    if div_info is not None or np.random.rand() >= accept_stat:
        end = start
        accepted = False
    else:
        end = state
        accepted = True
    stats: dict[str, Any] = {
        "path_length": self.path_length,
        "n_steps": n_steps,
        "accept": accept_stat,
        "energy_error": energy_change,
        "energy": state.energy,
        "accepted": accepted,
        "model_logp": state.model_logp,
    }
    # Retrieve State q and p data from respective RaveledVars
    end = State(
        end.q.data,
        end.p.data,
        end.v,
        end.q_grad,
        end.energy,
        end.model_logp,
        end.index_in_trajectory,
    )
    stats.update(self.potential.stats())
    return HMCStepData(end, accept_stat, div_info, stats)