
    OgX                    f   U d dl mZ d dlZd dlm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mZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 eee-ee:ef   f   e
e:   f   Z;i a<de=d<    e>e,      Z?	 	 	 	 	 	 ddZ@	 	 	 	 	 	 	 	 ddZAe'dd       ZB	 	 	 	 	 	 	 	 	 	 ddZC	 	 	 	 	 	 	 	 d dZD	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!dZE	 	 	 	 	 	 d"dZF	 	 	 	 	 	 	 	 	 	 	 	 d#dZGdZHd$dZI	 	 	 	 	 	 	 	 d%dZJd&dZKd'dZLy)(    )annotationsN)defaultdict)AnyCounterDictSequenceSetTuple)cpp)
DerivativeDifferentiabilityInfoForwardDerivativeSavedAttribute)	BaseCTypeBindingboolTCppSignatureGrouplayoutTlongT
NamedCTypeOptionalCTypescalarTypeTSpecialArgNamestringTsymIntArrayRefTSymIntTtensorGeometryTtensorOptionsTtypeAndSizeTVectorCType)with_native_function)$get_grouped_by_view_native_functionsparse_native_yaml)AUTOGRAD_KEYSFunctionSchemaNativeFunctionNativeFunctionsViewGroupOperatorName
SchemaKindTypeVariant)	concatMapIDENT_REGEXsplit_name_params)
YamlLoaderz$dict[tuple[str, str], DerivativeRet]_GLOBAL_LOAD_DERIVATIVE_CACHEc                
   |D ci c]#  }|j                   j                  j                  |% }}i }| j                         D ]  }d }i }|j	                         D ]t  \  }}	|j                  |	j                  j                  j                  d       }|<|j                  0|	j                  |      }
|
X|
j                  j                  }|
||<   t n t        |      dkD  s| vs|J |||<    | j                  |       y c c}w )Nr   )
viewfuncnamevaluesitemsget	view_copy%create_view_copy_from_view_derivativelenupdate)infosview_groupsgview_name_to_group
view_infosinfo_dispatch_dictmaybe_view_group!view_copy_differentiability_infosdispatch_keyinfoview_copy_info	fn_schemas               r/var/www/html/suriana-translation/venv/lib/python3.12/site-packages/torchgen/packaged/autograd/load_derivatives.pyadd_view_copy_derivativesrI   C   s+    &1H !!H H J#lln F,.)"4":":"< 
	L$155diinn6I6I4P+0@0J0J0V!%!K!K$" "- . 3 3 8 8IFT5lC
	 01A5)5:P((($EJy!%F( 
LL5Hs   (D c                B   | |f}|t         vrxt        |       5 }t        j                  |t              }d d d        t        ||      j                  }t        |      }t        d |      }|D 	cg c]  }	t        |	t              r|	 }
}	t        t              }i }|D ]_  }||j                  j                            j                  |       t!        |j                        |vsJ ||t!        |j                        <   a t#        t                   }i }t%               }D ]N  }d|vr1|j'                  d      }|j'                  dd       }|d|id}|r||d<   t)        |||||      \  }}|||<   P t+        ||
       ||ft         |<   t         |   S # 1 sw Y   \xY wc c}	w )N)Loaderc                ^    t        | t              r| gS t        | j                  d            S )NT)include_copy)
isinstancer&   list	functions)r>   s    rH   <lambda>z"load_derivatives.<locals>.<lambda>t   s-    !^, c akktk45     dispatchr4   output_differentiabilityDefault)r4   rS   )r0   openyamlloadr/   r#   native_functionsr"   r,   rN   r'   r   rO   r3   	signatureappendstrr   setpopcreate_differentiability_inforI   )derivatives_yaml_pathnative_yaml_pathtags_yaml_pathkeyfdefinitionsfuncs!native_functions_with_view_groupsrY   r>   r=   functions_by_signaturefunctions_by_schemafunction
op_counterr<   used_dispatch_keys	defn_dictspecificationrT   r4   per_dispatch_diffinfoss                         rH   load_derivativesrp   e   s   
 !"2
3C
//'( 	:A))Aj9K	: ""2NCTT -QQV,W)$6 .	
 7
