def METHOD_NAME(
    self, ray_bundle, implicit_functions, prev_stage, evaluation_mode
):
    density_noise_std = (
        self.density_noise_std_train
        if evaluation_mode == EvaluationMode.TRAINING
        else 0.0
    )
    ray_deltas = (
        None if ray_bundle.bins is None else torch.diff(ray_bundle.bins, dim=-1)
    )
    output = self.raymarcher(
        *implicit_functions[0](ray_bundle=ray_bundle),
        ray_lengths=ray_bundle.lengths,
        ray_deltas=ray_deltas,
        density_noise_std=density_noise_std,
    )
    output.prev_stage = prev_stage
    weights = output.weights
    if not self.return_weights:
        output.weights = None
    # we may need to make a recursive call
    if len(implicit_functions) > 1:
        fine_ray_bundle = self._refiners[evaluation_mode](ray_bundle, weights)
        output = self.METHOD_NAME(
            fine_ray_bundle,
            implicit_functions[1:],
            output,
            evaluation_mode,
        )
    return output