
    Ph]                         d dl mZ d dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d Z G d dej&                        Z G d	 d
ej*                        Zd Zej0                  j3                  deddg       y)    N)_create_work_from_futureAllgatherOptionsAllreduceOptionsBarrierOptionsReduceScatterOptionsBroadcastOptionsScatterOptionsAllToAllOptions)Future)List)Tensorc                 N    t               }|j                  |        t        |      S N)r   
set_resultr   )retfuts     vC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/testing/_internal/distributed/fake_pg.pyret_workr      s     
(CNN3#C((    c            
           e Zd ZdZ fdZ e       fdZ e       fdZ e       fdZ	 e
       fdZ e       fdZ e
       fdZ e       fd	Z e       fd
ee   fdZ e       fdee   deee      fdZ e       fdee   dee   fdZ e       fdededee   dee   fdZd
ee   dedefdZd
ee   dedefdZd Zd Z xZS )FakeProcessGroupa  
    A fake process group (not related to FakeTensor) is a process group which
    doesn't actually do any communication, it just hallucinates some
    communication.  You can run a single rank with a fake process group
    without needing multiple processes (simulates per-rank behavior)

    NOTE: This is not a real process group, and it would produce wrong results
    for every collective. It should be used as a convinient tool when playing
    with distributed but don't care about the actual data.
    c                 B    t         |   ||       || _        || _        y r   )super__init___rank_world_size)selfrank
world_size	__class__s      r   r   zFakeProcessGroup.__init__$   s!    z*
%r   c                     t        |      S r   r   r   tensor_listoptss      r   	allreducezFakeProcessGroup.allreduce)       $$r   c                     t        |      S r   r"   r#   s      r   allreduce_coalescedz$FakeProcessGroup.allreduce_coalesced,   r'   r   c                 T    |d   D ]  }|j                  |d           t        |      S )Nr   )copy_r   )r   output_tensorsinput_tensorr%   chunks        r   	allgatherzFakeProcessGroup.allgather/   s.     $A&EKKQ( '''r   c                     t        |      S r   r"   )r   output_tensorscatter_listr%   s       r   reduce_scatterzFakeProcessGroup.reduce_scatter9       &&r   c                 ~    |j                  | j                        }|D ]  }|j                  |        t        |      S r   )r.   r   r+   r   )r   r1   r-   r%   chunksr.   s         r   _allgather_basez FakeProcessGroup._allgather_base<   s;     $$T%5%56EKK% &&r   c                     t        |      S r   r"   )r   r1   r-   r%   s       r   _reduce_scatter_basez%FakeProcessGroup._reduce_scatter_baseK   r4   r   c                      y r    )r   r%   s     r   barrierzFakeProcessGroup.barrierN   s    r   tensorsc                     t        |      S r   r"   )r   r=   r%   s      r   	broadcastzFakeProcessGroup.broadcastR   s      r   r,   input_tensorsc                     t        |      S r   r"   r   r,   r@   r%   s       r   scatterzFakeProcessGroup.scatterU        ''r   c                     t        |      S r   r"   rB   s       r   alltoallzFakeProcessGroup.alltoall]   rD   r   r1   r-   output_split_sizesinput_split_sizesc                     t        |      S r   r"   )r   r1   r-   rG   rH   r%   s         r   alltoall_basezFakeProcessGroup.alltoall_basee   s     &&r   dstRanktagc                     t        d       S r   r"   )r   r=   rK   rL   s       r   sendzFakeProcessGroup.sendo   s     ~r   srcRankc                     t        |      S r   r"   )r   r=   rO   rL   s       r   recvzFakeProcessGroup.recvw   s       r   c                      y)Nfaker;   r   s    r   getBackendNamezFakeProcessGroup.getBackendName   s    r   c                 :    d| j                    d| j                   S )NzFakePG world_size:z rank:)r   r   rT   s    r   __repr__zFakeProcessGroup.__repr__   s     #D$4$4#5VDJJ<HHr   )__name__
__module____qualname____doc__r   r   r&   r)   r   r/   r   r3   r7   r9   r   r<   r   r   r   r?   r	   rC   r
   rF   intrJ   rN   rQ   rU   rW   __classcell__)r    s   @r   r   r      sl   	&
 +;*< % 5E4F % <L;M ( @T?U ' AQ@R ' FZE[ ' *+  5E4F !f ! 	(V( DL)( 	(V( F|( '' ' !I	'
  9'f  	!f! ! 	!Ir   r   c                       e Zd ZdZy)	FakeStorez
    A fake store is a fake Key-Value store simply for initialization usage
    the of fake process group, one can either use FakeStore or HashStore.
    N)rX   rY   rZ   r[   r;   r   r   r_   r_      s     	r   r_   c                     t        ||      S r   )r   )prefix_storer   r   timeouts       r   _create_fake_pgrc      s    D*--r   rS   cpucuda)devices)torch.distributeddistributeddisttorch._C._distributed_c10dr   r   r   r   r   r   r	   r
   torch.futuresr   typingr   torchr   r   ProcessGroupr   Storer_   rc   Backendregister_backendr;   r   r   <module>rr      sr     	 	 	 !  )jIt(( jIZ	

 	.   fov  Or   