!56 
 
  	 :<( 	?H"8==#:#:#<=DDXNx}}%-@@@@6>HMM 23	? S\^

 IK'*u$ 	1I* )f 5+4==.,( &3I@VW	+<TI89+H&#",(D( 1E$K#	1& 	"%5
 .34F-F%c*(--G	: 	:
s   F/FFc                    t        j                  | d      }|j                  |j                  j                         S |j                  j                         S )NF)method)r   from_native_functionsymint_signature	argumentsrZ   )rd   sigss     rH   cpp_argumentsrw      sH    11!EBD($$..00~~''))rR   c                @   |}t        |       D cg c]  }|j                  j                          }}t        d t	        j
                  |       D              }t        d | j                  j                  D              }t        ||      D 	
cg c]  \  }	}
t        |	|
       }}	}
t        |||      \  }}t        |||      \  }}|D 	ch c]-  }	t        j                  t        j                  |	      |      r|	/ }}	t        |      D ]s  }|t!        | j                  j                        k\  s&t#        dt	        j$                  | j                         d| dt!        | j                  j                         d       t'        ||||||      S c c}w c c}
}	w c c}	w )Nc              3  .   K   | ]  }|d k7  r|nd  yw)selfresultN ).0ns     rH   	<genexpr>z$create_derivative.<locals>.<genexpr>   s     UAa6kx7Us   c              3  f   K   | ])  }t        j                  |d       j                          + yw)T)symintN)r   return_typeremove_const_ref)r}   rs     rH   r   z$create_derivative.<locals>.<genexpr>   s)      ?@$'88:s   /1z3Out of bounds grads access: derivative formula for z used grads[z ], but the forward only returns z	 outputs.)formulaoriginal_formula	var_namessaved_inputssaved_outputsnamed_gradients)rw   nctyper   tupler   return_namesr3   returnszipr   saved_variablesresearchr-   formatused_gradient_indicesr:   RuntimeErrorr4   r   )rd   r   r   available_named_gradientsr   aru   r   return_typesr4   typenamed_returnsr   r   used_named_gradientsis                   rH   create_derivativer      s    -:1-=#()!!##I # UAQAQRSATUUL DEFFNN L
 25\<1P#-4
4M  ,GY	JG\,WmYOG] .99[''-w7 	  #7+ AFFNN##EchhqvvFVEW XS @QVV^^AT@UU^`  )!#, =#s   !FF
2Fc           	     &   |}d }| j                   j                  D ]%  }|j                  |v s|d}||j                  fz   }' ||dk(  rIt	        | j                   j                        dk(  sJ | j                   j                  d   j                  f}ne|D ]`  }t        j                  d|      }t	        |      dk(  s(|d}t        |d         }|| j                   j                  |   j                  fz   }b |J d       t        |||d d dd      S )	Nr|   )r{      r   z^result(\d+)$z4No matching output for forward derivative definitionFr   r   	var_typesrequired_inputs_fw_gradrequired_inputs_primalrequired_original_self_valueis_reusing_outplace_formula)	r3   r   r4   r   r:   r   findallintr   )	rd   r   namesr   r   r   var_nameresarg_idxs	            rH   create_forward_derivativer      s-    I)-IVV^^ .66Y 	!QVVI-I	. #qvv~~&!+++*//1I% Ljj!18<s8q= ($&	!#a&kG )QVV^^G-D-I-I,K KIL  X"XX  $#%*$) rR   c                    d fd}g }|D ]  }|j                   }	 ||	d      }
|	dk(  rS j                  j                         t        j                  k7  sJ d j                  j
                   d       t              dk(  r)t        |      dkD  st        |d   j                        dkD  rt        d d	      t        |      dk(  st        d d
      |d   j                  }d   j
                  dfd}t        j                  t        j                  d      ||      }D ]>  }|j
                  dfd}t        j                  t        j                        ||      }@ d| d}t        |      }
|}	n)|	dk(  r#t        |      dkD  st        |d   j                        dkD  rt        d d      D cg c]  }|j
                   }}t        |      dkD  sJ g }|D ]  |v rdz   |j                           j                  j!                         rdz  t"        j$                   j&                  v rd ddj)                  |       d}n>t"        j*                   j&                  v sJ |d    d ddj)                  |dd         d}t        |      }
