



import math
from typing import Callable, List, Optional, Union

import numpy as np
import PIL
import torch
from PIL import Image
from transformers import CLIPTextModel, CLIPTokenizer

from diffusers.models import AutoencoderKL, UNetaDConditionModel
from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_upscale import StableDiffusionUpscalePipeline
from diffusers.schedulers import DDIMScheduler, DDPMScheduler, LMSDiscreteScheduler, PNDMScheduler




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase=[]		)       ->  Optional[int]:



    """simple docstring"""






    A :       Optional[int]          =   size[0] - overlap_pixels * 2
    A :       Dict          =   size[1] - overlap_pixels * 2
    for letter in ["l", "r"]:
        if letter in remove_borders:
            size_x += overlap_pixels
    for letter in ["t", "b"]:
        if letter in remove_borders:
            size_y += overlap_pixels
    A :       str          =   np.ones((size_y, size_x)      ,     dtype=np.uinta		) * 255
    A :       Any          =   np.pad(_lowerCAmelCase      ,     mode="""linear_ramp"""      ,     pad_width=_lowerCAmelCase      ,     end_values=0		)

    if "l" in remove_borders:
        A :       int          =   mask[:, overlap_pixels : mask.shape[1]]
    if "r" in remove_borders:
        A :       Tuple          =   mask[:, 0 : mask.shape[1] - overlap_pixels]
    if "t" in remove_borders:
        A :       List[Any]          =   mask[overlap_pixels : mask.shape[0], :]
    if "b" in remove_borders:
        A :       Optional[int]          =   mask[0 : mask.shape[0] - overlap_pixels, :]
    return mask




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  str:



    """simple docstring"""






    return max(_lowerCAmelCase      ,     min(_lowerCAmelCase      ,     _lowerCAmelCase		)		)




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  str:



    """simple docstring"""






    return (
        clamp(rect[0]      ,     min[0]      ,     max[0]		),
        clamp(rect[1]      ,     min[1]      ,     max[1]		),
        clamp(rect[2]      ,     min[0]      ,     max[0]		),
        clamp(rect[3]      ,     min[1]      ,     max[1]		),
    )




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  str:



    """simple docstring"""






    A :       int          =   list(_lowerCAmelCase		)
    rect[0] -= overlap
    rect[1] -= overlap
    rect[2] += overlap
    rect[3] += overlap
    A :       List[Any]          =   clamp_rect(_lowerCAmelCase      ,     [0, 0]      ,     [image_size[0], image_size[1]]		)
    return rect




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  Any:



    """simple docstring"""






    A :       int          =   Image.new("""RGB"""      ,     (tile.size[0] + original_slice, tile.size[1])		)
    result.paste(
        original_image.resize((tile.size[0], tile.size[1])      ,     Image.BICUBIC		).crop(
            (slice_x, 0, slice_x + original_slice, tile.size[1])		)      ,     (0, 0)      ,     )
    result.paste(_lowerCAmelCase      ,     (original_slice, 0)		)
    return result




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  List[Any]:



    """simple docstring"""






    A :       int          =   (original_image_slice * 4, 0, tile.size[0], tile.size[1])
    A :       str          =   tile.crop(_lowerCAmelCase		)
    return tile




def 	__UpperCamelCase	(  _lowerCAmelCase      ,     _lowerCAmelCase		)       ->  List[Any]:



    """simple docstring"""






    A :       List[str]          =   n % d
    return n - divisor






