





'''simple docstring'''

class 			SCREAMING_SNAKE_CASE__	:







					"""simple docstring"""






					class 			SCREAMING_SNAKE_CASE__	:







										"""simple docstring"""






										SCREAMING_SNAKE_CASE				=     '''_prev''', '''_data''', '''_next'''
										def __init__(					self    :	Any						,     UpperCAmelCase_    :	Optional[int]						,     UpperCAmelCase_    :	Optional[int]						,     UpperCAmelCase_    :	Optional[int]						):







												"""simple docstring"""
												__UpperCAmelCase     :				List[Any]					   =			link_p
												__UpperCAmelCase     :				Union[str, Any]					   =			element
												__UpperCAmelCase     :				str					   =			link_n






										def 						lowerCamelCase_					(					self    :	Any						):







												"""simple docstring"""
												return (
												    f" Prev -> {self._prev is not None}, Next -> {self._next is not None}"
												)






					def __init__(					self    :	List[str]						):







							"""simple docstring"""
							__UpperCAmelCase     :				Any					   =			self._Node(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						)
							__UpperCAmelCase     :				Dict					   =			self._Node(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						)
							__UpperCAmelCase     :				Dict					   =			self._trailer
							__UpperCAmelCase     :				Any					   =			self._header
							__UpperCAmelCase     :				Optional[int]					   =			0
					def __len__(					self    :	int						):







							"""simple docstring"""
							return self._size
					def 						lowerCamelCase_					(					self    :	str						):







							"""simple docstring"""
							return self.__len__() == 0
					def 						lowerCamelCase_					(					self    :	int						,     UpperCAmelCase_    :	Optional[int]						,     UpperCAmelCase_    :	Dict						,     UpperCAmelCase_    :	Union[str, Any]						):







							"""simple docstring"""
							# Create new_node by setting it's prev.link -> header
							# setting it's next.link -> trailer
							__UpperCAmelCase     :				Dict					   =			self._Node(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						)
							__UpperCAmelCase     :				Union[str, Any]					   =			new_node
							__UpperCAmelCase     :				Optional[int]					   =			new_node
							self._size += 1
							return self






					def 						lowerCamelCase_					(					self    :	Optional[Any]						,     UpperCAmelCase_    :	Optional[Any]						):







							"""simple docstring"""
							__UpperCAmelCase     :				Tuple					   =			node._prev
							__UpperCAmelCase     :				List[str]					   =			node._next

							__UpperCAmelCase     :				Any					   =			successor
							__UpperCAmelCase     :				str					   =			predecessor
							self._size -= 1
							__UpperCAmelCase     :				List[str]					   =			node._data
							__UpperCAmelCase     :				int					   =			None
							del node
							return temp






class 			SCREAMING_SNAKE_CASE__	(					_DoublyLinkedBase						):







					"""simple docstring"""






					def 						lowerCamelCase_					(					self    :	Union[str, Any]						):







							"""simple docstring"""
							if self.is_empty():
									raise Exception("List is empty"						)
							return self._header._next._data
					def 						lowerCamelCase_					(					self    :	List[Any]						):







							"""simple docstring"""
							if self.is_empty():
									raise Exception("List is empty"						)
							return self._trailer._prev._data
					def 						lowerCamelCase_					(					self    :	List[str]						,     UpperCAmelCase_    :	Tuple						):







							"""simple docstring"""
							return self._insert(self._header						,     _UpperCAmelCase						,     self._header._next						)
					def 						lowerCamelCase_					(					self    :	Tuple						,     UpperCAmelCase_    :	Optional[int]						):







							"""simple docstring"""
							return self._insert(self._trailer._prev						,     _UpperCAmelCase						,     self._trailer						)
					def 						lowerCamelCase_					(					self    :	List[Any]						):







							"""simple docstring"""
							if self.is_empty():
									raise IndexError("remove_first from empty list"						)
							return self._delete(self._header._next						)






					def 						lowerCamelCase_					(					self    :	int						):







							"""simple docstring"""
							if self.is_empty():
									raise IndexError("remove_first from empty list"						)
							return self._delete(self._trailer._prev						)








