
    PhH              
       L   d dl Z d dlZd dlmZmZmZmZmZmZ d dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZmZ d#dZd#dZd	eee   ef   d
eee   e	j2                  j4                  j6                  f   fdZdeded
efdZdeeee   f   ded
ee   fdZd
e	j@                  fdZ!dee   d
efdZ"dee   ded
e#fdZ$deded
e#fdZ%ded
e#fdZ&de	j@                  de	j@                  d
ee   fdZ'deedf   de	j@                  dee   d
eedf   fdZ(d ed!ed
ee)   fd"Z*y)$    N)castIterableListSequenceTupleUnion)redistribute_cost)DTensor)
OpStrategy)_PartialDTensorSpec	Placement	ReplicateShardc                       fd}|S )Nc                     t        t              rng}|D ]-  }t        j                  j                  j                  ||        / | S N)
isinstancelistr
   _op_dispatchersharding_propagatorregister_sharding_prop_ruleimpl	overloadsoverloadopschema_infos      nC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/distributed/_tensor/ops/utils.pywrapperz#register_prop_rule.<locals>.wrapper   sG    $R.BRD	!H""66RR$ "      r   r   r    s   `` r   register_prop_ruler$           Nr!   c                       fd}|S )Nc                     t        t              rng}|D ]-  }t        j                  j                  j                  ||        / | S r   )r   r   r
   r   r   register_op_strategyr   s      r   r    z%register_op_strategy.<locals>.wrapper)   sG    $R.BRD	!H""66KK$ " r!   r"   r#   s   `` r   r(   r(   %   r%   r!   xreturnc                     t        |       t        u s.t        | t        j                  j
                  j                        r| S | gS r   )typer   r   torchfximmutable_collectionsimmutable_list)r)   s    r   as_listr1   4   s4     Aw$*Q(F(F(U(UVs
r!   dimndimc                     | dk\  r| S | |z   S )Nr   r"   )r2   r3   s     r   normalize_dimr5   A   s    (3*d
*r!   dimsc           	         t        | t              rt        | |      f} | S t        | t              r| D cg c]  }t        ||       } }| S t        | t              r#t	        | D cg c]  }t        ||       c}      } | S c c}w c c}w )zENormalize a dim or a sequence of dims, so that they are all positive.)r   intr5   r   tuple)r6   r3   r2   s      r   normalize_dimsr:   E   s    $dD)+
 K	 
D$	489DSc4(D9 K 
D%	 $?$3mC.$?@K :?s   B $Bc                    t        | t        j                        r| S t        | t              r| g}n;t	        |       dk(  r"t        | d   t
              rt        | d         }nt        |       }t        j                  |      S )z
    Unify variable types of size argument to torch.Size
    Acceptable types include:
        int, Sequence[int], Tuple[int], Tuple[Sequence[int]],
        or torch.Size
       r   )r   r-   Sizer8   lenr   r   )size
torch_sizes     r   normalize_to_torch_sizerA   P   se     $

#$V
	TaJtAw9$q']
$Z
::j!!r!   xsc                 L    t        j                  t        j                  | d      S )Nr<   )	functoolsreduceoperatormul)rB   s    r   prodrH   c   s    HLL"a00r!   shapespecc                 8   dgt        |       z  }t        |j                        D ]V  \  }}|j                         st	        t
        |      j                  }||xx   |j                  j                  |      z  cc<   X t        |       D ]  \  }}|||   k  s y y)z6Check if the shape is shardable according to the spec.r<   FT)	r>   	enumerate
placementsis_shardr   r   r2   meshr?   )rI   rJ   
shards_mapi	placement	shard_dimdim_sizes          r   is_tensor_shardablerU   g   s     s5z!J!$//29UI.22Iy!TYY^^A%66! 3
 !'8 jm#	 ( r!   c                 @    t        fd| j                  D              S )z%Return True if tensor dim is sharded.c              3   @   K   | ]  }|j                          y wr   )rN   ).0pr2   s     r   	<genexpr>z(is_tensor_dim_sharded.<locals>.<genexpr>{   s     81qzz#s   anyrM   )rJ   r2   s    `r   is_tensor_dim_shardedr]   y   s    8888r!   c                 :    t        d | j                  D              S )z-Return True if tensor is partial on the mesh.c              3   <   K   | ]  }|j                           y wr   )
is_partial)rX   rY   s     r   rZ   z$is_tensor_partial.<locals>.<genexpr>   s     7!q||~s   r[   )rJ   s    r   is_tensor_partialra   ~   s    7t777r!   common_shapeinput_shapec                     t        |       }t        |      }dg|z  }t        dd|z
  d      D ]  }||   | |   k(  s||z   |||z   <    |S )N)r>   range)rb   rc   common_ndim
input_ndimbroadcast_dims_mapidxs         r   infer_broadcast_dims_maprk      sk    
 l#K[!J+Rj"-s|C004>4D{S01 . r!   rM   .ri   c                 X   g }| D ]  }t        |t        t        f      r|j                  |       +t        |t              sJ t        |j                  t        |            }||   }|dk7  r|j                  t	        |             |j                  t                       t        |      S )z=Map each placement based on the output shape after broadcast.re   )	r   r   r   appendr   r5   r2   r>   r9   )rM   rI   ri   new_placementsrR   rS   new_shard_dims          r   map_placements_after_broadcastrp      s     ')N	i)X!67!!),i///%immSZ@I.y9M" %%eM&:; %%ik2'  *   r!   src_strategydst_specc                 v    g }| j                   D ]'  }|j                  t        |j                  |             ) |S r   )
strategiesrm   r	   output_spec)rq   rr   redistribute_costsstrats       r   generate_redistribute_costsrx      s>     ')((!!"3E4E4Ex"PQ ) r!   r   )+rD   rF   typingr   r   r   r   r   r   r-   +torch.distributed._tensor._collective_utilsr	   torch.distributed._tensor.apir
   #torch.distributed._tensor.op_schemar   )torch.distributed._tensor.placement_typesr   r   r   r   r   r$   r(   objectr.   r/   r0   r1   r8   r5   r:   r=   rA   rH   boolrU   r]   ra   rk   rp   floatrx   r"   r!   r   <module>r      s     ? ?  I 1 : 
T&\6!"
 4<77FFFG
+s +# +# +sHSM12 # (3- "UZZ "&1Xc] 1s 1x} K D $9 9# 9$ 9
8K 8D 8
**+0::	#Y!in%!::! S	! 9c>	!>(3	%[r!   