
    Ph5              	       n   d dl mZ d dlZd dlmc mZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZmZmZmZ d dl m!Z!  G d de      Z" e"d      Z# ed      Z$ edddi d d d      Z%d Z&d Z' G d dejP                  jR                        Z*d Z+d Z,d Z-e$j]                  ej^                        d        Z0e$j]                  ejb                        d        Z2e$j]                  e      d        Z3e$j]                  e      d        Z4e$jj                  d        Z6y)    )nullcontextN)DispatchKey)suspend_functionalization)	AOTConfigcreate_jointfrom_fun)!_has_potential_branch_input_alias$_has_potential_branch_input_mutation!UnsupportedAliasMutationException)HigherOrderOperator)FakeTensorMode)FunctionalTensorFunctionalTensorModeunset_functional_temporarily)disable_proxy_modes_tracingmake_fxProxyTorchDispatchModetrack_tensor_tree)StorageWeakRefc                       e Zd Zd Zy)
MapWrapperc                     t        |g| S N)map_wrapper)selfxsargss      fC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_higher_order_ops/map.py__call__zMapWrapper.__call__!   s    2%%%    N)__name__
__module____qualname__r    r    r   r   r       s    &r    r   mapmap_implF)fw_compilerbw_compilerpartition_fndecompositionsnum_params_buffersaot_idkeep_inference_input_mutationsc                 (    |d  }|d  }t               5  t               5  t               5  d }t        |      d   D cg c]
  } ||       }}|D cg c]&  }t	        |t
        j                        r ||      n|( }	}t        j                  |  g ||	       }
t        d |
D              r&t        d|
D cg c]  }t        |       c} d      |
D cg c]
  } ||       }} t               g ||	 }d d d         fd}t              t              z    t        |      g ||	 }|fcd d d        cd d d        S c c}w c c}w c c}w c c}w # 1 sw Y   fxY w# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nc                 (   t        | t        j                        r| j                  t        j                  k7  rIt        j
                  | j                         | j                         | j                  | j                        S | }t        | t              r0t        j                  |        t        |       }|j                         S t        j                  |       r*t        j                  |        t        j                  |       }|j                         S | S )N)dtyperequires_grad)
isinstancetorchTensorr0   boolempty_stridedsizestrider1   r   _syncr   _is_functional_tensor_from_functional_tensorclone)tmaybe_unfunc_ts     r   	_from_funz%create_fw_bw_graph.<locals>._from_funI   s    a.ww%**,$22FFHHHJ"#''*+//	   *+%a)9:!KKN-5a[N  .3355 #88; "KKN-2-J-J1-MN-3355r    r   c              3   V   K   | ]!  }|t        |t        j                          # y wr   r2   r3   r4   ).0outs     r   	<genexpr>z%create_fw_bw_graph.<locals>.<genexpr>k   s+      +C? sELL11+s   ')z?Expect outputs of map only contains tensors or None. Got types .c                     | d  }| d  }|d  }|d  }fd}t        |t              } |t        |      t        |      z   |D cg c]  }||j                  r| c}      \  }}	| D 
ch c]5  }
t	        |
t
        j                        rt        |