class SCREAMING_SNAKE_CASE__     (		SCREAMING_SNAKE_CASE__    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__ = 350,		):
        super().__init__(
            vae=lowerCamelCase__,		text_encoder=lowerCamelCase__,		tokenizer=lowerCamelCase__,		unet=lowerCamelCase__,		low_res_scheduler=lowerCamelCase__,		scheduler=lowerCamelCase__,		max_noise_level=lowerCamelCase__,		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		**lowerCamelCase__		):
        torch.manual_seed(0		)
        A :       List[Any]          =   (
            min(image.size[0] - (tile_size + original_image_slice),		x * tile_size		),
            min(image.size[1] - (tile_size + original_image_slice),		y * tile_size		),
            min(image.size[0],		(x + 1) * tile_size		),
            min(image.size[1],		(y + 1) * tile_size		),
        )
        A :       str          =   add_overlap_rect(lowerCamelCase__,		lowerCamelCase__,		image.size		)
        A :       Optional[Any]          =   image.crop(lowerCamelCase__		)
        A :       int          =   ((crop_rect[0] + ((crop_rect[2] - crop_rect[0]) / 2)) / image.size[0]) * tile.size[0]
        A :       Any          =   translated_slice_x - (original_image_slice / 2)
        A :       str          =   max(0,		lowerCamelCase__		)
        A :       Optional[Any]          =   squeeze_tile(lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__		)
        A :       Any          =   to_input.size
        A :       Any          =   to_input.resize((tile_size, tile_size),		Image.BICUBIC		)
        A :       Optional[int]          =   super(lowerCamelCase__,		self		).__call__(image=lowerCamelCase__,		**lowerCamelCase__		).images[0]
        A :       Dict          =   upscaled_tile.resize((orig_input_size[0] * 4, orig_input_size[1] * 4),		Image.BICUBIC		)
        A :       Tuple          =   unsqueeze_tile(lowerCamelCase__,		lowerCamelCase__		)
        A :       Union[str, Any]          =   upscaled_tile.resize((tile.size[0] * 4, tile.size[1] * 4),		Image.BICUBIC		)
        A :       Dict          =   []
        if x == 0:
            remove_borders.append("""l"""		)
        elif crop_rect[2] == image.size[0]:
            remove_borders.append("""r"""		)
        if y == 0:
            remove_borders.append("""t"""		)
        elif crop_rect[3] == image.size[1]:
            remove_borders.append("""b"""		)
        A :       Union[str, Any]          =   Image.fromarray(
            make_transparency_mask(
                (upscaled_tile.size[0], upscaled_tile.size[1]),		tile_border * 4,		remove_borders=lowerCamelCase__		),		mode="""L""",		)
        final_image.paste(
            lowerCamelCase__,		(crop_rect_with_overlap[0] * 4, crop_rect_with_overlap[1] * 4),		lowerCamelCase__		)






    @torch.no_grad()
    def __call__(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__ = 75,		lowerCamelCase__ = 9.0,		lowerCamelCase__ = 50,		lowerCamelCase__ = None,		lowerCamelCase__ = 1,		lowerCamelCase__ = 0.0,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = 1,		lowerCamelCase__ = 128,		lowerCamelCase__ = 32,		lowerCamelCase__ = 32,		):
        A :       List[str]          =   Image.new("""RGB""",		(image.size[0] * 4, image.size[1] * 4)		)
        A :       Optional[Any]          =   math.ceil(image.size[0] / tile_size		)
        A :       Any          =   math.ceil(image.size[1] / tile_size		)
        A :       Union[str, Any]          =   tcx * tcy
        A :       Optional[int]          =   0
        for y in range(lowerCamelCase__		):
            for x in range(lowerCamelCase__		):
                self._process_tile(
                    lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		prompt=lowerCamelCase__,		num_inference_steps=lowerCamelCase__,		guidance_scale=lowerCamelCase__,		noise_level=lowerCamelCase__,		negative_prompt=lowerCamelCase__,		num_images_per_prompt=lowerCamelCase__,		eta=lowerCamelCase__,		generator=lowerCamelCase__,		latents=lowerCamelCase__,		)
                current_count += 1
                if callback is not None:
                    callback({"""progress""": current_count / total_tile_count, """image""": final_image}		)
        return final_image




def 	__UpperCamelCase	(  )       ->  List[Any]:



    """simple docstring"""






    A :       List[Any]          =   """stabilityai/stable-diffusion-x4-upscaler"""
    A :       Any          =   StableDiffusionTiledUpscalePipeline.from_pretrained(_lowerCAmelCase      ,     revision="""fp16"""      ,     torch_dtype=torch.floataa		)
    A :       Optional[Any]          =   pipe.to("""cuda"""		)
    A :       int          =   Image.open("""../../docs/source/imgs/diffusers_library.jpg"""		)

    def callback(_lowerCAmelCase		):
        print(f'''progress: {obj["progress"]:.4f}'''		)
        obj["image"].save("""diffusers_library_progress.jpg"""		)

    A :       Any          =   pipe(image=_lowerCAmelCase      ,     prompt="""Black font, white background, vector"""      ,     noise_level=40      ,     callback=_lowerCAmelCase		)
    final_image.save("""diffusers_library.jpg"""		)


