
    9jg                        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         l/media/conek/DATA/Code/OCR/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                 6   t        |      | u rt        d      t        j                  j	                  | |j                         |j                  |j                  |j                  |j                  |j                         |j                               }|j                  rt        j                  d|j                  |j                  |j                  d      }|j                  |j                         j                         |j                         |j                         |j                                ||_        n||_        |j                         |j                   j                         k7  r7t        d|j                          d|j                   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   )sourcer$   r&   r#   z,Expected r.stride() == r.elem.stride(), got z != )typeAssertionErrortorchr   _make_wrapper_subclassr&   r   ri   r    rj   r#   r$   emptyset_untyped_storagecloner   _C	_set_conjis_conj_set_negis_negmode)clsr   r{   argskwargsrtmps          r   __new__z?generate_cct_and_mode.<locals>.CompositeCompliantTensor.__new__y   s   DzS $h  33TYY[jj{{$2D2Dd6I6I6K	 4 MA !! kk**;;;;"' //1779#'#6#6#8;;=	   xxzQVV]]_,$'STUT\T\T^S__cdedjdjdqdqdsct%uvv
 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%   r{   ).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   )r|   rR   typesr}   r~   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%rl   N)rP   
__module____qualname__rp   r   __annotations__	__slots__staticmethodr   r   classmethodr   )r   s   r   r   rg   t   s@    llH		0	 
0	d	< 
	- 
	-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                  u 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        |      rlrjt               5   ||i |}t        |t        t        f      r(t!        ||d      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%   rp   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.)rs   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.Tstrict)r(   )rp   opsaten_local_scalar_densedefaultr   rO   rP   rd   r%   anyr   rS   r
   r   listziprs   r]   r	   r*   r   	tree_map_)r   rR   r   r}   r~   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$'F4$@ &DAqFF1I& #(,  *%d+$)&)* 6<TUEUD)UF+UB'IC( (,* *s   AG#2G/#G,/G8r   )rP   r   r   r   )r   r   s   r   CompositeCompliantTensorModer      s	    J	r   r   )rp   r   r   )r   r   r   s   ` @r   generate_cct_and_moder   j   s7    B-5<< B-H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   rl   )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%   rp   r   r   r   )r   r(   cct_moder   s       r   r   r     sN    #u||$3!!S*-.QAx ..
C
DD /s   Ac              #   p  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 ]C  }t        || d      D cg c]"  \  }}t        t        t        ||      ||      $ }	}}|	|f E y c c}w c c}w c c}}w w)NFTr   )r(   r   )
r%   rp   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)\`.ac*os GDcHEX[\ c c,,,	- akcs&   B6.B&B6B+(B63'B0B6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   )r}   r~   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   H  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>.unwrapz  s    '3/1666Q6r   )r   r   r   r   r   )opr}   r~   assert_equal_fnr   expectedr   r   r   r   r   actualr   r   r(   s                 @r   check_all_permutationsr   ^  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   r}   r~   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%   rp   r   rj   append)r}   r~   leaf_tensors
_args_spec_kwargs_specr   s         r   gather_leaf_tensorsr     sm    L#D)D*'/FL&=D %#u||,$	%
 r   c                 b   |	 | |i |}n || g|i |}| ||      }t        j                  |      }|D cg c]  }t        |t        j                        s|! }}|D cg c]  }|j
                  s| }}t        |      dk  rt        d      |D cg c]8  }t        j                  |j                  |j                  |j                        : }	}t        ||      }
t        |
      dk  rt        d      t        j                  j                  ||
|	dd      S c c}w c c}w c c}w )Nr   #Expected len(flat_diff_results) > 0r    r   Expected len(leaf_tensors) > 0Tallow_unusedretain_graph)r   tree_leavesr%   rp   r   rj   r   ro   onesr!   r    r   r   autogradgrad)r   r}   r~   output_process_fn_gradgradcheck_wrapperresultsflat_resultsr   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
"BCCJ[\QUZZ@\E\&tV4L
<A=>>>>0,$4d  L L LD ]s   D"D"%D'7D'=D,r   c                    t               \  }t        | ||||      }t        |||      D ]e  }|\  }	}
}}t        |	|
      }t	        |      dk  rt        d      	 |	 | |	i |
}n || g|	i |
}| ||      }t        j                        }|D cg c]  }t        |t        j                        s|! }}|D cg c]  }|j                  s| }}t	        |      dk  rt        d      |D cg c]8  }t        j                  |j                  |j                   |j"                        : }}t%        ||      D ]M  \  }}	 t        j&                  j)                  |||dd	      }fd} |t+        t-        |            |d       O h y # t        $ r}t        |d| d| d       Y d }~:d }~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   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   ro   r   r   r   r  r%   rp   r   rj   r  r!   r    r   r   r  r  r   map)r   r}   r~   r  r  r   r   r   r   r   r   r   r   r   r	  r   r
  r   r  r  flat_new_gradswhich_grad_is_batchedr   r   r(   s                           @r   check_backward_formular    sS    *+MC%b$8NPabH7fc8T .RQWN*46N*8Z@|! !ABB	 (h5*5+BHHZH%109 ))'2#/Oa:a3NOO(4H1QHH !Q& !FGG ,- AGGAHHAGGD - -5NuVY[c5d 	R1N1
,,->n:>T - S; E#ff"56DQ!	R=.R  	,"#9": ;%%=$>bB 	 PH
-   0&'=&> ?))A(B C((='>bB sN   !FG 7G GG6=G
	$G	F=F88F=	G8G33G8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 |d	 
      }t        d |d 
      }t        ||!|      D ]  }|\  }}}}t        ||
!|      D ]  }|\  }}}}t        t        "t        ||d                  }|j                         D ci c]  \  }}| "|||   f       }}}	 	  |i |}n  g|i |}!fd$t        t        j                        }t        $fd|d 
      }t        $fd|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 rt        d      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 )NzExpected type(t) is not CCT)rn   ro   r%   rp   r   rj   
randn_liker   )r,   r   r(   s     r   maybe_tangentz/check_forward_ad_formula.<locals>.maybe_tangent  sy    7c> !>?? a&1??##A&&1NOP1??E$$Q'DPP Qs   $*Bc              3   .   K   | ]  } |        y wr   rl   r   r   r  s     r   r   z+check_forward_ad_formula.<locals>.<genexpr>  s     <s+<   c              3   .   K   | ]  } |        y wr   rl   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      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<      Q!*d DHCST^^CJJL$?Y\\ Qs   57Tr   )
r%   rp   r   rj   r   r!  r5   r   r   r   )dualprimaltangents      r   maybe_make_dualz1check_forward_ad_formula.<locals>.maybe_make_dual  sn     #OFG&%,,/F4H4H~~fmmow??v& Q.1&'$.OQ Q QMr   c           
          t        t        	t        | |d                  }|j                         D ci c]  \  }}| 	|||   f       }}} 
|i |S  
g|i |S c c}}w )NTr   )r   r  r   r'   )r}   tangent_argsr~   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<PT1UVWGPVP\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>4  s
    ahh r   c                 8    t        |       t        j                  u S r   rn   r   UnpackedDualTensorr   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>6      d1g)@)@@ r   )is_leafc                     | j                   S r   r&  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>9  s
    aii r   c                 8    t        |       t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>;  r5  r   Tr   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>.unwrapY  s    %/3%7166>Q>r   c                 (     | j                         S r   r1  r   r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>^  s    fQXX. r   c                 8    t        |       t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>`      d1g1H1H&H r   c                 (     | j                         S r   r8  r<  s    r   r   z*check_forward_ad_formula.<locals>.<lambda>c  s    fQYY/ r   c                 8    t        |       t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>e  r>  r   r  )r   r   r   r   r   
dual_levelr   unpack_dualr   r  r   r'   r   r   )%r   r}   r~   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_formularM  
  s|   )EJMC	 <t<<L$V,KJkJJ#$7>N		 KT			@ )|V^TD,,h7#@

 %@
 <D&#xX )	TFU[RHj"8:R  E\Sacfhpq %TQ\O/1NOS=Y]5^ _`U_UeUeUghTQPQQOA4F0G HHh	h(0!#W!:	!:!22!M!M9!M? "$"2"2F;!).H"
 #+/H#
  0@DQ1BdSK%T	)	TEKT KTV i $ 4*+A*B C--E,F G33N2O P55R4SSUW gKT KTsJ   1B4G4%F?=G4GAG4?G4	G1	G,	'G4,G1	1G44G=)T) )NN)NNN)*rp   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   collections.abcr   ra   r   r*   rS   r]   rd   r   r   r   r   r   r   r   r   r   r   r  r  rM  rl   r   r   <module>rW     s       : F F )  > ( ( $ 		2Q$P
[Dz*E&	-	U,<Z8,
L> 37CG5Rx 5R|^T ^Tr   