






import collections
import tempfile
import unittest

import numpy as np

from transformers.testing_utils import (
    is_pt_flax_cross_test,
    require_flax,
    require_torch,
    require_vision,
    slow,
    torch_device,
)
from transformers.utils import is_flax_available, is_torch_available, is_vision_available

from ...test_modeling_flax_common import floats_tensor, ids_tensor, random_attention_mask
from ..bert.test_modeling_flax_bert import FlaxBertModelTester
from ..clip.test_modeling_flax_clip import FlaxCLIPVisionModelTester
from ..vit.test_modeling_flax_vit import FlaxViTModelTester


if is_flax_available():
    from transformers import (
        FlaxBertModel,
        FlaxCLIPVisionModel,
        FlaxVisionTextDualEncoderModel,
        FlaxViTModel,
        VisionTextDualEncoderConfig,
        VisionTextDualEncoderProcessor,
    )
    from transformers.modeling_flax_pytorch_utils import (
        convert_pytorch_state_dict_to_flax,
        load_flax_weights_in_pytorch_model,
    )


if is_torch_available():
    import torch

    from transformers import VisionTextDualEncoderModel

if is_vision_available():
    from PIL import Image






def 						__magic_name__			(   __a      :	List[str]						):



     '''simple docstring'''




     if isinstance(SCREAMING_SNAKE_CASE_	,		collections.abc.Iterable						):
          return x
     return (x, x)