|}	 ||	d      }|j                  t-        |	|j                  |j.                  |
|dd              |S c c}w )Nc                   	j                   j                  j                  j                  j                  d      }t	               }D ]  }|j
                  dv r|s|j                  }t        j                  t        j                  |      |       }|rt        d d| d| d| d	      t        j                  t        j                  ||z         |       }|s|j                  |        t        |      S )N	_foreach_)zat::TensorListzconst at::ITensorListRef &zThe forward formula for z is using the base name of the z- argument which is ambiguous. You should use z"_p to access the primal value and z_t to access the tangent.)r3   r4   base
startswithr]   r   r   r   r-   r   r   addr   )
r   postfix
is_foreachrequired_inputsargarg_namefoundargs_with_derivatives	defn_namerd   s
          rH   find_required_inputsz=postprocess_forward_derivatives.<locals>.find_required_inputs  s    VV[[%%**55kB
%( 	.CLL" xxHIIk00:GDE".yk9XYaXb cCCK* M!!)
*CE  IIk00G1CDgNE##H-'	.* _%%rR   _tauto_element_wisez"Cannot use auto_element_wise with z" because it is an in-place variantr   r   Derivative definition of z in derivatives.yaml defines the forward definition of gradient as element_wise but this only works for functions with a single differentiable input and a single differentiable output.z in derivatives.yaml defines the forward definition of gradient as element_wise but it does not defines the gradient formula for its argument which is required.c                R    | j                  d        d| j                  d       S )Nr   z	_t.conj()   group)m
input_names    rH   replz-postprocess_forward_derivatives.<locals>.repl\  s(    ''!*j\1771:,GGrR   gradc                R    | j                  d        d| j                  d       S )Nr   _pr   r   )r   r   s    rH   r   z-postprocess_forward_derivatives.<locals>.reple  s(    ggaj\(2aggaj\BBrR   (z).conj()auto_linearz in derivatives.yaml defines the forward definition of gradient as linear but this only works for functions with a single differentiable output._symintzat::z, ).r   Fr   )r   r\   r   r\   returntuple[str, ...])r   r   r   r\   )r   r3   kindr)   inplacer4   r:   r   r   r   r   subr-   r   r   r[   
has_symintr+   rj   variantsjoinrr   r   r   )rd   r   all_arg_namesderivativesforward_derivativesr   r   updated_derivativesdefnr   required_inputs_tangentbackward_formular   
fw_formular   diff_arg_namesnew_argsr   r   r   s   ``   `            @@rH   postprocess_forward_derivativesr     sP   &4 46# z
,,"6w"E))!3!33d3AFFKK=@bcd3 ./14*+a/*1-7781<"/	{ ;4 4  {#q("/	{ ;W W "  +1~>>.q166JH  2 26 :DBRSJ - T88C  VVK$6$6x$@$
S
T ZL1J ',M&:# G%'(1,*1-7781<"/	{ ;I I  3HH3chhHNH~&*** H) *~-'$H)* vv  "Y&	 1::-#I;a		(0C/DAF
~~333 (}Ai[$))HQRL:Q9RRST
 ',N&;# G "6gt!D""....(?'=-2,1
	
az
x W Is   K0c                0    |D ]  }|| vc S  t        d      )Nz Expected `names` to be non-empty)r   )r   r   r4   s      rH    is_forward_derivative_definitionr     s*      )=(()
9
::rR   c                   	 	 	 	 	 	 d#d}d$dd%dt         	 	 	 	 d&fd       }| j                  d      }t        |      \  }| j                  dd      d}	r4t        d D              r"t	              d	k7  rt        d
| d      }	dg|j                  |      }
|
s9dj                  fd|j                         D              }t        d| d|       |
j                  j                         }||   }t	        |      dk(  r<dj                  fd|j                         D              }t        d| d| d|        ||      }dd t        |      D        v rt        d d      dd t        |      D        v rt        d d      i }| d   j                         D ]  \  }|dk7  r |t        vrt        d| d | d!t               ||vr|j                  |        ||      \  }}}}}t               }|D ]  }||j                  z  } d}|r+t!              }|dk7  r||z   }| ||    }||xx   d	z  cc<   t#        ||||t%        |D cg c]  }|j&                  D ]  }|  c}}      t%        |D cg c]  }|j(                  D ]  }|  c}}      |||||	"      ||<    |j                  |fS c c}}w c c}}w )'z3Processes a single entry `defn` in derivatives.yamlr4   c                :   | D ]h  }|j                   j                         r|j                   j                         r9|t        |j                   j                  j                        k(  sf|c S  |dz   t        j                  | d   j                         k(  sJ | d   S )N_r   )r3   is_functional_fn	is_out_fnr\   r4   r   )rP   r4   rd   s      rH   canonical_functionz9create_differentiability_info.<locals>.canonical_function  s      	AFF++-((*C 0 011	 czSXXil&7&78888|rR   c                D    t        d | j                  d      D              S )z(Given "foo, bar", return ["foo", "bar"].c              3  <   K   | ]  }|j                           y wN)strip)r}   xs     rH   r   zEcreate_differentiability_info.<locals>.split_names.<locals>.<genexpr>  s     =1QWWY=   ,)r   split)	raw_namess    rH   split_namesz2create_differentiability_info.<locals>.split_names  s    =	(<===rR   c           	     P   d}d}d}g }|D ]  }|j                   }|xs2 t        t        j                  t	        j
                  d      |            }|t        t        j                  t	        j
                  d      |            z  }|xs t        |j                        }|j                  t        |              |t        |      k\  sJ |t        |      k(  }|r|dkD  rt        d|  d      |rt        |      dhk(  rt        d|  d      |r|s|dkD  rt        d|  d      y	y	)
z
        Check for some subtle mistakes one might make when writing derivatives.
        These mistakes will compile, but will be latent until a function is
        used with double backwards.
        Fr   r   gradsr   zx in derivatives.yaml illegally mixes use of 'grad' and 'grads'. Consider replacing occurrences of 'grad' with 'grads[0]'z in derivatives.yaml solely refers to 'grads[0]'.  If the first output is indeed the only differentiable output, replace 'grads[0]' with 'grad'; otherwise, there is a likely error in your derivatives declaration.z in derivatives.yaml illegally mixes use of "grad_RETURN_NAME" and "grad" or "grads[x]". Use only one method for identifying gradients.N)r   boolr   r   r-   r   r:   r   extendr   r   r]   )	r   r   	uses_gradnum_grads_usesuses_named_gradsused_grads_indicesdr   only_used_grads_indicess	            rH   check_grad_usagez7create_differentiability_info.<locals>.check_grad_usage  sg    	 (* 	FAiiG! T

;--f5w?&I c"**[-?-?-H'"RSSN/J48I8I3J%%&;G&DE	F %7!8888 #1C8J4K"K!++I; 78 8  #s+='>1#'E+I; 7   nq.@+I; 7= =  /ArR   c           
        g }g }g }t               }t        |       D cg c]  }|j                   }}| j                  j                  D cg c]  }|j                   }}xs# dgt        | j                  j                        z  }	t        | j                  j                  |	      D 
cg c]<  \  }
}|r5|
j                  )|
j                  j                         rd|
j                   > }}
}t        j                               D ]  }|   } |      }|D ]0  }||v s||v sJ d| j                  j                   d| d| d        t        ||      r|j                  t        | ||             n|j                         j                         dk(  r||z  }t!        | |||      }|j                  |       |t        |      z  } |j#                  |      }|rt%        d d	|       t        |       D cg c]  }|j                  |v s| }}t'        | ||||      } |       |||||fS c c}w c c}w c c}}
w c c}w )
NTgrad_z-While processing the derivative formula for 'z' wrt 'z', expected 'z0' to not be both an input arg and named return. non_differentiablezderivatives definition for zB have overlapped non_differentiable and differentiable variables: )r]   rw   r4   r3   r   r:   r   r   is_tensor_likesortedkeysr   r[   r   lowerr   r   intersectionr   r   )rd   r   r   non_differentiable_arg_namesargs_with_derivatives_setr   r   r   all_ret_namesdifferentiabilityretdifferentiabler   r   r   r   r4   
derivativeoverlapr   r   r   r   rT   r   s                       rH   set_up_derivativesz9create_differentiability_info.<locals>.set_up_derivatives	  s    )+7924$.1e!)6q)9:A::FFNN
AFF
 
 5TQVV^^AT8T (+166>>;L'M	%
#^$'') CHH:	%
! 	%
  		, 	<I9oG	*E  M1dm6K CAFFKK=PWX\W] ^!!%&VXL 0uE#**+DQQV+WX==?((*.BB0E90!27E+D"J  &&z2-U;-)	<, ,889UV-dV 4118	;  %Q'!
1665N+NA!
 !

 >!
 	K0 !(%
 	
W ;
	%
V!
s   H7H<+AI=IIrT   Nc              3  <   K   | ]  }t        |t                y wr   )rN   r\   )r}   diffs     rH   r   z0create_differentiability_info.<locals>.<genexpr>s  s      ("&
4(r   r   zNot supported: for z,output_differentiability must either be List[bool] or a List[str] where each str is a condition. In the case where it is a condition, we only support single-output functions. Please file us an issue. T
c              3  n   K   | ],  \  }}t        j                  |j                        k(  s)| . y wr   )r   r4   r3   r}   kvr   s      rH   r   z0create_differentiability_info.<locals>.<genexpr>  s.      
!Q!&&9IY9VA
s   *55z)could not find ATen function for schema: z .  Available signatures:
r   c              3  j   K   | ]*  \  }}t        j                  |      k(  rt        |       , y wr   )r   r4   r\   r  s      rH   r   z0create_differentiability_info.<locals>.<genexpr>  s1      
1xx{i' F
s   03z3could not find ATen function for legacy signature: z corresponding to schema z9.  Please report a bug to PyTorch. Available signatures:
grad_input_maskc              3  4   K   | ]  }|j                     y wr   r4   r}   r   s     rH   r   z0create_differentiability_info.<locals>.<genexpr>  s     FQVVF   zSchema for z has an argument named grad_input_mask, but this name would be shadowed by our codegen. Please use a different name in native_functions.yaml.r{   c              3  4   K   | ]  }|j                     y wr   r  r  s     rH   r   z0create_differentiability_info.<locals>.<genexpr>  s     =qAFF=r  zy has an argument named result, but this is only allowed for outputs.Please use a different name in native_functions.yaml.rS   rU   zInvalid dispatch key z in derivatives.yaml for z, expected key to be one of )r4   r3   opr   r   all_saved_inputsall_saved_outputsr   r   r   r  rT   #output_differentiability_conditions)rP   zSequence[NativeFunction]r4   r\   r   r&   )r   r\   r   r   )r   r\   r   zSequence[Derivative]r   None)rd   r&   r   zituple[Sequence[Derivative], Sequence[ForwardDerivative], Sequence[Binding], Sequence[str], Sequence[str]])r!   r^   r.   anyr:   r   r7   r   r6   r3   rZ   rw   _VALID_AUTOGRAD_KEYSr   r]   r   _create_op_prefixr   
dedup_varsr   r   ) rm   rh   ri   rk   rl   r   r  rn   r   r   schema_functionavailrZ   rP   	canonicaldiffinfo_dictrc   r   r   r   r  r   r   r   r  	op_prefixr  r   r   r   rT   r   s                               @@@@@rH   r_   r_     s   +36	>1f `
`

`
 `
 `
