



"""simple docstring"""






# 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

lowerCAmelCase__        =				TypeVar('''T''')






class        __snake_case       (	Generic[T]):




  def __init__( self     :						Tuple						,					__lowerCAmelCase     :						bool = True		):






         """simple docstring"""






         _lowerCamelCase						:				dict[T, list[T]]    			= {}  # dictionary of lists
         _lowerCamelCase						:				Any    			= directed




  def 						SCREAMING_SNAKE_CASE				( self     :						int						,					__lowerCAmelCase     :						T						,					__lowerCAmelCase     :						T		):






         """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(__lowerCAmelCase		)
                       self.adj_list[destination_vertex].append(__lowerCAmelCase		)
                # 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(__lowerCAmelCase		)
                       _lowerCamelCase						:				List[Any]    			= [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(__lowerCAmelCase		)
                       _lowerCamelCase						:				Optional[int]    			= [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						:				Any    			= [destination_vertex]
                       _lowerCamelCase						:				Optional[int]    			= [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(__lowerCAmelCase		)
                # 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(__lowerCAmelCase		)
                       _lowerCamelCase						:				Union[str, Any]    			= []
                # 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						:				Any    			= [destination_vertex]
                       _lowerCamelCase						:				List[str]    			= []

         return self




  def __repr__( self     :						Dict		):






         """simple docstring"""






         return pformat(self.adj_list		)







"""simple docstring"""
import math

from numpy import inf
from scipy.integrate import quad





def  lowerCamelCase_						(UpperCamelCase__		:		float							):
    if num <= 0:
        raise ValueError('''math domain error'''							)

    return quad(UpperCamelCase__     ,       0     ,       UpperCamelCase__     ,       args=(UpperCamelCase__)							)[0]





def  lowerCamelCase_						(UpperCamelCase__		:		float     ,       UpperCamelCase__		:		float							):
    return math.pow(UpperCamelCase__     ,       z - 1							) * math.exp(-x							)


if __name__ == "__main__":
  from doctest import testmod

  testmod()


