def METHOD_NAME(self, n_particles, n_iterations, pool, verbose):
    """Executes the PSO."""
    low_bounds, high_bounds = self._param_class.bounds(
        self._re_optimize, self._re_optimize_scale
    )
    pso = ParticleSwarmOptimizer(
        self.fast_rayshooting.logL,
        low_bounds,
        high_bounds,
        n_particles,
        pool,
        args=[self._tol_source],
    )
    best, info = pso.optimize(
        n_iterations, verbose, early_stop_tolerance=self._pso_convergence_mean
    )
    if verbose:
        print("PSO done... ")
        print(
            "source plane chi^2: ",
            self.fast_rayshooting.source_plane_chi_square(best),
        )
        print("total chi^2: ", self.fast_rayshooting.chi_square(best))
    kwargs = self._param_class.args_to_kwargs(best)
    return kwargs