





from typing import TYPE_CHECKING

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


lowerCAmelCase_				= {
    'configuration_clip': [
        'CLIP_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'CLIPConfig',
        'CLIPOnnxConfig',
        'CLIPTextConfig',
        'CLIPVisionConfig',
    ],
    'processing_clip': ['CLIPProcessor'],
    'tokenization_clip': ['CLIPTokenizer'],
}

try:
   if not is_tokenizers_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   lowerCAmelCase_				= ['CLIPTokenizerFast']

try:
   if not is_vision_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   lowerCAmelCase_				= ['CLIPFeatureExtractor']
   lowerCAmelCase_				= ['CLIPImageProcessor']

try:
   if not is_torch_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   lowerCAmelCase_				= [
       'CLIP_PRETRAINED_MODEL_ARCHIVE_LIST',
       'CLIPModel',
       'CLIPPreTrainedModel',
       'CLIPTextModel',
       'CLIPTextModelWithProjection',
       'CLIPVisionModel',
       'CLIPVisionModelWithProjection',
   ]

try:
   if not is_tf_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   lowerCAmelCase_				= [
       'TF_CLIP_PRETRAINED_MODEL_ARCHIVE_LIST',
       'TFCLIPModel',
       'TFCLIPPreTrainedModel',
       'TFCLIPTextModel',
       'TFCLIPVisionModel',
   ]

try:
   if not is_flax_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   lowerCAmelCase_				= [
       'FlaxCLIPModel',
       'FlaxCLIPPreTrainedModel',
       'FlaxCLIPTextModel',
       'FlaxCLIPTextPreTrainedModel',
       'FlaxCLIPVisionModel',
       'FlaxCLIPVisionPreTrainedModel',
   ]


if TYPE_CHECKING:
   from .configuration_clip import (
       CLIP_PRETRAINED_CONFIG_ARCHIVE_MAP,
       CLIPConfig,
       CLIPOnnxConfig,
       CLIPTextConfig,
       CLIPVisionConfig,
   )
   from .processing_clip import CLIPProcessor
   from .tokenization_clip import CLIPTokenizer

   try:
      if not is_tokenizers_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .tokenization_clip_fast import CLIPTokenizerFast

   try:
      if not is_vision_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .feature_extraction_clip import CLIPFeatureExtractor
      from .image_processing_clip import CLIPImageProcessor

   try:
      if not is_torch_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .modeling_clip import (
          CLIP_PRETRAINED_MODEL_ARCHIVE_LIST,
          CLIPModel,
          CLIPPreTrainedModel,
          CLIPTextModel,
          CLIPTextModelWithProjection,
          CLIPVisionModel,
          CLIPVisionModelWithProjection,
      )

   try:
      if not is_tf_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .modeling_tf_clip import (
          TF_CLIP_PRETRAINED_MODEL_ARCHIVE_LIST,
          TFCLIPModel,
          TFCLIPPreTrainedModel,
          TFCLIPTextModel,
          TFCLIPVisionModel,
      )

   try:
      if not is_flax_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .modeling_flax_clip import (
          FlaxCLIPModel,
          FlaxCLIPPreTrainedModel,
          FlaxCLIPTextModel,
          FlaxCLIPTextPreTrainedModel,
          FlaxCLIPVisionModel,
          FlaxCLIPVisionPreTrainedModel,
      )


else:
   import sys

   lowerCAmelCase_				= _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)













# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

a__      :     Optional[int]         =		TypeVar('T')





class UpperCAmelCase_				( Generic[T] ):


  def __init__(							self ,__snake_case = True ):



       """simple docstring"""





       A_          =       {}  # dictionary of lists
       A_          =       directed


  def 						__UpperCAmelCase     (							self ,__snake_case ,__snake_case ):



       """simple docstring"""





       if not self.directed:  # For undirected graphs
            # if both source vertex and destination vertex are both present in the
            # adjacency list, add destination vertex to source vertex list of adjacent
            # vertices and add source vertex to destination vertex list of adjacent
            # vertices.
            if source_vertex in self.adj_list and destination_vertex in self.adj_list:
                 self.adj_list[source_vertex].append(__snake_case )
                 self.adj_list[destination_vertex].append(__snake_case )
            # if only source vertex is present in adjacency list, add destination vertex
            # to source vertex list of adjacent vertices, then create a new vertex with
            # destination vertex as key and assign a list containing the source vertex
            # as it's first adjacent vertex.
            elif source_vertex in self.adj_list:
                 self.adj_list[source_vertex].append(__snake_case )
                 A_          =       [source_vertex]
            # if only destination vertex is present in adjacency list, add source vertex
            # to destination vertex list of adjacent vertices, then create a new vertex
            # with source vertex as key and assign a list containing the source vertex
            # as it's first adjacent vertex.
            elif destination_vertex in self.adj_list:
                 self.adj_list[destination_vertex].append(__snake_case )
                 A_          =       [destination_vertex]
            # if both source vertex and destination vertex are not present in adjacency
            # list, create a new vertex with source vertex as key and assign a list
            # containing the destination vertex as it's first adjacent vertex also
            # create a new vertex with destination vertex as key and assign a list
            # containing the source vertex as it's first adjacent vertex.
            else:
                 A_          =       [destination_vertex]
                 A_          =       [source_vertex]
       else:  # For directed graphs
            # if both source vertex and destination vertex are present in adjacency
            # list, add destination vertex to source vertex list of adjacent vertices.
            if source_vertex in self.adj_list and destination_vertex in self.adj_list:
                 self.adj_list[source_vertex].append(__snake_case )
            # if only source vertex is present in adjacency list, add destination
            # vertex to source vertex list of adjacent vertices and create a new vertex
            # with destination vertex as key, which has no adjacent vertex
            elif source_vertex in self.adj_list:
                 self.adj_list[source_vertex].append(__snake_case )
                 A_          =       []
            # if only destination vertex is present in adjacency list, create a new
            # vertex with source vertex as key and assign a list containing destination
            # vertex as first adjacent vertex
            elif destination_vertex in self.adj_list:
                 A_          =       [destination_vertex]
            # if both source vertex and destination vertex are not present in adjacency
            # list, create a new vertex with source vertex as key and a list containing
            # destination vertex as it's first adjacent vertex. Then create a new vertex
            # with destination vertex as key, which has no adjacent vertex
            else:
                 A_          =       [destination_vertex]
                 A_          =       []

       return self




  def __repr__(							self ):



       """simple docstring"""





       return pformat(self.adj_list )



