





# Copyright 2023 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import torch

from accelerate import PartialState
from accelerate.utils.operations import broadcast, gather, gather_object, pad_across_processes, reduce





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				List[str]:







			'''simple docstring'''

			return (torch.arange(state.num_processes ) + 1.0 + (state.num_processes * state.process_index)).to(state.device )





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				Optional[Any]:







			'''simple docstring'''

			UpperCAmelCase   		=				create_tensor(UpperCamelCase__ )
			UpperCAmelCase   		=				gather(UpperCamelCase__ )
			assert gathered_tensor.tolist() == list(range(1			,			state.num_processes**2 + 1 ) )





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				Optional[int]:







			'''simple docstring'''

			UpperCAmelCase   		=				[state.process_index]
			UpperCAmelCase   		=				gather_object(UpperCamelCase__ )
			assert len(UpperCamelCase__ ) == state.num_processes, F"""{gathered_obj}, {len(UpperCamelCase__ )} != {state.num_processes}"""
			assert gathered_obj == list(range(state.num_processes ) ), F"""{gathered_obj} != {list(range(state.num_processes ) )}"""





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				str:







			'''simple docstring'''

			UpperCAmelCase   		=				create_tensor(UpperCamelCase__ )
			UpperCAmelCase   		=				broadcast(UpperCamelCase__ )
			assert broadcasted_tensor.shape == torch.Size([state.num_processes] )
			assert broadcasted_tensor.tolist() == list(range(1			,			state.num_processes + 1 ) )





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				Any:







			'''simple docstring'''

			if state.is_main_process:
						UpperCAmelCase   		=				torch.arange(state.num_processes + 1 ).to(state.device )
			else:
						UpperCAmelCase   		=				torch.arange(state.num_processes ).to(state.device )
			UpperCAmelCase   		=				pad_across_processes(UpperCamelCase__ )
			assert padded_tensor.shape == torch.Size([state.num_processes + 1] )
			if not state.is_main_process:
						assert padded_tensor.tolist() == list(range(0			,			state.num_processes ) ) + [0]





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				List[Any]:







			'''simple docstring'''

			if state.num_processes != 2:
						return
			UpperCAmelCase   		=				create_tensor(UpperCamelCase__ )
			UpperCAmelCase   		=				reduce(UpperCamelCase__			,			'''sum''' )
			UpperCAmelCase   		=				torch.tensor([4.0, 6] ).to(state.device )
			assert torch.allclose(UpperCamelCase__			,			UpperCamelCase__ ), F"""{reduced_tensor} != {truth_tensor}"""





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				List[str]:







			'''simple docstring'''

			if state.num_processes != 2:
						return
			UpperCAmelCase   		=				create_tensor(UpperCamelCase__ )
			UpperCAmelCase   		=				reduce(UpperCamelCase__			,			'''mean''' )
			UpperCAmelCase   		=				torch.tensor([2.0, 3] ).to(state.device )
			assert torch.allclose(UpperCamelCase__			,			UpperCamelCase__ ), F"""{reduced_tensor} != {truth_tensor}"""





def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				int:







			'''simple docstring'''

			main()





def 						__SCREAMING_SNAKE_CASE  (				)  ->				Union[str, Any]:







			'''simple docstring'''

			UpperCAmelCase   		=				PartialState()
			state.print(F"""State: {state}""" )
			state.print('''testing gather''' )
			test_gather(UpperCamelCase__ )
			state.print('''testing gather_object''' )
			test_gather_object(UpperCamelCase__ )
			state.print('''testing broadcast''' )
			test_broadcast(UpperCamelCase__ )
			state.print('''testing pad_across_processes''' )
			test_pad_across_processes(UpperCamelCase__ )
			state.print('''testing reduce_sum''' )
			test_reduce_sum(UpperCamelCase__ )
			state.print('''testing reduce_mean''' )
			test_reduce_mean(UpperCamelCase__ )


if __name__ == "__main__":
				main()










def 						__SCREAMING_SNAKE_CASE  (				UpperCamelCase__ )  ->				list[int]:







			'''simple docstring'''

			if length <= 0 or not isinstance(UpperCamelCase__			,			UpperCamelCase__ ):
						raise ValueError('''Length must be a positive integer.''' )
			return [n * (2 * n - 1) for n in range(UpperCamelCase__ )]


if __name__ == "__main__":
				print(hexagonal_numbers(length=5))
				print(hexagonal_numbers(length=10))



