
    Vh"              	       |   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 d dl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 d	lmZmZmZmZ d
dlmZmZmZm Z m!Z!m"Z"m#Z#  G d de      Z$ G d de      Z% e$       Z& e%       Z' e
dddi d d d      Z(d Z)d Z* G d de jV                  jX                        Z-d Z.e'j_                  ej`                        d        Z1e'j_                  ejd                        d        Z3e'j_                  e      d        Z4e'j_                  e      d        Z5e'jl                  d        Z7y)    N)DispatchKey)suspend_functionalization)	AOTConfigcreate_joint)!_has_potential_branch_input_alias$_has_potential_branch_input_mutation_maybe_run_with_interpreterreenter_make_fx!UnsupportedAliasMutationException)HigherOrderOperator)FakeTensorMode)disable_functional_mode)disable_proxy_modes_tracingmake_fxProxyTorchDispatchModetrack_tensor_tree   )	_from_fun_stack_pytree_unstack_pytreeclone_outputs_aliasing_inputsprepare_fw_with_masks%save_tensors_and_symints_for_backwardsaved_tensors_and_symintsc                   $     e Zd Z fdZd Z xZS )
MapWrapperc                 $    t         |   d       y )Nmapsuper__init__self	__class__s    K/home/dcms/DCMS/lib/python3.12/site-packages/torch/_higher_order_ops/map.pyr!   zMapWrapper.__init__&   s        c                     t        |g| S N)map_wrapper)r#   xsargss      r%   __call__zMapWrapper.__call__)   s    2%%%r&   __name__
__module____qualname__r!   r,   __classcell__r$   s   @r%   r   r   %   s     &r&   r   c                   (     e Zd Z fdZ fdZ xZS )MapImplc                 $    t         |   d       y )Nmap_implr   r"   s    r%   r!   zMapImpl.__init__.   s    $r&   c                 "    t        |   |i |S r(   )r    r,   )r#   r+   kwargsr$   s      r%   r,   zMapImpl.__call__1   s    w000r&   r-   r2   s   @r%   r4   r4   -   s    %1 1r&   r4   F)fw_compilerbw_compilerpartition_fndecompositionsnum_params_buffersaot_idkeep_inference_input_mutationsc                 :    |d  }|d  }t               5  t               5  t               5  t        j                  t
        |      }t        |      d   }|D cg c])  }t        |t        j                        rt        |      n|+ }}t        j                  t
          g ||       }	t        d |	D              r&t        d|	D 
cg c]  }
t        |
       c}
 d      |	D 
cg c]  }
t        |
       }}
 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 # 1 sw Y   axY w# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   c              3   V   K   | ]!  }|t        |t        j                          # y wr(   
isinstancetorchTensor).0outs     r%   	<genexpr>z%create_fw_bw_graph.<locals>.<genexpr>V   s+      ? sELL11s   ')z?Expect outputs of map only contains tensors or None. Got types .c                  &   | d  }| d  }|d  }|d  }t        t        
      t              } |t        |      t        |      z   |D cg c]  }||j                  r| c}      \  }}t        |       }	t        j                  |	|      S c c}w )N)
aot_config)r   r   dummy_aot_configlistrequires_gradr   pytreetree_map)example_argsjoint_mapped_argsr+   mapped_inputmapped_gradsjointgrad_gradsmaybe_clonefjoint_num_mappednum_mapped_argss             r%   joint_fz#create_fw_bw_graph.<locals>.joint_fc   s     ,->.> ? 0 12D,-=o>L,_-=>L !6q!9FVWE\"T$Z/ !-'D,>,> HAu 8EK??;66s   B
)r   r   r   rO   rP   r   r   rC   rD   rE   anyRuntimeErrortyper   len)rZ   r\   r+   	mapped_xspos_argsunwrapped_mapped_xs
example_xsargexample_pos_argsexample_flat_outrG   example_gradfw_graphr]   joint_graphr[   s   ``             @r%   create_fw_bw_graphrl   D   s   %o&IO$%H 
#	$ 2%&=&? 2%(* 	B"(//)Y"G()<=a@J $  #-S%,,"?	#SH     &1<j<+;<   + 
 #!7G!H$s)!H IL  7GGsIcNGLG!wqzA:A0@AH-	B0	7. |,s:>&gg&U
U\UDTU$e2% 2% 2%
  "IG)	B 	B2% 2% 2% 2% 2%sd   FE<-E0.E!
	A E0	E&E0)E+