j                               7 c}
fd}t        j                  ||	      S c c}w c c}
w )Nc                       |  }||D cg c],  }t        |t        j                        r|j                  rdnd. c}fS c c}w )NTF)r2   r3   r4   r1   )r   fw_outretfs      r   fw_with_masksz:create_fw_bw_graph.<locals>.joint_f.<locals>.fw_with_masks   s_    D  &	   & "#u||49J9J   &	     s   1A)
aot_configc                     t        | t        j                        r+t        | j	                               v r| j                         S | S r   )r2   r3   r4   r   _typed_storager<   )r=   input_storages    r   maybe_clonez8create_fw_bw_graph.<locals>.joint_f.<locals>.maybe_clone   s8    q%,,/&q'7'7'9:mK779$r    )r   dummy_aot_configlistr1   r2   r3   r4   r   rN   pytreetree_map)example_argsjoint_mapped_argsr   mapped_inputmapped_gradsrK   jointgrad_gradsargrP   rO   rJ   joint_num_mappednum_mapped_argss               @r   joint_fz#create_fw_bw_graph.<locals>.joint_fx   s     ,->.> ? 0 12D,-=o>L,_-=>L !;KLE\"T$Z/ !- ,'D,>,>  ,HAu ('Cc5<<0 s1134'M ??;66/s   	C
.:C)r   r   r   _unstack_pytreer2   r3   r4   rS   rT   anyRuntimeErrortyper   len)rJ   r_   r   	mapped_xspos_argsr?   r   
example_xsr]   example_pos_argsexample_flat_outrC   example_gradfw_graphr`   joint_graphr^   s   ``              @r   create_fw_bw_graphrn   3   s   %o&IO$%H" 
#	$&B&D(*2 3B)2LQ2OP2OB)B-2OJP $ #C #-S%,,"?	#SH#     &1<j<+;<   + 
 #!7G!H7G$s)7G!H IL  7GG6FsIcN6FLG!wqzA:A0@AH_ +b*	7X |,s:>&gg&U
U\UDTU$A 'E&D	$	$8 Q  "IG[ +* 'E&D	$	$	$so   FE3E'E
E'+E
<E'>EE'E"
-E'>E3 	FE''E0,E33E<	8FFc                    	 t        j                  |      \  }	t        d |D              st        d| d      t	        |      |D cg c]  }|j
                   }}|d   d   dk(  rt        d      t        fd|D              rt        d| d      d  	fd}t        j                  t        |g||       S c c}w )	Nc              3   P   K   | ]  }t        |t        j                           y wr   rA   )rB   r=   s     r   rD   zmap_wrapper.<locals>.<genexpr>   s     <Gqz!U\\*G   $&z.Mapped xs can only consist of tensors. Got xs rE   r   z,Leading dimensions of mapped xs cannot be 0.c              3   .   K   | ]  }|d    k7    ywr   Nr$   )rB   	cur_shapeleading_dim_sizes     r   rD   zmap_wrapper.<locals>.<genexpr>   s     
DV	9Q<++Vs   z?Leading dimensions of mapped xs must be consistent. Got shapes c                      t        j                  t        | d              } |g| d   }t        j                  |      \  }}||S r   )rS   tree_unflattenrR   tree_flatten)		flat_argsr   unflattened_outflat_outtmp_out_specrJ   r_   out_specxs_specs	        r   flat_fnzmap_wrapper.<locals>.flat_fn   sZ    ""4	2B?(C#DgNB=?+;!<=!'!4!4_!E,  r    )	rS   rx   allrc   re   shaperb   rw   r&   )
rJ   r   r   flat_xsshapesr   ru   r_   r}   r~   s
   `     @@@@r   r   r      s    **2.GW<G<<KG9TUVWW'lO!()2bhhF)ay|1IJJ

DV
DDMfXUVW
 	
 H   /;G;d;X + *s   Cc                   ,    e Zd Zed        Zed        Zy)MapAutogradOpc                      | j                   |  || _        || _        t        j                  j                         5  g t        ||g| cd d d        S # 1 sw Y   y xY wr   )save_for_backward_joint_graph_num_mapped_argsr3   _C_AutoDispatchBelowAutogradr&   )ctxrl   rm   r_   ry   s        r   forwardzMapAutogradOp.forward   sR    y)&.XX002FXhD)DF 322s   AAc                     | j                   }|d | j                   }|| j                  d  }t        | j                  | j                  t	        |      z   g||| }d d d g|S r   )saved_tensorsr   r&   r   re   )r   
flat_gradsfw_argsfw_mapped_argsrg   r\   s         r   backwardzMapAutogradOp.backward   s    ## !73#7#783//12  3z?2
 
 	

 
 T4'%''r    N)r!   r"   r#   staticmethodr   r   r$   r    r   r   r      s*    G G ( (r    r   c                    t        |d |       }t        ||d        }|d   j                  d   t        |      d   }|}t        |t        j
                  j                        s t        |      g || }t               5   |g || }	fd}
t        j                  |
|	      }d d d        d }d}|s0d| }t        | j                  j                  |      r|dz  }n|}|s0| j                  j                  j                  ||       ||g|}t        j                  | j                  j                  |      }| j                  j!                  d||i d      }t#        |d | j                        S # 1 sw Y   xY w)	Nr   c                 v    t        | t        j                        r | j                  g| j                   S | S r   )r2   r3   r4   expandr   )r=   ru   s    r   expand_tensorz trace_map.<locals>.expand_tensor   s1    !U\\*qxx 0;177;;Hr    body_graph_   call_functionr&   )name)constanttracer)rR   r   ra   r2   r3   fxGraphModuler   r   rS   rT   hasattrr   rootregister_moduleunwrap_proxycreate_proxyr   )
proxy_modefunc_overloadrJ   
num_mappedr   r   rg   example_input
body_graphexample_outsr   expanded_outs	next_namei	candidate	node_args
proxy_args	out_proxyru   s                     @r   	trace_mapr      s   	d;J	 BD%&H!u{{1~#B'*MJj%(("6"67(WZ(C-C(C
	$	&!<=<8<	
 |D 
' I	A!!%	:$$))95FA!I  **9jAZ/$/I!2!2!?!?KJ!!..
BZ / I y4
8I8I 3 
'	&s   &E55E>c                    t        j                  |       \  }t        d D              st        d       t        fdD              s&t        dD  cg c]  } | j                   c}        t        d D              rt        nt        } |       5  t         }d d d        g }D ]'  }|j                  t        j                  ||             ) |S c c} w # 1 sw Y   >xY w)Nc              3   P   K   | ]  }t        |t        j                           y wr   rA   )rB   r   s     r   rD   z"_unstack_pytree.<locals>.<genexpr>  s     >gz"ell+grq   zLeaves of xs must be Tensor c              3   b   K   | ]&  }|j                   d    d    j                   d    k(   ( ywrs   )r   )rB   r   r   s     r   rD   z"_unstack_pytree.<locals>.<genexpr>  s.     DGbrxx{gaj..q11Gs   ,/z3Leaves of xs must have same leading dimension size c              3   <   K   | ]  }t        |t                y wr   )r2   r   )rB   xs     r   rD   z"_unstack_pytree.<locals>.<genexpr>  s     @1z!-.s   )rS   rx   r   rc   r   rb   r   r   zipappendrw   )r   inspecr   apytreestupler   s         @r   ra   ra   
  s    ))"-OGV>g>>9'CDDDGDDAV]B^V]PR288V]B^A_`
 	
 @@@ 	 
 