F MM&)M$]3LIq  )}}-GN*.'C (*B( % '(A-%m_ 5, -  /G+$(6 )--m<O		 
-335
 
 7 G)).1
 	
  $$..0I&y1I
9~		 
.446
 

 A) M''4o 6&&+W.
 	
 #9i8IF]9-EFF) %D D
 	
 =M)$<==) %D D
 	
 Mz*002 0
	T)+? ?'u,Em_ U..B-CE  ((""3' y)	
!(% *- 	6A A$5$55 	6  ))4Ii%O	;z)456By!Q&!2# 3''@q@A@@ )'AqAAAA '@!5"7)E%=0S#
c=0
d >>=(( A Bs   #KKz(?:^|\W)grads\[(\d+)\]c                n    t        j                  t        |       D cg c]  }t        |       c}S c c}w )zDetermine a list of gradient indices (the i in grads[i]) that
    are used by the formula.

    >>> used_gradient_indices("foo(grads[0], grads[1])")
    [0, 1]
    )r   r   GRAD_INDEX_REGEXr   )r   r   s     rH   r   r     s(     JJ'7ABqCFBBBs   2c                *  	
 dMfd}ddd dfddd d	 d
fddd d d
fddd dfddd d d dfdd d dfddd dfddd  dfd!d"d# dfd$d%d& dfd'd(d) dfd*d+d, dfd-d.d/ dfd0d1d2 dfd3d4d5 |d
fd6d7d8 dfd9d:d; dfg}g 
d<| v sd=| v rt        d>d?|  z         t        j                  d@|       st        j                  dA|       rt        dBdC|  z         dD| v sdE| v rt        dFdG|  z         |D ]  }t        |j                  t
              r|j                  j                  n|j                  	|D ]3  \  }dN	
