"""simple docstring"""






from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_keras_nlp_available,
    is_tensorflow_text_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


lowerCAmelCase__  :  str											=     {
    'configuration_gpt2': ['GPT2_PRETRAINED_CONFIG_ARCHIVE_MAP', 'GPT2Config', 'GPT2OnnxConfig'],
    'tokenization_gpt2': ['GPT2Tokenizer'],
}

try:
      if not is_tokenizers_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      lowerCAmelCase__  :  Tuple											=     ['GPT2TokenizerFast']

try:
      if not is_torch_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      lowerCAmelCase__  :  str											=     [
          'GPT2_PRETRAINED_MODEL_ARCHIVE_LIST',
          'GPT2DoubleHeadsModel',
          'GPT2ForQuestionAnswering',
          'GPT2ForSequenceClassification',
          'GPT2ForTokenClassification',
          'GPT2LMHeadModel',
          'GPT2Model',
          'GPT2PreTrainedModel',
          'load_tf_weights_in_gpt2',
      ]

try:
      if not is_tf_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      lowerCAmelCase__  :  Union[str, Any]											=     [
          'TF_GPT2_PRETRAINED_MODEL_ARCHIVE_LIST',
          'TFGPT2DoubleHeadsModel',
          'TFGPT2ForSequenceClassification',
          'TFGPT2LMHeadModel',
          'TFGPT2MainLayer',
          'TFGPT2Model',
          'TFGPT2PreTrainedModel',
      ]

try:
      if not is_keras_nlp_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      lowerCAmelCase__  :  Any											=     ['TFGPT2Tokenizer']

try:
      if not is_flax_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      lowerCAmelCase__  :  str											=     ['FlaxGPT2LMHeadModel', 'FlaxGPT2Model', 'FlaxGPT2PreTrainedModel']

if TYPE_CHECKING:
      from .configuration_gpta import GPT2_PRETRAINED_CONFIG_ARCHIVE_MAP, GPTaConfig, GPTaOnnxConfig
      from .tokenization_gpta import GPTaTokenizer

      try:
            if not is_tokenizers_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_gpta_fast import GPTaTokenizerFast

      try:
            if not is_torch_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_gpta import (
                GPT2_PRETRAINED_MODEL_ARCHIVE_LIST,
                GPTaDoubleHeadsModel,
                GPTaForQuestionAnswering,
                GPTaForSequenceClassification,
                GPTaForTokenClassification,
                GPTaLMHeadModel,
                GPTaModel,
                GPTaPreTrainedModel,
                load_tf_weights_in_gpta,
            )

      try:
            if not is_tf_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_tf_gpta import (
                TF_GPT2_PRETRAINED_MODEL_ARCHIVE_LIST,
                TFGPTaDoubleHeadsModel,
                TFGPTaForSequenceClassification,
                TFGPTaLMHeadModel,
                TFGPTaMainLayer,
                TFGPTaModel,
                TFGPTaPreTrainedModel,
            )

      try:
            if not is_keras_nlp_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_gpta_tf import TFGPTaTokenizer

      try:
            if not is_flax_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_flax_gpta import FlaxGPTaLMHeadModel, FlaxGPTaModel, FlaxGPTaPreTrainedModel

else:
      import sys

      lowerCAmelCase__  :  Optional[Any]											=     _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)




"""simple docstring"""






from typing import SupportsIndex

import numpy as np
from scipy.ndimage import convolve



def   a_						( lowerCamelCase ,      lowerCamelCase ,      lowerCamelCase	):
				UpperCAmelCase__					=							np.stack((horizontal_flow, vertical_flow) ,      2	)

				# Create a grid of all pixel coordinates and subtract the flow to get the
				# target pixels coordinates
				UpperCAmelCase__					=							np.stack(
				    np.meshgrid(np.arange(0 ,      image.shape[1]	) ,      np.arange(0 ,      image.shape[0]	)	) ,      2	)
				UpperCAmelCase__					=							np.round(grid - flow	).astype(np.intaa	)

				# Find the locations outside of the original image
				UpperCAmelCase__					=							(grid < 0) | (grid >= np.array([image.shape[1], image.shape[0]]	))
				UpperCAmelCase__					=							0

				UpperCAmelCase__					=							image[grid[:, :, 1], grid[:, :, 0]]

				# Set pixels at invalid locations to 0
				UpperCAmelCase__					=							0

				return warped



def   a_						( lowerCamelCase ,      lowerCamelCase ,      lowerCamelCase ,      lowerCamelCase = None ,      ):
				if alpha is None:
								UpperCAmelCase__					=							0.1

				# Initialize flow
				UpperCAmelCase__					=							np.zeros_like(lowerCamelCase	)
				UpperCAmelCase__					=							np.zeros_like(lowerCamelCase	)

				# Prepare kernels for the calculation of the derivatives and the average velocity
				UpperCAmelCase__					=							np.array([[-1, 1], [-1, 1]]	) * 0.25
				UpperCAmelCase__					=							np.array([[-1, -1], [1, 1]]	) * 0.25
				UpperCAmelCase__					=							np.array([[1, 1], [1, 1]]	) * 0.25
				UpperCAmelCase__					=							np.array(
				    [[1 / 1_2, 1 / 6, 1 / 1_2], [1 / 6, 0, 1 / 6], [1 / 1_2, 1 / 6, 1 / 1_2]]	)

				# Iteratively refine the flow
				for _ in range(lowerCamelCase	):
								UpperCAmelCase__					=							warp(lowerCamelCase ,      lowerCamelCase ,      lowerCamelCase	)
								UpperCAmelCase__					=							convolve(lowerCamelCase ,      lowerCamelCase	) + convolve(lowerCamelCase ,      lowerCamelCase	)
								UpperCAmelCase__					=							convolve(lowerCamelCase ,      lowerCamelCase	) + convolve(lowerCamelCase ,      lowerCamelCase	)
								UpperCAmelCase__					=							convolve(lowerCamelCase ,      lowerCamelCase	) + convolve(lowerCamelCase ,      -kernel_t	)

								UpperCAmelCase__					=							convolve(lowerCamelCase ,      lowerCamelCase	)
								UpperCAmelCase__					=							convolve(lowerCamelCase ,      lowerCamelCase	)

								# This updates the flow as proposed in the paper (Step 12)
								UpperCAmelCase__					=							(
								    derivative_x * avg_horizontal_velocity
								    + derivative_y * avg_vertical_velocity
								    + derivative_t
								)
								UpperCAmelCase__					=							update / (alpha**2 + derivative_x**2 + derivative_y**2)

								UpperCAmelCase__					=							avg_horizontal_velocity - derivative_x * update
								UpperCAmelCase__					=							avg_vertical_velocity - derivative_y * update

				return horizontal_flow, vertical_flow


if __name__ == "__main__":
						import doctest

						doctest.testmod()