M 
 Gv,,UF;< N C_ 
s   C
	CC(c                    g }d }| D ]+  }t        j                  |      \  }}|j                  |       - |J t        | }g }|D ]k  }t	        d |D              r%|j                  t        j                  |             :t	        d |D              r|j                  d        ^t        d| d       t        j                  ||      S )Nc              3   P   K   | ]  }t        |t        j                           y wr   rA   rB   leafs     r   rD   z _stack_pytree.<locals>.<genexpr>,  s     A&$z$-&rq   c              3   $   K   | ]  }|d u  
 y wr   r$   r   s     r   rD   z _stack_pytree.<locals>.<genexpr>.  s     1&$&s   zCannot stack rE   )	rS   rx   r   r   r   r3   stackrc   rw   )r   r{   r}   ptflat_ptbstacked_outleavess           r   _stack_pytreer   "  s    HH"//3   XAKA&AAu{{6231&11 t$vha899    h77r    c                     |d | }||d  }g }t        |      D ]  }|j                   | g ||         t        |      S r   )ra   r   r   )rJ   r_   r   r   rg   r   inps          r   	map_denser   8  sT    		BO$%HGr"q)#))* #!!r    c                 V    t        | |g| \  }}t        j                  |||g| }|S r   )rn   r   apply)rJ   r_   r   rl   bw_graphr{   s         r   map_autogradr   B  s6    +AFFHh""8XNNHOr    c                 Z    | j                   rt        | t        ||g| S t        ||g| S r   )enable_tracingr   r&   moderJ   r   r   s       r   map_proxy_torch_dispatch_moder   I  s3    xJ>>>:---r    c                 L    | 5  t        ||g| cd d d        S # 1 sw Y   y xY wr   )r   r   s       r   map_fake_tensor_moder   Q  s    	J.. 
s   #c                    |d | }||d  }| j                  |      }| j                  |      }| j                  |      }| j                         5  t               5  g t	        |      d   |}	d d d        t        |	      rt        d      t        ||	      rt        d      t        ||g|| }
| j                  |
      cd d d        S # 1 sw Y   `xY w# 1 sw Y   y xY w)Nr   z torch.map is mutating the input!z torch.map is aliasing the input!)
unwrap_tensorsfunctionalizeredispatch_to_nextr   ra   r
   r   r	   r&   wrap_tensors)r   rJ   r   r   r   rg   unwrapped_xsunwrapped_args
wrapped_fnexample_inputs
map_returns              r   map_functionalizer   W  s    	kz	BJK H%%b)L''1N""1%J				!(*Q|<Q?Q.QN +/>B34VWW,Q?34VWWj*U|UnU

+ 
"	!** 
"	!s%   CC-ACC	CC!)7
contextlibr   r3   torch.utils._pytreeutils_pytreerS   torch._Cr   torch._dispatch.pythonr   torch._functorch.aot_autogradr   r   r   torch._higher_order_ops.condr	   r
   r   
torch._opsr   torch._subclasses.fake_tensorr   #torch._subclasses.functional_tensorr   r   r   "torch.fx.experimental.proxy_tensorr   r   r   r    torch.multiprocessing.reductionsr   r   r%   r&   rQ   rn   r   autogradFunctionr   r   ra   r   py_implCompositeExplicitAutogradr   Autogradr   r   r   py_functionalize_implr   r$   r    r   <module>r      sa   "  $ $   < K K 
 + 8 
  <
&$ &
 z*#( s%l@(ENN++ (2%P08, 
+778" 9" 
+&&' ( 
(). *. 
.!/ "/
 
,  ,r    