if __name__ == "__main__":
     main()







from typing import Any, Dict, Optional

import torch
import torch.nn.functional as F
from torch import nn

from ..utils import maybe_allow_in_graph
from .activations import get_activation
from .attention_processor import Attention
from .embeddings import CombinedTimestepLabelEmbeddings






@maybe_allow_in_graph
class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__=0.0,		lowerCamelCase__ = None,		lowerCamelCase__ = "geglu",		lowerCamelCase__ = None,		lowerCamelCase__ = False,		lowerCamelCase__ = False,		lowerCamelCase__ = False,		lowerCamelCase__ = False,		lowerCamelCase__ = True,		lowerCamelCase__ = "layer_norm",		lowerCamelCase__ = False,		):
        super().__init__()
        A :       Dict          =   only_cross_attention

        A :       Tuple          =   (num_embeds_ada_norm is not None) and norm_type == """ada_norm_zero"""
        A :       Union[str, Any]          =   (num_embeds_ada_norm is not None) and norm_type == """ada_norm"""

        if norm_type in ("ada_norm", "ada_norm_zero") and num_embeds_ada_norm is None:
            raise ValueError(
                f'''`norm_type` is set to {norm_type}, but `num_embeds_ada_norm` is not defined. Please make sure to'''
                f''' define `num_embeds_ada_norm` if setting `norm_type` to {norm_type}.'''		)

        # Define 3 blocks. Each block has its own normalization layer.
        # 1. Self-Attn
        if self.use_ada_layer_norm:
            A :       Dict          =   AdaLayerNorm(lowerCamelCase__,		lowerCamelCase__		)
        elif self.use_ada_layer_norm_zero:
            A :       List[str]          =   AdaLayerNormZero(lowerCamelCase__,		lowerCamelCase__		)
        else:
            A :       Tuple          =   nn.LayerNorm(lowerCamelCase__,		elementwise_affine=lowerCamelCase__		)
        A :       Any          =   Attention(
            query_dim=lowerCamelCase__,		heads=lowerCamelCase__,		dim_head=lowerCamelCase__,		dropout=lowerCamelCase__,		bias=lowerCamelCase__,		cross_attention_dim=cross_attention_dim if only_cross_attention else None,		upcast_attention=lowerCamelCase__,		)

        # 2. Cross-Attn
        if cross_attention_dim is not None or double_self_attention:
            # We currently only use AdaLayerNormZero for self attention where there will only be one attention block.
            # I.e. the number of returned modulation chunks from AdaLayerZero would not make sense if returned during
            # the second cross attention block.
            A :       int          =   (
                AdaLayerNorm(lowerCamelCase__,		lowerCamelCase__		)
                if self.use_ada_layer_norm
                else nn.LayerNorm(lowerCamelCase__,		elementwise_affine=lowerCamelCase__		)
            )
            A :       Dict          =   Attention(
                query_dim=lowerCamelCase__,		cross_attention_dim=cross_attention_dim if not double_self_attention else None,		heads=lowerCamelCase__,		dim_head=lowerCamelCase__,		dropout=lowerCamelCase__,		bias=lowerCamelCase__,		upcast_attention=lowerCamelCase__,		)  # is self-attn if encoder_hidden_states is none
        else:
            A :       Dict          =   None
            A :       Dict          =   None

        # 3. Feed-forward
        A :       Optional[Any]          =   nn.LayerNorm(lowerCamelCase__,		elementwise_affine=lowerCamelCase__		)
        A :       int          =   FeedForward(lowerCamelCase__,		dropout=lowerCamelCase__,		activation_fn=lowerCamelCase__,		final_dropout=lowerCamelCase__		)

        # let chunk size default to None
        A :       Optional[Any]          =   None
        A :       int          =   0






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__		):
        # Sets chunk feed-forward
        A :       List[str]          =   chunk_size
        A :       int          =   dim






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		lowerCamelCase__ = None,		):
        # Notice that normalization is always applied before the real computation in the following blocks.
        # 1. Self-Attention
        if self.use_ada_layer_norm:
            A :       Optional[int]          =   self.norma(lowerCamelCase__,		lowerCamelCase__		)
        elif self.use_ada_layer_norm_zero:
            A     ,							A     ,							A     ,							A     ,							A :       Tuple          =   self.norma(
                lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		hidden_dtype=hidden_states.dtype		)
        else:
            A :       Tuple          =   self.norma(lowerCamelCase__		)

        A :       Dict          =   cross_attention_kwargs if cross_attention_kwargs is not None else {}

        A :       str          =   self.attna(
            lowerCamelCase__,		encoder_hidden_states=encoder_hidden_states if self.only_cross_attention else None,		attention_mask=lowerCamelCase__,		**lowerCamelCase__,		)
        if self.use_ada_layer_norm_zero:
            A :       List[Any]          =   gate_msa.unsqueeze(1		) * attn_output
        A :       str          =   attn_output + hidden_states

        # 2. Cross-Attention
        if self.attna is not None:
            A :       Optional[int]          =   (
                self.norma(lowerCamelCase__,		lowerCamelCase__		) if self.use_ada_layer_norm else self.norma(lowerCamelCase__		)
            )

            A :       Optional[Any]          =   self.attna(
                lowerCamelCase__,		encoder_hidden_states=lowerCamelCase__,		attention_mask=lowerCamelCase__,		**lowerCamelCase__,		)
            A :       Dict          =   attn_output + hidden_states

        # 3. Feed-forward
        A :       str          =   self.norma(lowerCamelCase__		)

        if self.use_ada_layer_norm_zero:
            A :       Tuple          =   norm_hidden_states * (1 + scale_mlp[:, None]) + shift_mlp[:, None]

        if self._chunk_size is not None:
            # "feed_forward_chunk_size" can be used to save memory
            if norm_hidden_states.shape[self._chunk_dim] % self._chunk_size != 0:
                raise ValueError(
                    f'''`hidden_states` dimension to be chunked: {norm_hidden_states.shape[self._chunk_dim]} has to be divisible by chunk size: {self._chunk_size}. Make sure to set an appropriate `chunk_size` when calling `unet.enable_forward_chunking`.'''		)

            A :       Any          =   norm_hidden_states.shape[self._chunk_dim] // self._chunk_size
            A :       Optional[Any]          =   torch.cat(
                [self.ff(lowerCamelCase__		) for hid_slice in norm_hidden_states.chunk(lowerCamelCase__,		dim=self._chunk_dim		)],		dim=self._chunk_dim,		)
        else:
            A :       Dict          =   self.ff(lowerCamelCase__		)

        if self.use_ada_layer_norm_zero:
            A :       Optional[Any]          =   gate_mlp.unsqueeze(1		) * ff_output

        A :       Optional[int]          =   ff_output + hidden_states

        return hidden_states






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__ = None,		lowerCamelCase__ = 4,		lowerCamelCase__ = 0.0,		lowerCamelCase__ = "geglu",		lowerCamelCase__ = False,		):
        super().__init__()
        A :       str          =   int(dim * mult		)
        A :       Optional[Any]          =   dim_out if dim_out is not None else dim

        if activation_fn == "gelu":
            A :       Dict          =   GELU(lowerCamelCase__,		lowerCamelCase__		)
        if activation_fn == "gelu-approximate":
            A :       Optional[int]          =   GELU(lowerCamelCase__,		lowerCamelCase__,		approximate="""tanh"""		)
        elif activation_fn == "geglu":
            A :       Any          =   GEGLU(lowerCamelCase__,		lowerCamelCase__		)
        elif activation_fn == "geglu-approximate":
            A :       Optional[Any]          =   ApproximateGELU(lowerCamelCase__,		lowerCamelCase__		)

        A :       Dict          =   nn.ModuleList([]		)
        # project in
        self.net.append(lowerCamelCase__		)
        # project dropout
        self.net.append(nn.Dropout(lowerCamelCase__		)		)
        # project out
        self.net.append(nn.Linear(lowerCamelCase__,		lowerCamelCase__		)		)
        # FF as used in Vision Transformer, MLP-Mixer, etc. have a final dropout
        if final_dropout:
            self.net.append(nn.Dropout(lowerCamelCase__		)		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        for module in self.net:
            A :       int          =   module(lowerCamelCase__		)
        return hidden_states






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__ = "none"		):
        super().__init__()
        A :       Optional[int]          =   nn.Linear(lowerCamelCase__,		lowerCamelCase__		)
        A :       int          =   approximate






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        if gate.device.type != "mps":
            return F.gelu(lowerCamelCase__,		approximate=self.approximate		)
        # mps: gelu is not implemented for float16
        return F.gelu(gate.to(dtype=torch.floataa		),		approximate=self.approximate		).to(dtype=gate.dtype		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        A :       List[Any]          =   self.proj(lowerCamelCase__		)
        A :       Union[str, Any]          =   self.gelu(lowerCamelCase__		)
        return hidden_states






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__		):
        super().__init__()
        A :       Union[str, Any]          =   nn.Linear(lowerCamelCase__,		dim_out * 2		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        if gate.device.type != "mps":
            return F.gelu(lowerCamelCase__		)
        # mps: gelu is not implemented for float16
        return F.gelu(gate.to(dtype=torch.floataa		)		).to(dtype=gate.dtype		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        A     ,							A :       Any          =   self.proj(lowerCamelCase__		).chunk(2,		dim=-1		)
        return hidden_states * self.gelu(lowerCamelCase__		)






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__		):
        super().__init__()
        A :       Union[str, Any]          =   nn.Linear(lowerCamelCase__,		lowerCamelCase__		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        A :       List[Any]          =   self.proj(lowerCamelCase__		)
        return x * torch.sigmoid(1.702 * x		)






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__		):
        super().__init__()
        A :       Dict          =   nn.Embedding(lowerCamelCase__,		lowerCamelCase__		)
        A :       Tuple          =   nn.SiLU()
        A :       Tuple          =   nn.Linear(lowerCamelCase__,		embedding_dim * 2		)
        A :       List[str]          =   nn.LayerNorm(lowerCamelCase__,		elementwise_affine=lowerCamelCase__		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__		):
        A :       int          =   self.linear(self.silu(self.emb(lowerCamelCase__		)		)		)
        A     ,							A :       Optional[int]          =   torch.chunk(lowerCamelCase__,		2		)
        A :       Tuple          =   self.norm(lowerCamelCase__		) * (1 + scale) + shift
        return x






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__		):
        super().__init__()

        A :       Union[str, Any]          =   CombinedTimestepLabelEmbeddings(lowerCamelCase__,		lowerCamelCase__		)

        A :       List[Any]          =   nn.SiLU()
        A :       str          =   nn.Linear(lowerCamelCase__,		6 * embedding_dim,		bias=lowerCamelCase__		)
        A :       List[Any]          =   nn.LayerNorm(lowerCamelCase__,		elementwise_affine=lowerCamelCase__,		eps=1e-6		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__=None		):
        A :       Tuple          =   self.linear(self.silu(self.emb(lowerCamelCase__,		lowerCamelCase__,		hidden_dtype=lowerCamelCase__		)		)		)
        A     ,							A     ,							A     ,							A     ,							A     ,							A :       Optional[Any]          =   emb.chunk(6,		dim=1		)
        A :       List[str]          =   self.norm(lowerCamelCase__		) * (1 + scale_msa[:, None]) + shift_msa[:, None]
        return x, gate_msa, shift_mlp, scale_mlp, gate_mlp






class SCREAMING_SNAKE_CASE__     (		nn.Module    ):




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__,		lowerCamelCase__ = None,		lowerCamelCase__ = 1e-5		):
        super().__init__()
        A :       int          =   num_groups
        A :       Dict          =   eps

        if act_fn is None:
            A :       Union[str, Any]          =   None
        else:
            A :       Optional[int]          =   get_activation(lowerCamelCase__		)

        A :       Dict          =   nn.Linear(lowerCamelCase__,		out_dim * 2		)






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__		):
        if self.act:
            A :       Dict          =   self.act(lowerCamelCase__		)
        A :       Optional[int]          =   self.linear(lowerCamelCase__		)
        A :       int          =   emb[:, :, None, None]
        A     ,							A :       Tuple          =   emb.chunk(2,		dim=1		)

        A :       Any          =   F.group_norm(lowerCamelCase__,		self.num_groups,		eps=self.eps		)
        A :       List[str]          =   x * (1 + scale) + shift
        return x