fdH}t        j                  |j                  	      ||       } 5 |j                  t        t        t                    k(  r!t        j                  dI	 dI	 dJ	 dK|       } t        j                  t        j                  	      |       s
j                  t        |	L              | t        
      fS )ONc                0    | fk(  sJ d       d|  d|  dS )NzReplacement for ".strides()" is currently only supported for single derivatives of the same tensor that ".strides()" is being called on.zstrides_or_error(z, "z")r|   )r4   r   s    rH   stride_exprz$saved_variables.<locals>.stride_expr  s6    TG# 	
4	
# #4&D644rR   z{}.sym_sizes\(\)
_sym_sizesc                4    t        | t        t                    S r   r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>      z$	/8R'S rR   )suffixr   z{}->sym_sizes\(\)_sym_sizes_optc                F    t        | t        t        t                          S r   r   r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>	      z-	/(BC( rR   c                    |  d|  dS )Nz2.has_value() ? std::optional<c10::SymIntArrayRef>(z->sym_sizes()) : std::nulloptr|   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  s    v-_`d_e  fC  &D rR   )r4  r   exprz{}.sym_blocksize\(\)_self_sym_blocksize_optc                F    t        | t        t        t                          S r   r7  r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  r8  rR   c                    d|  dS )Nz#at::sparse_csr::getSymIntBlockSize(r   r|   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  s    'J4&PQ%R rR   z{}.options\(\)_optionsc                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  s    z$	.8Q'R rR   zzeros_like\({}\)_infoc                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>'  s    z$	,8O'P rR   c                    | S r   r|   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>(  s    T rR   c                    | dz   S )Nz_info.zeros()r|   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>)  s    D?$: rR   )r4  r   r:  r   z{}.sym_size\((-?\w+)\)c                N    d| j                         d   j                  dd       S )N_sym_argsize_r   -minus_)groupsreplace)r   s    rH   rQ   z!saved_variables.<locals>.<lambda>0  s%    mAHHJqM4I4I#x4X3Y$Z rR   c                4    t        | t        t                    S r   r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>1      z$	'8J'K rR   z{}.numel\(\)_numelc                4    t        | t        t                    S r   r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>9      z$	%8H'I rR   z{}.sym_numel\(\)
_sym_numelc                4    t        | t        t                    S r   rK  r  s    rH   rQ   z!saved_variables.<locals>.<lambda>A  rL  rR   zto_args_sizes\({}\)_args_sizesc           
     X    t        | t        t        t        t                                S r   )r   r    r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>I  s    z+k)E2B&CD( rR   zto_args_sizes_symint\({}\)_args_sizes_symintc           
     X    t        | t        t        t        t                                S r   )r   r    r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>S  s    z+k)G2D&EF( rR   zto_args_scalartypes\({}\)_args_scalartypesc                F    t        | t        t        t                          S r   )r   r    r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>]  s    z+i&<=( rR   zTensorGeometry\({}\)	_geometryc                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>g  r3  rR   z{}.scalar_type\(\)_scalar_typec                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>n  s    z$	+8N'O rR   z
{}.dim\(\)_dimc                4    t        | t        t                    S r   rO  r  s    rH   rQ   z!saved_variables.<locals>.<lambda>v  rP  rR   z{}.sym_strides\(\)_sym_stridesc                4    t        | t        t                    S r   r2  r  s    rH   rQ   z!saved_variables.<locals>.<lambda>~  r3  rR   z{}.layout\(\)_layoutc                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  rL  rR   z{}.is_conj\(\)
_conjugatec                4    t        | t        t                    S r   )r   r   r   r  s    rH   rQ   z!saved_variables.<locals>.<lambda>  rP  rR   z.sizes()z	->sizes()zY.sizes() is not supported in derivative formulas. Instead, please use the SymInt version,z<.sym_sizes(), which returned a c10::SymIntArrayRef. formula=z\.size\([-]?\d+\)z->size\([-]?\d+\)z[.size(int) is not supported in derivative formulas. Instead, please use the SymInt version,z>.sym_size(int), which returned a c10::SymIntArrayRef. formula=z
.strides()z->strides()z[.strides() is not supported in derivative formulas. Instead, please use the SymInt version,z>.sym_strides(), which returned a c10::SymIntArrayRef. formula=c                    t        d         r d   |       nd   }dv r d         n| j                  d      }j                  t         d   |z         |             dv r d         }|S |z   S )Nr4  r:  r   r   r   r:  r   )callabler   r[   r   )r   r4  r:  replacementrE   r4   saveds       rH   r   zsaved_variables.<locals>.repl  s    )1$x.)ANDN1%tH~  39D.LDL.aggaj"-tH~dVm<! D='2tE{4'8K&&f}$rR   z\bz/.has_value() ? std::optional<std::string_view>(z.value()) : std::nulloptrf  r4   r\   r   r\   )r   zre.Match[str]r   r\   )r   r   r   rN   r4   r   r   r   r   r   r   r   r-   r[   r   r   )r   nctypesr   r/  REPLACEMENTSr   regexr   rE   r4   ri  s     `     @@@rH   r   r     s=   
5  &S	
 !* D		
 $3 S		
 $R	
  !P):		
 &ZK	
 "I	
  &K	
 #'	
 *.	
 )-	
 $%S	
 "(O	
  I	
 "(S#	
 #K	
 &I	
