
    sgb                        d dl Z d dl mZ d dlZd dl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 d dlmc mZ d dlmZ d dlZd	 Zd
 Zd Zd Zd ZddZd Zd Zd Z d Z!d Z"ddZ#d Z$d Z%d Z&ddZ'	 	 ddefdZ(ddefdZ)y)     N)Tensor)TorchDispatchMode)tree_maptree_flattentree_unflatten)_pytree)partial)no_dispatchall_same_mode)Callablec                 d    | j                   } ||       } ||      }||k(  ry t        d| d      )Nz.This operator is not Composite Compliant: the zR of the tensor was modified directly without going through the PyTorch dispatcher.)elemRuntimeError)wrapper_tensormetadata_namemetadata_accessorr   metadata_wrapper_tensormetadata_elems         _/var/www/html/venv/lib/python3.12/site-packages/torch/testing/_internal/composite_compliance.pycheck_attr_consistencyr      sL    D/?%d+M-/

8/ 0	12 2    c                     t        | |      sy t        j                  d d t        j                  t        j                  t        j
                  d}|j                         D ]  \  }}t        | ||        y )Nc                     | j                   S N)dtypexs    r   <lambda>z,check_metadata_consistency.<locals>.<lambda>"   s
    177 r   c                     | j                   S r   )devicer   s    r   r   z,check_metadata_consistency.<locals>.<lambda>#   s
    AHH r   )shaper   r    numelstridestorage_offset)