@require_flax
class      __A:

  """simple docstring"""







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       pass







  def 	UpperCAmelCase_ (self						):
       pass







  def 	UpperCAmelCase_ (self						):
       pass







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    np.abs((a - b)						).max()
       self.assertLessEqual(_lowercase	,      _lowercase	,      F"Difference between torch and flax is {diff} (>= {tol})."						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_=None	,      **SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    VisionTextDualEncoderConfig.from_vision_text_configs(_lowercase	,      _lowercase						)

       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel(_lowercase						)

       UpperCamelCase__				=    model(input_ids=_lowercase	,      pixel_values=_lowercase	,      attention_mask=_lowercase						)

       self.assertEqual(output["""text_embeds"""].shape	,      (input_ids.shape[0], config.projection_dim)						)
       self.assertEqual(output["""image_embeds"""].shape	,      (pixel_values.shape[0], config.projection_dim)						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_=None	,      **SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__		,	UpperCamelCase__				=    self.get_vision_text_model(_lowercase	,      _lowercase						)
       UpperCamelCase__				=    {"""vision_model""": vision_model, """text_model""": text_model}
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_vision_text_pretrained(**_lowercase						)

       UpperCamelCase__				=    model(input_ids=_lowercase	,      pixel_values=_lowercase	,      attention_mask=_lowercase						)

       self.assertEqual(output["""text_embeds"""].shape	,      (input_ids.shape[0], model.config.projection_dim)						)
       self.assertEqual(output["""image_embeds"""].shape	,      (pixel_values.shape[0], model.config.projection_dim)						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_=None	,      **SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__		,	UpperCamelCase__				=    self.get_vision_text_model(_lowercase	,      _lowercase						)
       UpperCamelCase__				=    {"""vision_model""": vision_model, """text_model""": text_model}
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_vision_text_pretrained(**_lowercase						)

       UpperCamelCase__				=    model(input_ids=_lowercase	,      pixel_values=_lowercase	,      attention_mask=_lowercase						)
       UpperCamelCase__				=    output[0]

       with tempfile.TemporaryDirectory() as tmpdirname:
            model.save_pretrained(_lowercase						)
            UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_pretrained(_lowercase						)

            UpperCamelCase__				=    model(input_ids=_lowercase	,      pixel_values=_lowercase	,      attention_mask=_lowercase						)
            UpperCamelCase__				=    after_output[0]
            UpperCamelCase__				=    np.amax(np.abs(out_a - out_a						)						)
            self.assertLessEqual(_lowercase	,      1E-3						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_=None	,      **SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__		,	UpperCamelCase__				=    self.get_vision_text_model(_lowercase	,      _lowercase						)
       UpperCamelCase__				=    {"""vision_model""": vision_model, """text_model""": text_model}
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_vision_text_pretrained(**_lowercase						)

       UpperCamelCase__				=    model(
           input_ids=_lowercase	,      pixel_values=_lowercase	,      attention_mask=_lowercase	,      output_attentions=_lowercase						)

       UpperCamelCase__				=    output.vision_model_output.attentions
       self.assertEqual(len(_lowercase						)	,      vision_config.num_hidden_layers						)

       # in ViT, the seq_len equals the number of patches + 1 (we add 1 for the [CLS] token)
       UpperCamelCase__				=    to_atuple(vision_model.config.image_size						)
       UpperCamelCase__				=    to_atuple(vision_model.config.patch_size						)
       UpperCamelCase__				=    (image_size[1] // patch_size[1]) * (image_size[0] // patch_size[0])
       UpperCamelCase__				=    num_patches + 1
       self.assertEqual(vision_attentions[0].shape[-3:]	,      (vision_config.num_attention_heads, seq_len, seq_len)						)

       UpperCamelCase__				=    output.text_model_output.attentions
       self.assertEqual(len(_lowercase						)	,      text_config.num_hidden_layers						)

       self.assertEqual(
           text_attentions[0].shape[-3:]	,      (text_config.num_attention_heads, input_ids.shape[-1], input_ids.shape[-1])	,      )







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       pt_model.to(_lowercase						)
       pt_model.eval()

       # prepare inputs
       UpperCamelCase__				=    inputs_dict
       UpperCamelCase__				=    {k: torch.tensor(v.tolist()						) for k, v in flax_inputs.items()}

       with torch.no_grad():
            UpperCamelCase__				=    pt_model(**_lowercase						).to_tuple()

       UpperCamelCase__				=    fx_model(**_lowercase						).to_tuple()
       self.assertEqual(len(_lowercase						)	,      len(_lowercase						)	,      """Output lengths differ between Flax and PyTorch"""						)
       for fx_output, pt_output in zip(fx_outputs[:4]	,      pt_outputs[:4]						):
            self.assert_almost_equals(_lowercase	,      pt_output.numpy()	,      4E-2						)

       # PT -> Flax
       with tempfile.TemporaryDirectory() as tmpdirname:
            pt_model.save_pretrained(_lowercase						)
            UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_pretrained(_lowercase	,      from_pt=_lowercase						)

       UpperCamelCase__				=    fx_model_loaded(**_lowercase						).to_tuple()
       self.assertEqual(len(_lowercase						)	,      len(_lowercase						)	,      """Output lengths differ between Flax and PyTorch"""						)
       for fx_output_loaded, pt_output in zip(fx_outputs_loaded[:4]	,      pt_outputs[:4]						):
            self.assert_almost_equals(_lowercase	,      pt_output.numpy()	,      4E-2						)

       # Flax -> PT
       with tempfile.TemporaryDirectory() as tmpdirname:
            fx_model.save_pretrained(_lowercase						)
            UpperCamelCase__				=    VisionTextDualEncoderModel.from_pretrained(_lowercase	,      from_flax=_lowercase						)

       pt_model_loaded.to(_lowercase						)
       pt_model_loaded.eval()

       with torch.no_grad():
            UpperCamelCase__				=    pt_model_loaded(**_lowercase						).to_tuple()

       self.assertEqual(len(_lowercase						)	,      len(_lowercase						)	,      """Output lengths differ between Flax and PyTorch"""						)
       for fx_output, pt_output_loaded in zip(fx_outputs[:4]	,      pt_outputs_loaded[:4]						):
            self.assert_almost_equals(_lowercase	,      pt_output_loaded.numpy()	,      4E-2						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    VisionTextDualEncoderConfig.from_vision_text_configs(_lowercase	,      _lowercase						)

       UpperCamelCase__				=    VisionTextDualEncoderModel(_lowercase						)
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel(_lowercase						)

       UpperCamelCase__				=    convert_pytorch_state_dict_to_flax(pt_model.state_dict()	,      _lowercase						)
       UpperCamelCase__				=    fx_state

       self.check_pt_flax_equivalence(_lowercase	,      _lowercase	,      _lowercase						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    VisionTextDualEncoderConfig.from_vision_text_configs(_lowercase	,      _lowercase						)

       UpperCamelCase__				=    VisionTextDualEncoderModel(_lowercase						)
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel(_lowercase						)

       UpperCamelCase__				=    load_flax_weights_in_pytorch_model(_lowercase	,      fx_model.params						)

       self.check_pt_flax_equivalence(_lowercase	,      _lowercase	,      _lowercase						)







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    self.prepare_config_and_inputs()
       self.check_model_from_pretrained_configs(**_lowercase						)







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    self.prepare_config_and_inputs()
       self.check_vision_text_dual_encoder_from_pretrained(**_lowercase						)







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    self.prepare_config_and_inputs()
       self.check_save_load(**_lowercase						)







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    self.prepare_config_and_inputs()
       self.check_vision_text_output_attention(**_lowercase						)







  @is_pt_flax_cross_test
  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    self.prepare_config_and_inputs()
       UpperCamelCase__				=    config_inputs_dict.pop("""vision_config"""						)
       UpperCamelCase__				=    config_inputs_dict.pop("""text_config"""						)

       UpperCamelCase__				=    config_inputs_dict

       self.check_equivalence_pt_to_flax(_lowercase	,      _lowercase	,      _lowercase						)
       self.check_equivalence_flax_to_pt(_lowercase	,      _lowercase	,      _lowercase						)







  @slow
  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__		,	UpperCamelCase__				=    self.get_pretrained_model_and_inputs()

       UpperCamelCase__				=    model_a(**_lowercase						)
       UpperCamelCase__				=    outputs[0]

       with tempfile.TemporaryDirectory() as tmp_dirname:
            model_a.save_pretrained(_lowercase						)
            UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_pretrained(_lowercase						)

            UpperCamelCase__				=    model_a(**_lowercase						)
            UpperCamelCase__				=    after_outputs[0]
            UpperCamelCase__				=    np.amax(np.abs(out_a - out_a						)						)
            self.assertLessEqual(_lowercase	,      1E-5						)






@require_flax
class      __A(    __lowerCamelCase    ,				unittest.TestCase			):

  """simple docstring"""







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_vision_text_pretrained(
           """hf-internal-testing/tiny-random-vit"""	,      """hf-internal-testing/tiny-bert"""	,      vision_from_pt=_lowercase	,      text_from_pt=_lowercase	,      )
       UpperCamelCase__				=    13
       UpperCamelCase__				=    floats_tensor(
           [
               batch_size,
               model.config.vision_config.num_channels,
               model.config.vision_config.image_size,
               model.config.vision_config.image_size,
           ]						)
       UpperCamelCase__				=    ids_tensor([batch_size, 4]	,      model.config.text_config.vocab_size						)
       UpperCamelCase__				=    random_attention_mask([batch_size, 4]						)
       UpperCamelCase__				=    {"""pixel_values""": pixel_values, """input_ids""": input_ids, """attention_mask""": attention_mask}

       return model, inputs







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    FlaxViTModel(_lowercase						)
       UpperCamelCase__				=    FlaxBertModel(_lowercase						)
       return vision_model, text_model







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    FlaxViTModelTester(self						)
       UpperCamelCase__				=    FlaxBertModelTester(self						)
       UpperCamelCase__				=    vit_model_tester.prepare_config_and_inputs()
       UpperCamelCase__				=    bert_model_tester.prepare_config_and_inputs()

       UpperCamelCase__		,	UpperCamelCase__				=    vision_config_and_inputs

       UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__				=    text_config_and_inputs

       # make sure that cross attention layers are added
       return {
           "text_config": text_config,
           "vision_config": vision_config,
           "pixel_values": pixel_values,
           "attention_mask": attention_mask,
           "input_ids": input_ids,
           "token_type_ids": token_type_ids,
       }






@require_torch
class      __A(    __lowerCamelCase    ,				unittest.TestCase			):

  """simple docstring"""







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_vision_text_pretrained(
           """hf-internal-testing/tiny-random-clip"""	,      """hf-internal-testing/tiny-bert"""	,      vision_from_pt=_lowercase	,      text_from_pt=_lowercase	,      )
       UpperCamelCase__				=    13
       UpperCamelCase__				=    floats_tensor(
           [
               batch_size,
               model.config.vision_config.num_channels,
               model.config.vision_config.image_size,
               model.config.vision_config.image_size,
           ]						)
       UpperCamelCase__				=    ids_tensor([batch_size, 4]	,      model.config.text_config.vocab_size						)
       UpperCamelCase__				=    random_attention_mask([batch_size, 4]						)
       UpperCamelCase__				=    {"""pixel_values""": pixel_values, """input_ids""": input_ids, """attention_mask""": attention_mask}

       return model, inputs







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    FlaxCLIPVisionModel(_lowercase						)
       UpperCamelCase__				=    FlaxBertModel(_lowercase						)
       return vision_model, text_model







  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    FlaxCLIPVisionModelTester(self						)
       UpperCamelCase__				=    FlaxBertModelTester(self						)
       UpperCamelCase__				=    clip_model_tester.prepare_config_and_inputs()
       UpperCamelCase__				=    bert_model_tester.prepare_config_and_inputs()

       UpperCamelCase__		,	UpperCamelCase__				=    vision_config_and_inputs

       UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__				=    text_config_and_inputs

       # make sure that cross attention layers are added
       return {
           "text_config": text_config,
           "vision_config": vision_config,
           "pixel_values": pixel_values,
           "attention_mask": attention_mask,
           "input_ids": input_ids,
           "token_type_ids": token_type_ids,
       }






@require_flax
@require_vision
class      __A(    unittest.TestCase			):

  """simple docstring"""







  @slow
  def 	UpperCAmelCase_ (self						):
       UpperCamelCase__				=    FlaxVisionTextDualEncoderModel.from_pretrained("""clip-italian/clip-italian"""	,      logit_scale_init_value=1.0						)
       UpperCamelCase__				=    VisionTextDualEncoderProcessor.from_pretrained("""clip-italian/clip-italian"""						)

       UpperCamelCase__				=    Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png"""						)
       UpperCamelCase__				=    processor(
           text=["""una foto di un gatto""", """una foto di un cane"""]	,      images=_lowercase	,      padding=_lowercase	,      return_tensors="""np"""						)

       UpperCamelCase__				=    model(**_lowercase						)

       # verify the logits
       self.assertEqual(outputs.logits_per_image.shape	,      (inputs.pixel_values.shape[0], inputs.input_ids.shape[0])						)
       self.assertEqual(
           outputs.logits_per_text.shape	,      (inputs.input_ids.shape[0], inputs.pixel_values.shape[0])	,      )

       UpperCamelCase__				=    np.array([[1.228_4727, 0.310_4122]]						)

       self.assertTrue(np.allclose(outputs.logits_per_image	,      _lowercase	,      atol=1E-3						)						)







from __future__ import annotations

from collections import Counter
from random import random




class      __A:

  """simple docstring"""







  def __init__(self						):
       UpperCamelCase__				=    {}







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    {}







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       if nodea not in self.connections:
            self.add_node(SCREAMING_SNAKE_CASE_						)
       if nodea not in self.connections:
            self.add_node(SCREAMING_SNAKE_CASE_						)
       UpperCamelCase__				=    probability







  def 	UpperCAmelCase_ (self						):
       return list(self.connections						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    0
       UpperCamelCase__				=    random()

       for dest in self.connections[node]:
            current_probability += self.connections[node][dest]
            if current_probability > random_value:
                 return dest
       return ""






def 						__magic_name__			(   __a      :	str	,		__a      :	list[tuple[str, str, float]]	,		__a      :	int						):



     '''simple docstring'''




     UpperCamelCase__				=    MarkovChainGraphUndirectedUnweighted()

     for nodea, nodea, probability in transitions:
          graph.add_transition_probability(__a	,		__a	,		__a						)

     UpperCamelCase__				=    Counter(graph.get_nodes()						)
     UpperCamelCase__				=    start

     for _ in range(__a						):
          UpperCamelCase__				=    graph.transition(__a						)
          visited[node] += 1

     return visited


if __name__ == "__main__":
    import doctest

    doctest.testmod()