;E0>E<	F!E00E95E<<F	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        |||            S c c}w )	Nc              3   P   K   | ]  }t        |t        j                           y wr(   rB   )rF   ts     r%   rH   zmap_wrapper.<locals>.<genexpr>   s     <qz!U\\*<s   $&z.Mapped xs can only consist of tensors. Got xs rI   r   z,Leading dimensions of mapped xs cannot be 0.c              3   .   K   | ]  }|d    k7    yw)r   N )rF   	cur_shapeleading_dim_sizes     r%   rH   zmap_wrapper.<locals>.<genexpr>   s     
D	9Q<++
Ds   z?Leading dimensions of mapped xs must be consistent. Got shapes c                      t        j                  t        | d              } |g| d   }t        j                  |      \  }}||S r(   )rO   tree_unflattenrM   tree_flatten)		flat_argsr*   unflattened_outflat_outtmp_out_specrZ   r\   out_specxs_specs	        r%   flat_fnzmap_wrapper.<locals>.flat_fn   sZ    ""4	2B?(C#DgNB=?+;!<=!'!4!4_!E,  r&   )	rO   rv   allr_   ra   shaper^   ru   r6   )
rZ   r*   r+   flat_xsshapesr}   rs   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   '4(( + *s   C	c                   ,    e Zd Zed        Zed        Zy)MapAutogradOpc           	          t        | |       || _        || _        t        j                  j                         5  g t        ||d | ||d        cd d d        S # 1 sw Y   y xY wr(   )r   _joint_graph_num_mapped_argsrD   _C_AutoDispatchBelowAutogradr6   )ctxrj   rk   r\   rw   s        r%   forwardzMapAutogradOp.forward   sj    -c9=&.XX002 	i(899_EU;V	 	 	s   AA"c                     t        |       }|d | j                   }|| j                  d  }t        | j                  ||z   |      }d d d g|S r(   )r   r   r6   r   )r   
flat_gradsfw_argsfw_mapped_argsrc   rX   s         r%   backwardzMapAutogradOp.backward   sd    +C0 !73#7#783//12Z'

 T4'%''r&   N)r.   r/   r0   staticmethodr   r   rq   r&   r%   r   r      s(    	 	 
( 
(r&   r   c                 l   |d   j                   d   t        |      d   }|} t        |      g || }| j                  j	                  d      }| j                  j
                  j                  ||       t               5   |g || }fd}	t        j                  |	|      }
d d d        |t        |      t        |      f}t        j                  | j                  j                  |      }| j                  j                  d||i d      }t        
|d | j                        S # 1 sw Y   xY w)Nr   body_graph_c                 v    t        | t        j                        r | j                  g| j                   S | S r(   )rC   rD   rE   expandr   )ro   rs   s    r%   expand_tensorz trace_map.<locals>.expand_tensor   s1    !U\\*qxx 0;177;;Hr&   call_functionr6   )name)constanttracer)r   r   r
   r   get_fresh_qualnamerootregister_moduler   rO   rP   rM   unwrap_proxycreate_proxyr   )
proxy_modefunc_overloadrZ   r*   rc   example_input
body_graph	next_nameexample_outsr   expanded_outs	node_args
proxy_args	out_proxyrs   s                 @r%   	trace_mapr      s2   !u{{1~#B'*MJ,,GmGhGJ!!44]CI**9jA	$	& E!<=<8<	
 |DE T"XtH~6I!2!2!?!?KJ!!..
BZ / I y4
8I8I E Es   &D**D3c                 b    t        |      D cg c]  } | g ||  }}t        |      S c c}w r(   )r   r   )rZ   r*   rc   inppytreess        r%   	map_denser      s8    -<R-@Acq!#!!AGA!! Bs   ,c                 t    t        |      }t        | |g|| \  }}t        j                  |||g|| }|S r(   )ra   rl   r   apply)rZ   r*   rc   r\   rj   bw_graphry   s          r%   map_autogradr      sI    "gO+AOOhOHh""8XWWhWHOr&   c                 (    t        | t        |||      S r(   )r   r6   moderZ   r*   r+   s       r%   map_proxy_torch_dispatch_moder      s    T8QD11r&   c                 L    | 5  t        |||      cd d d        S # 1 sw Y   y xY wr(   )r   r   s       r%   map_fake_tensor_moder      s&    	 &B%& & &s   #c                    | j                  |      }| j                  |      }| j                  t        |            }| j                         5  t	               5  g t        |      d   |}d d d        t        | d      xr | j                  j                  }t        ||      rt        d      t        |||      rt        d      t        |||      }	| j                  |	      cd d d        S # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   )pre_dispatchz torch.map is mutating the input!z torch.map is aliasing the input!)unwrap_tensorsfunctionalizer	   redispatch_to_nextr   r   hasattrr   r   r   r   r   r6   wrap_tensors)
r   rZ   r*   rc   unwrapped_xsunwrapped_args
wrapped_fnexample_inputsr   
map_returns
             r%   map_functionalizer      s   %%b)L''1N""#>q#ABJ				! ,(* 	RQ|<Q?Q.QN	RsF+E0E0E/~L
 44VWW,~L
 44VWWj,G

+, ,	R 	R, ,s%   C=C1,A;C=1C:	6C==D)8rD   torch.utils._pytreeutils_pytreerO   torch._Cr   torch._dispatch.pythonr   torch._functorch.aot_autogradr   r   torch._higher_order_ops.utilsr   r   r	   r
   r   
torch._opsr   torch._subclasses.fake_tensorr   #torch._subclasses.functional_tensorr   "torch.fx.experimental.proxy_tensorr   r   r   r   r   r   r   r   r   r   r   r   r4   r   r6   rL   rl   r)   autogradFunctionr   r   py_implCompositeExplicitAutogradr   Autogradr   r   r   py_functionalize_implr   rq   r&   r%   <module>r      sZ    $ $   < A  + 8 G   &$ &1! 1 l9#( 8%v@(ENN++ (6@ 
+778" 9"
 
+&&' ( 
()2 *2 
.!& "&
 
,  ,r&   