isinstancer   sizer"   r#   r$   itemsr   )r   CCTthings_to_checkr   r   s        r   check_metadata_consistencyr*      si    nc*"$-- //O -<,A,A,C Q((~}>OPQr   c                 2    | j                   j                  dv S )N>"   timagrealview_conjaliaschunkslicesplitdetachexpandhsplitnarrowselectunbindunfoldvsplitmovedimpermutesqueezeview_asdiagonalswapaxes	expand_as	transpose	unflatten	unsqueeze
as_strided_unsafe_viewtensor_splitview_as_real_reshape_aliasview_as_complexsplit_with_sizesoverloadpacket__name__funcs    r   
is_view_fnrS   +   s     '' #, # #r   c                 2    | j                   j                  dv S )N>   t_detach_squeeze_	swapaxes_	swapdims_
transpose_
unsqueeze_as_strided_rN   rQ   s    r   is_inplace_view_fnr]   S   s     '' 	, 	 	r   c                     | j                   j                  }t        j                  d|      ryt        j                  d|      ry|d   dk(  S )Nz__i.+__Tz__.+__F_)rO   rP   rematch)rR   names     r   
is_inplacerd   a   sC    ''D	xx	4 	xx$8s?r   c                 r      G fddt         j                         G  fddt              } |       fS )Nc                   `    e Zd ZU ej                  ed<   dgZed        Zd Z	e
d fd	       Zy)7generate_cct_and_mode.<locals>.CompositeCompliantTensorr   c                 ~   t        |      | usJ d       t        j                  j                  | |j	                         |j
                  |j                  |j                  |j                  |j                         |j                               }|j                  rxt        j                  |j                  |j                         |j
                  |j                  |j                  d      }|j                  |j                                ||_        n||_        |j                         |j                  j                         k(  sJ t        j                   j#                  ||j                  j%                                t        j                   j'                  ||j                  j)                                ||_        |S )NzRWrapping a CompositeCompliantTensor in a CompositeCompliantTensor is not supported)r   layoutr    requires_gradstridesr$   F)r   r    ri   rj   )typetorchr   _make_wrapper_subclassr&   r   ri   r    rj   r#   r$   empty_stridedr!   copy_r5   r   _C	_set_conjis_conj_set_negis_negmode)clsr   rv   argskwargsrtmps          r   __new__z?generate_cct_and_mode.<locals>.CompositeCompliantTensor.__new__y   sC   :S( ede( 33TYY[jj{{$2D2Dd6I6I6K	 4 MA !! ))$**dkkm4::15T[[8=? 		$++-(88:000
 HHq!&&.."23HHa1AFHr   c                 "    d| j                    dS )NzCompositeCompliantTensor())r   )selfs    r   __repr__z@generate_cct_and_mode.<locals>.CompositeCompliantTensor.__repr__   s    .tyyk;;r   Nc                     t        j                  |i |xs i }t        fd|D              }t        |      st	        d      |d   5   ||i |cd d d        S # 1 sw Y   y xY w)Nc              3   P   K   | ]  }t        |      s|j                    y wr   )r%   rv   ).0eCompositeCompliantTensors     r   	<genexpr>z]generate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__.<locals>.<genexpr>   s     ^QjD\6]!&&^s   &&z*Multiple CompositeCompliantTensorModes NYIr   )pytreearg_tree_leavestupler   r   )rw   rR   typesrx   ry   all_argsmodesr   s          r   __torch_dispatch__zJgenerate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__   si    --tF"FH^(^^E '"#OPPq -T,V,- - -s   
AA% N)rP   
__module____qualname__rm   r   __annotations__	__slots__staticmethodr|   r   classmethodr   )r   s   r   r   rg   t   s@    llH		"	 
"	H	< 
	- 
	-r   r   c                       e Zd Zd fd	Zy);generate_cct_and_mode.<locals>.CompositeCompliantTensorModeNc                     fd} fd}|t         j                  j                  j                  j                  k(  rt        d      |j                  j                  dv rt        |j                   d      t        |      rA|d   }t        |      s0t        fd|dd  D              rt        d	|j                   d
      t        ||      }t        ||      }	 ||i |	}
t        ||
      }t        |      rjrht               5   ||i |}t        |t        t        f      r&t!        ||      D ]  \  }}|j#                  |        n|j#                  |       d d d        t               5  t%        |      r ||i | d d d        t'        t(              }t+        j,                  ||       t+        j,                  ||       t+        j,                  ||       |S # 1 sw Y   xY w# 1 sw Y   jxY w)Nc                 8    t        |       r| j                  S | S r   r%   r   )r   r   s    r   unwrapz^generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.unwrap   s    !+A/G!HqvvOaOr   c                 N    t        | t        j                        r	 |       S | S r   r%   rm   r   )r   r   r   s    r   wrapz\generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.wrap   s$    <Fq%,,<W/48^]^^r   z.item() is not allowed to be called inside of composite functions in the PyTorch library because not all backends and/or Tensor subclasses (e.g. vmap, ProxyTensor) support them.)set_resize_z; is not allowed to be called inside of Composite operators.r   c              3   6   K   | ]  }t        |        y wr   )r%   )r   ar   s     r   r   zagenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.<genexpr>   s     VJq*BCVs      z7Not composite compliant: performing in-place operation z where the Tensor being written to is regular Tensor but the other tensors are Tensor Subclasses. Please try to avoid this in-place operation.)r(   )rm   opsaten_local_scalar_densedefaultr   rO   rP   rd   r%   anyr   rS   r
   r   listzipr   r]   r	   r*   r   	tree_map_)r   rR   r   rx   ry   r   r   mutated_argumentunwrapped_argsunwrapped_kwargsunwrapped_rsrsresultr   bcheckr   autograd_view_consistencys   `               r   r   zNgenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__   s   P_ uyy~~99AAA"VW W
 ""++/BB"}}o &+ ,- - $ $(7 !"24LMVTRSRTXVV&Q==/ *GGH H &fd3N'7D3CDL$-B$$= !] ( "4262F!&5$-8$'FO &DAqFF1I& #(,  *%d+$)&)* 6<TUEUD)UF+UB'IC( (,* *s   	AG"1G."G+.G7r   )rP   r   r   r   )r   r   s   r   CompositeCompliantTensorModer      s	    J	r   r   )rm   r   r   )r   r   r   s   ` @r   generate_cct_and_moder   j   s5    4-5<< 4-lK'8 KZ $%A%CCCr   c                     t        | t              st        | t              syt        |       dk(  ryt	        d | D              }|ryt	        d | D              }|rt        d      y)NFr   c              3   P   K   | ]  }t        |t        j                           y wr   r   r   elts     r   r   z is_tensorlist.<locals>.<genexpr>   s     Cjell3C   $&Tc              3   P   K   | ]  }t        |t        j                           y wr   r   r   s     r   r   z is_tensorlist.<locals>.<genexpr>  s     IcJsELL9Ir   zVThis test assumes that PyTorch APIs cannot take mixed lists of Tensor and other things)r%   r   r   lenallr   )lstall_tensorsexists_one_tensors      r   is_tensorlistr      sh    c4 C)?
