def METHOD_NAME(param_in,
                 mom_in,
                 mom_delta_in,
                 grad, lr,
                 epsilon,
                 decay,
                 using_fp16=False):
    param_in_f32 = param_in
    mom_in_f32 = mom_in
    mom_delta_in_f32 = mom_delta_in
    if(using_fp16):
        param_in_f32 = param_in.astype(np.float32)
        mom_in_f32 = mom_in.astype(np.float32)
        mom_delta_in_f32 = mom_delta_in.astype(np.float32)
    mom_out = decay * mom_in_f32 + (1.0 - decay) * grad * grad
    new_grad = (np.sqrt(mom_delta_in_f32 + epsilon) /
                np.sqrt(mom_out + epsilon)) * grad
    param_out = param_in_f32 + lr * new_grad
    mom_delta_out = decay * mom_delta_in_f32 + (1.0 - decay
                                                ) * new_grad * new_grad
    if(using_fp16):
        return (param_out.astype(np.float16), mom_out.astype(np.float16),
                mom_delta_out.astype(np.float16))
    else:
        return (param_out.astype(np.float32), mom_out.astype(np.float32),
                mom_delta_out.astype(np.float32))