





# 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

_UpperCAmelCase       : Union[str, Any]			     =       TypeVar("""T""")

class      lowerCAmelCase							(      Generic[T]    ):
 def __init__(   self						:   Dict    ,  UpperCAmelCase						:   bool = True			)    ->			None:
     lowerCamelCase__					:   dict[T, list[T]]      				=	{}  # dictionary of lists
     lowerCamelCase__					:   Tuple      				=	directed
 def   A_			(   self						:   Tuple    ,  UpperCAmelCase						:   T    ,  UpperCAmelCase						:   T			)    ->			GraphAdjacencyList[T]:

     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(UpperCAmelCase			)
             self.adj_list[destination_vertex].append(UpperCAmelCase			)
         # 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(UpperCAmelCase			)
             lowerCamelCase__					:   str      				=	[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(UpperCAmelCase			)
             lowerCamelCase__					:   Optional[Any]      				=	[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:
             lowerCamelCase__					:   Tuple      				=	[destination_vertex]
             lowerCamelCase__					:   str      				=	[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(UpperCAmelCase			)
         # 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(UpperCAmelCase			)
             lowerCamelCase__					:   List[str]      				=	[]
         # 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:
             lowerCamelCase__					:   List[Any]      				=	[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:
             lowerCamelCase__					:   List[Any]      				=	[destination_vertex]
             lowerCamelCase__					:   List[Any]      				=	[]

     return self







 def __repr__(   self						:   int			)    ->			str:
     return pformat(self.adj_list			)












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,
)


_UpperCAmelCase       : Optional[Any]			     =       {
    """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:
    _UpperCAmelCase       : int			     =       ["""CLIPTokenizerFast"""]

try:
    if not is_vision_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _UpperCAmelCase       : Optional[int]			     =       ["""CLIPFeatureExtractor"""]
    _UpperCAmelCase       : Union[str, Any]			     =       ["""CLIPImageProcessor"""]

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

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

try:
    if not is_flax_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _UpperCAmelCase       : Optional[int]			     =       [
        """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

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