3x1}CsCCKISII D E 	Er   c                     |r | |      S |S r   r   )fn
should_mapargs      r   	maybe_mapr     s     2c7)c)r   c                     t        | t        j                        r	 || |      S t        |       r| D cg c]  } |||       c}S t	        d      c c}w )Nz*wrap assumes that the input can be wrapped)r%   rm   r   r   r   )r   r(   cct_moder   s       r   r   r     sN    #u||$3!!S*-.QAx ..
C
DD /s   Ac              #   l  K   | D cg c])  }t        |t        j                        xs t        |      + }}|D cg c]  }|rddgndg }}t	        j
                  | D ]A  }t        ||       D cg c]"  \  }}t        t        t        ||      ||      $ }	}}|	|f C y c c}w c c}w c c}}w w)NFT)r(   r   )
r%   rm   r   r   	itertoolsproductr   r   r	   r   )
	flat_argsr(   r   r   is_tensor_likesis_tensor_likesubclass_optionswhich_args_are_wrappedshould_wrap_argr   s
             r   generate_subclass_choicesr     s     V_`sz#u||4Jc8JJ`O`[jkeWDkk"+"3"35E"F - /22H).TV*os GDcHEX[\ V V,,,	- akVs&   B4.B$B4B)&B41'B.B4c              #   (  K   t        |      \  }}t        |       t        |      z   }t        |||      D ]Y  \  }}|d t        |        }	t	        |t        |       d  |      }
|d t        |        }t	        |t        |       d  |      }|	|
||f [ y wr   )r   r   r   r   r   )rx   ry   r(   r   flat_kwargsspecflat_args_kwargschoicedebug_metadatanew_args
new_kwargsr   which_kwargs_are_wrappeds                r   %generate_subclass_choices_args_kwargsr   .  s     $V,KDzD$55";<LcS["\ U*3t9%#F3t9:$6=
!/
T!;#1.T2Ld#S 
$:<TTTUs   BBc                 "    t        d| d      | )Nz8Composite compliance check failed with the above error.
a(  If you are adding an OpInfo of an existing operator, please feel free to skip this test because the problem was pre-existing and file an issue. Otherwise, if you added a new operator, please read through the Composite Compliance section in aten/src/ATen/native/README.md for how to resolve this. )r   )erradditional_infos     r    raise_composite_compliance_errorr   :  s+    
	
	C	C
 
r   c           
          t               \  } | |i |}t        |||      D ]*  }|\  }}}	}
	  | |i |}fd} |t	        |      |       , y # t        $ r}t        |d|	 d|
 d       Y d }~<d }~ww xY w)N- wrapped_args: 
- wrapped_kwargs: 
c                 8    t        |       r| j                  S | S r   r   r   r(   s    r   r   z&check_all_permutations.<locals>.unwrapl  s    '3/1666Q6r   )r   r   r   r   r   )oprx   ry   assert_equal_fnr   expectedr   r   r   r   r   actualr   r   r(   s                 @r   check_all_permutationsr   P  s    )+MC4"6"H7fc8T <QWN*46N	0Z0F*	7 	0(;9<$  	,"#9": ;%%=$>bB 	s   A	A9A44A9c                    	
 t               \  	
	
fd} | |i |}t        ||      }t        ||      }	 
5   | |i |}d d d        	fd} |t        |      |       y # 1 sw Y   "xY w# t        $ r}t        |       Y d }~>d }~ww xY w)Nc                 N    t        | t        j                        r	 |       S | S r   r   )r   r(   r   s    r   r   zcheck_with_mode.<locals>.wrap  s"    #-a#>s1hEAEr   c                 8    t        |       r| j                  S | S r   r   r   s    r   r   zcheck_with_mode.<locals>.unwrap  s    #As+qvv22r   )r   r   r   r   )r   rx   ry   r   r   r   r   r   r   r(   r   s            @@r   check_with_moder   }  s    )+MCF 4"6"HD$DdF#F. 	)((F	)3 HVV,h7	) 	)  .(--.s.   A/ 	A#A/ #A,(A/ /	B8BBc                     g }t        |       \  } }t        |      \  }}| |z   } | D ];  }t        |t        j                        s|j                  s+|j                  |       = |S r   )r   r%   rm   r   rj   append)rx   ry   leaf_tensors	args_speckwargs_specr   s         r   gather_leaf_tensorsr     sl    L"4(OD)&v.FK&=D %#u||,$	%
 r   c                 >   |	 | |i |}n || g|i |}| ||      }t        j                  |      }|D cg c]  }t        |t        j                        s|! }}|D cg c]  }|j
                  s| }}t        |      dkD  sJ |D cg c]8  }t        j                  |j                  |j                  |j                        : }	}t        ||      }
t        |
      dkD  sJ t        j                  j                  ||
|	dd      S c c}w c c}w c c}w )Nr   r    r   Tallow_unusedretain_graph)r   tree_leavesr%   rm   r   rj   r   onesr!   r    r   r   autogradgrad)r   rx   ry   output_process_fn_gradgradcheck_wrapperresultsflat_resultsrz   flat_diff_resultsgradsr   s              r   compute_expected_gradsr    s    d%f%#B888)(1%%g.L+K!z!U\\/JAKLK$0DqAOODD !A%%%J[\QUZZ@\E\&tV4L|q   >>0,$4d  L L LD ]s   DD%D7D=Dr   c                    t               \  }t        | ||||      }t        |||      D ]S  }|\  }	}
}}t        |	|
      }t	        |      dkD  sJ 	 |	 | |	i |
}n || g|	i |
}| ||      }t        j                        }|D cg c]  }t        |t        j                        s|! }}|D cg c]  }|j                  s| }}t	        |      dkD  sJ |D cg c]8  }t        j                  |j                  |j                  |j                         : }}t#        ||      D ]M  \  }}	 t        j$                  j'                  |||dd      }fd	} |t)        t+        |            |d
       O V y # t
        $ r}t        |d| d| d       Y d }~1d }~ww xY wc c}w c c}w c c}w # t
        $ r }t        |d| d| d| d       Y d }~d }~ww xY w)Nr   r   r   r   r   Tr   z
- wrapped_grads: c                 8    t        |       r| j                  S | S r   r   r   s    r   r   z&check_backward_formula.<locals>.unwrap  s    !+As!3qvv::r   	equal_nan)r   r  r   r   r   r   r   r   r   r%   rm   r   rj   r   r!   r    r   r   r   r   r   map)r   rx   ry   r   r  r   r   r   r   r   r   r   r   r   r  r   r  rz   r  r  flat_new_gradswhich_grad_is_batchedr   r   r(   s                           @r   check_backward_formular    sG    *+MC%b$8NPabH7fc8T ,RQWN*46N*8Z@< 1$$$	 (h5*5+BHHZH%109 ))'2#/Oa:a3NOO(4H1QHH$%))) ,- AGGAHHAGGD - -5NuVY[c5d 	R1N1
,,->n:>T - S; E#ff"56DQ!	R9,R  	,"#9": ;%%=$>bB 	 PH-   0&'=&> ?))A(B C((='>bB sN   !FF..F.8F3
F3$=F87$F=	F+F&&F+=	G&G!!G&c                    !"#$ t        d      \  !}!fd#t        #fd|D              }t        |      \  }}t        #fd|D              }	t        |	|      }
t	        j
                         5  d "" fd} |||||
      }t        t        j                  |      }t        d |      }t        d	 |      }t        ||!|      D ]  }|\  }}}}t        ||
!|      D ]  }|\  }}}}t        t        "t        ||                  }|j                         D ci c]  \  }}| "|||   f       }}}	 	  |i |}n  g|i |}!fd$t        t        j                        }t        $fd|      }t        $fd|      }  |||d        || |d         	 d d d        y c c}}w # t        $ r#}t        |d
| d| d| d| d	       Y d }~d }~ww xY w# 1 sw Y   y xY w)NF)r   c                    t        |       usJ t        | t        j                        r!| j                  rt        j
                  |       S t        |       r1| D cg c]%  }|j                  rt        j
                  |      nd ' c}S y c c}w r   )rl   r%   rm   r   rj   
randn_liker   )r,   r   r(   s     r   maybe_tangentz/check_forward_ad_formula.<locals>.maybe_tangent  st    Awc!!! a&1??##A&&1NOP1??E$$Q'DPP Qs   *B	c              3   .   K   | ]  } |        y wr   r   r   r   r  s     r   r   z+check_forward_ad_formula.<locals>.<genexpr>  s     <s+<   c              3   .   K   | ]  } |        y wr   r   r  s     r   r   z+check_forward_ad_formula.<locals>.<genexpr>  s     Jsc 2Jr  c                     | \  }}t        |t        j                        r0|j                  r$t	        j
                  |j                         |      S t        |      rt        d t        ||      D              S |S )Nc              3   r   K   | ]/  \  }}|$t        j                  |j                         |      n| 1 y wr   )fwAD	make_dualr5   )r   pritangs      r   r   zDcheck_forward_ad_formula.<locals>.maybe_make_dual.<locals>.<genexpr>  s<      D!*d DHCST^^CJJL$?Y\\ Ds   57)
r%   rm   r   rj   r  r  r5   r   r   r   )dualprimaltangents      r   maybe_make_dualz1check_forward_ad_formula.<locals>.maybe_make_dual  sl     #OFG&%,,/F4H4H~~fmmow??v& D.1&'.BD D DMr   c           
          t        t        	t        | |                  }|j                         D ci c]  \  }}| 	|||   f       }}} 
|i |S  
g|i |S c c}}w r   )r   r  r   r'   )rx   tangent_argsry   tangent_kwargsop_argskv	op_kwargsr  r   r   s           r   compute_expected_gradz7check_forward_ad_formula.<locals>.compute_expected_grad  s    CT<1HIJGPVP\P\P^_1OQq0A,BCC_I_ (70i00$R?'?Y??	 `s   A%c                     | j                   S r   r  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>   s
    ahh r   c                     | j                   S r   r  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>!  s
    qyy r   r   r   z
- wrapped_tangent_args: z
- wrapped_tangent_kwargs: r   c                 8    t        |       r| j                  S | S r   r   r   s    r   r   z(check_forward_ad_formula.<locals>.unwrap>  s    %/3%7166>Q>r   c                 (     | j                         S r   r*  r   r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>B  s    F1884D r   c                 (     | j                         S r   r,  r/  s    r   r   z*check_forward_ad_formula.<locals>.<lambda>C  s    VAII5F r   Tr	  )r   r   r   r   r  
dual_levelr   unpack_dualr   r  r   r'   r   r   )%r   rx   ry   r  r   r   r"  r   r   flat_tangent_kwargsr#  r(  r   expected_primalsexpected_tangentsr   r   r   r   r   tang_choicenew_tang_argsnew_tang_kwargswhich_tang_args_are_wrappedwhich_tang_kwargs_are_wrappedr$  r%  r&  r'  r   r   actual_primalsactual_tangentsr(   r   r  r   s%   `  `                             @@@@r   check_forward_ad_formular=    sT   )EJMC <t<<L$V,KJkJJ#$7>N		 ;T			@ )|V^TD,,h7#$6A$%8(C <D&#xX !	TFU[RHj"8:R  E\Sacfhpq TQ\O/1NOS=5Q RSU_UeUeUghTQPQQOA4F0G HHh	h(0!#W!:	!:!22!M!M9!M? "$"2"2F;!)*Df!M"*+F"O0@DQ1BdS;T	!	T5;T ;TF i $ 4*+A*B C--E,F G33N2O P55R4SSUW W;T ;TsJ   1B,G&F15G&9F7AG&1G&7	G#	 G	G&G#	#G&&G/)T) )NN)NNN)*rm   r   r   torch.utils._python_dispatchr   torch.utils._pytreer   r   r   torch.utilsr   r   	functoolsr	   torch.utils._mode_utilsr
   r   torch.autograd.forward_adr   
forward_adr  typingr   ra   r   r*   rS   r]   rd   r   r   r   r   r   r   r   r   r   r   r  r  r=  r   r   r   <module>rG     s       : F F )  > ( (  		2Q$P
MD^*E&	-	U,<Z8,
L: 37CG3Rx 3RxMT MTr   