import torch


def get_dropout_add_func():

    from transformers.models.bloom.modeling_bloom import dropout_add

    def self_dropout_add(self, x: torch.Tensor, residual: torch.Tensor, prob: float, training: bool) -> torch.Tensor:
        return dropout_add(x, residual, prob, training)

    return self_dropout_add


def get_jit_fused_dropout_add_func():

    from colossalai.kernel.jit import bias_dropout_add_fused_inference, bias_dropout_add_fused_train

    def self_dropout_add(self, x: torch.Tensor, residual: torch.Tensor, prob: float, training: bool) -> torch.Tensor:
        bias = torch.zeros_like(x)
        if training:
            return bias_dropout_add_fused_train(x, bias, residual, prob)
        return bias_dropout_add_fused_inference(x, bias, residual, prob)

    return self_dropout_add


def get_jit_fused_gelu_forward_func():

    from colossalai.kernel.jit.bias_gelu import bias_gelu

    def bloom_gelu_forward(x: torch.Tensor, bias: torch.Tensor) -> torch.Tensor:
        return bias_gelu(bias, x)

    return bloom_gelu_forward