aW6Lt #%EWw 6gLWIVW
 	
 
yy%w/299g4 iNwiXY
 	
 w-7":iNwiXY
 	
  + *6;; GFKKV[[ 	
 ( 	@KE4%  ffU\\$/w?G%	@. ;;-	'(:;;ffdV2&GvMefG 99[''-w7LL!M+Z E%L  rR   c                    dj                  | j                  d      D cg c]  }|j                          c}      }|dz   j                  dd      S c c}w )aW  Takes a native function name converts to a op prefix name.

    Note that the "name" parameter must be the native function name
    without the optional variant suffix, so "add" instead of
    "add.out".

    OP names correspond to classes, hence the change to title case.

    Example::
    >>> _create_op_prefix("add")
    'AddBackward'
     r   BackwardForwardBackward)r   r   titlerI  )r4   p
camel_cases      rH   r$  r$    sI     TZZ_=!'')=>J#,,->
KK >s   Ac                .   t               }g }| D ]  }t        |j                  j                  t              r |j                  j                  j                  n|j                  j                  }||v rb|j                  |       |j                  |        |S r   )r]   rN   r   r4   r   r   r[   )varsseenri  varr4   s        rH   r%  r%    s~    UD"$E 	 #**//>: JJOO   	
 4<S	 LrR   )r<   z6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]r=   zlist[NativeFunctionsViewGroup]r   r!  )r`   r\   ra   r\   rb   r\   r   DerivativeRet)rd   r&   r   Sequence[Binding])
rd   r&   r   r\   r   r   r   zSequence[str]r   r   )rd   r&   r   r\   r   r   r   r   )rd   r&   r   r\   r   	list[str]r   zlist[Derivative]r   list[ForwardDerivative]r   rz  r   r|  )r   r{  r   r   r   r   )rm   zdict[Any, Any]rh   z*dict[FunctionSchema, list[NativeFunction]]ri   zdict[str, NativeFunction]rk   zCounter[str]rl   zset[str]r   z7tuple[FunctionSchema, dict[str, DifferentiabilityInfo]])r   r\   r   z	list[int])r   r\   rk  zlist[NamedCType]r   r   r   z&tuple[str, tuple[SavedAttribute, ...]]rj  )rv  Sequence[SavedAttribute]r   r}  )M
__future__r   r   collectionsr   typingr   r   r   r   r	   r
   rW   torchgen.apir   torchgen.api.autogradr   r   r   r   torchgen.api.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    torchgen.contextr!   torchgen.genr"   r#   torchgen.modelr$   r%   r&   r'   r(   r)   r*   r+   torchgen.utilsr,   r-   r.   torchgen.yaml_utilsr/   r\   ry  r0   __annotations__r]   r#  rI   rp   rw   r   r   r   r   r_   r,  r   r   r$  r%  r|   rR   rH   <module>r     sW   # 	 # ; ;       & 2 P	 	 	 E D * d>45J0J+KKLcRUhVWFH C H=) A/ 
DJ.J.25J.GJJ.J.\ * *,,, ,  -	,
 ,^"" #",;""J``` ` "	`
 1` -` `F;;%4;	;d)d)Fd) 3d) 	d)
 !d) =d)N	 - Cf!f!f! f! ,	f!RL"rR   