import argparse
import os


UpperCAmelCase			=    {
    """pytorch""": {
        """1.13""": {
            """torch""": """1.13.1""",
            """torchvision""": """0.14.1""",
            """torchaudio""": """0.13.1""",
            """python""": 3.9,
            """cuda""": """cu116""",
            """install""": (
                """python3 -m pip install --no-cache-dir -U torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1"""
                """ --extra-index-url https://download.pytorch.org/whl/cu116"""
            ),
            """base_image""": """nvidia/cuda:11.6.2-cudnn8-devel-ubuntu20.04""",
        },
        """1.12""": {
            """torch""": """1.12.1""",
            """torchvision""": """0.13.1""",
            """torchaudio""": """0.12.1""",
            """python""": 3.9,
            """cuda""": """cu113""",
            """install""": (
                """python3 -m pip install --no-cache-dir -U torch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1"""
                """ --extra-index-url https://download.pytorch.org/whl/cu113"""
            ),
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """1.11""": {
            """torch""": """1.11.0""",
            """torchvision""": """0.12.0""",
            """torchaudio""": """0.11.0""",
            """python""": 3.9,
            """cuda""": """cu113""",
            """install""": (
                """python3 -m pip install --no-cache-dir -U torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0"""
                """ --extra-index-url https://download.pytorch.org/whl/cu113"""
            ),
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """1.10""": {
            """torch""": """1.10.2""",
            """torchvision""": """0.11.3""",
            """torchaudio""": """0.10.2""",
            """python""": 3.9,
            """cuda""": """cu113""",
            """install""": (
                """python3 -m pip install --no-cache-dir -U torch==1.10.2 torchvision==0.11.3 torchaudio==0.10.2"""
                """ --extra-index-url https://download.pytorch.org/whl/cu113"""
            ),
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        # torchaudio < 0.10 has no CUDA-enabled binary distributions
        """1.9""": {
            """torch""": """1.9.1""",
            """torchvision""": """0.10.1""",
            """torchaudio""": """0.9.1""",
            """python""": 3.9,
            """cuda""": """cu111""",
            """install""": (
                """python3 -m pip install --no-cache-dir -U torch==1.9.1 torchvision==0.10.1 torchaudio==0.9.1"""
                """ --extra-index-url https://download.pytorch.org/whl/cu111"""
            ),
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
    },
    """tensorflow""": {
        """2.11""": {
            """tensorflow""": """2.11.1""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.11.1""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.10""": {
            """tensorflow""": """2.10.1""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.10.1""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.9""": {
            """tensorflow""": """2.9.3""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.9.3""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.8""": {
            """tensorflow""": """2.8.2""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.8.2""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.7""": {
            """tensorflow""": """2.7.3""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.7.3""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.6""": {
            """tensorflow""": """2.6.5""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.6.5""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
        """2.5""": {
            """tensorflow""": """2.5.3""",
            """install""": """python3 -m pip install --no-cache-dir -U tensorflow==2.5.3""",
            """base_image""": """nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04""",
        },
    },
}


if __name__ == "__main__":
   UpperCAmelCase			=    argparse.ArgumentParser("""Choose the framework and version to install""")
   parser.add_argument(
       """--framework""", help="""The framework to install. Should be `torch` or `tensorflow`""", type=str, required=True
   )
   parser.add_argument("""--version""", help="""The version of the framework to install.""", type=str, required=True)
   UpperCAmelCase			=    parser.parse_args()

   UpperCAmelCase			=    past_versions_testing[args.framework][args.version]

   os.system(f'''echo "export INSTALL_CMD=\'{info['install']}\'" >> ~/.profile''')
   print(f'''echo "export INSTALL_CMD=\'{info['install']}\'" >> ~/.profile''')

   UpperCAmelCase			=    """"""
   if args.framework == "pytorch":
      UpperCAmelCase			=    info["""cuda"""]
   os.system(f'''echo \"export CUDA=\'{cuda}\'\" >> ~/.profile''')
   print(f'''echo \"export CUDA=\'{cuda}\'\" >> ~/.profile''')