
    '}h                     ,   d dl Z d dlmZ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 d dlmZ dZ G d	 d
e      Z edddg      Z ed       G d d             Z ed       G d d             Z ed       G d d             Zy)    N)defaultdict
namedtuple)	dataclass)IntEnum)DictListTupleUnion)BackendIndexBackendMetadataDispatchKeyNativeFunctionNativeFunctionsGroupOperatorName)assert_never   c                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)

ScalarTyper   r                     N)__name__
__module____qualname__ByteCharShortIntLongFloatDoubleBool     X/var/www/html/test/engine/venv/lib/python3.12/site-packages/torchgen/executorch/model.pyr   r      s*    DDE
CDEFDr'   r   ETParsedYamlnative_functionskernel_indexT)frozenc                   B    e Zd ZU eed<   eed<   eedf   ed<   defdZy)ETKernelKeyOpArgMetaarg_namedtype.	dim_orderreturnc                     t         | j                     j                  }t        | j                        dd j                  dd      }| d| S )Nr     ;)r   r0   valuestrr1   replace)self	dtype_strdim_strs      r(   to_native_stringz%ETKernelKeyOpArgMeta.to_native_string-   sI    tzz*00	dnn%a+33C<AgY''r'   N)r   r   r   r9   __annotations__r	   intr>   r&   r'   r(   r.   r.   &   s&    MJS#X(# (r'   r.   c            
           e Zd ZU dZeedf   ed<   dZeed<   e	Z
eed<   edeeeeef   f   deeee   f   d	eeee   f   d
ed    fd       Zd
efdZy)ETKernelKeyr&   .arg_metaFdefaultversionargstype_alias_mapdim_order_alias_mapr2   c                 4   |j                         D ci c]  \  }}||D cg c]  }t        |       c}! }}}}g }t               }| j                         D ]D  \  }}	||v sJ dt	        |      z          |	|v sJ dt	        |	      z          |j                  |       F |D 
cg c]  }||   D 
cg c]  }
||
f c}
 }}}
t        t        j                  |       D cg c]  }t        |       }}i }|D ]  }g }| j                         D ]F  \  }}||d      }
||d      }	||
t        |	      fx}|vrt        | ||<   |j                  ||          H |j                  t        t        |                    |S c c}w c c}}}w c c}
w c c}
}w c c}w )a  Generate ETKernelKeys from arg kernel specs
        Multiple ETKernelKeys are returned due to dtype permutations from utilizing
        type_alias_map (actualizing each potential type permutation as a KernelKey)

        Args:
            args: Mapping from argument name to kernel specs
                Kernel specs are a tuple of (dtype, dim_order).
                Currently tuple entries must be aliased via the alias map arguments
            type_alias_map: Mapping from type alias to potential type enums
                i.e { T0 : [Double, Int] } means T0 can be either Double or Int
                Used for lookup by args
            dim_order_alias_map: Mapping from alias to a list of dimension orders
                Used for lookup by args
        zUndefined type alias: zUndefined dim_order alias: r   r   )itemsr@   setvaluesr9   addlist	itertoolsproductdicttupler.   appendrB   )rF   rG   rH   kvaliaskernel_keysdtype_alias_used
type_aliasr1   r0   alias_dtypespermutationalias_permutationsop_arg_cachearg_listr/   arg_spec	cache_keys                      r(   gen_from_yamlzETKernelKey.gen_from_yaml=   s   , 8K7P7P7R
 
/3q!A*uE
**
 
  5%)[[] 		-!J	 / 1ICM 2 / 00>,s9~=>0  ,		- *
 *8)>?eU^?
 

 26i6G6G6V1W
"-D
 

 - 	=KH&*jjl 9"(#HQK0/<	"*E53C!DDI%& /CI.NL+Y 789 {5?;<	= S +
( @

s3   FE>F%F1F
<F!F>F
Fc                     | j                   rydt        t              z   dz   dj                  | j                  D cg c]  }|j                          c}      z   S c c}w )NrD   rU   /|)rD   r9   KERNEL_KEY_VERSIONjoinrC   r>   )r;   args     r(   r>   zETKernelKey.to_native_string~   s\    <<$%& hh$--H3,,.HIJ	
 Is   A
N)r   r   r   rC   r	   r.   r?   rD   boolre   rE   r@   staticmethodr   r9   r   ra   r>   r&   r'   r(   rB   rB   3   s     24He(#-.3 GT%GS%>3c3h'(>S$s)^,> "#tCy.1> 
m		> >@
# 
r'   rB   c            	       ,   e Zd ZU eeeeef   f   ed<   dee	e
f   defdZdee	e
f   deeef   fdZedeeeeef   f   deeeeef   f   ddfd	       Zedeeeeef   f   dd fd
       Zdeeeeef   f   dd fdZdefdZe	 	 	 	 	 	 dd       Zy)ETKernelIndexindexgr2   c                 ,    | j                  |      }|d uS N)get_kernels)r;   rm   ms      r(   has_kernelszETKernelIndex.has_kernels   s    Q}r'   c                    t        |t              r|}n(t        |t              r|j                  }nt	        |       j
                  j                  | j                  vri S | j                  |j
                  j                     S ro   )
isinstancer   r   
functionalr   funcnamerl   )r;   rm   fs      r(   rp   zETKernelIndex.get_kernels   s^     a(A/0AO66;;djj(Izz!&&++&&r'   r+   backend_indicesNc                     |D ]G  }||   }|j                         D ]-  \  }}|| v r|| |   t        d      <   t        d      |i| |<   / I y )NTrD   )rJ   rB   )r+   ry   dkrl   opbackend_metadatas         r(   grow_from_backend_indicesz'ETKernelIndex.grow_from_backend_indices   sm    
 " 	UB#B'E(- U$$%BRL$[%>?(3D(ACS'TL$	U	Ur'   c                 b    t        t              }t        j                  ||        t        |      S ro   )r   rQ   rk   r   )ry   r+   s     r(   from_backend_indicesz"ETKernelIndex.from_backend_indices   s.      	 	//oN\**r'   c                 F    t         j                  | j                  |       | S ro   )rk   r   rl   )r;   ry   s     r(   growzETKernelIndex.grow   s     	//

OLr'   c           	      *   i }| j                   D ]e  }| j                   |   }t        |j                               dk(  sJ d| d|        |j                  t	        d      t        ddd            ||<   g t        t        j                  ddd|	      S )
zp
        WARNING: this will be deprecated once all the codegen places know how to handle ETKernelIndex.
        r   z4Can't convert ETKernelIndex to BackendIndex because z  has more than one kernels. Got Tr{   r6   F)kernel
structuredcpp_namespace)dispatch_keyuse_out_as_primarydevice_guardexternalrl   )	rl   lenrL   getrB   r   r   r   CPU)r;   rl   r}   kernel_dicts       r(   _to_backend_indexzETKernelIndex._to_backend_index   s     68** 	B**R.KK&&()Q.xEbTIijuivwx.#D)re2NE"I	 $$
 	
r'   c                     t        t        | j                  j                               }|j                  j	                         D ]%  \  }}|j	                         D ]  \  }}|||   |<    ' t        |      S ro   )r   rQ   rl   copyrJ   rk   )index_aindex_bcombinedr}   entrykeymetadatas          r(   merge_indiceszETKernelIndex.merge_indices   sq     tW]]%7%7%9: ,,. 	-IB!& -X$,S!-	- X&&r'   )r   rk   r   rk   r2   rk   )r   r   r   r   r   rB   r   r?   r
   r   r   rh   rr   rp   ri   r   r   r   r   r   r   r   r&   r'   r(   rk   rk      sX   d;#?@@AAU>3G#GH T '~';;<'	k?*	+' 
U<k?.J)KKL
Uk4o0M+NNO
U 

U 
U +k4o0M+NNO+	+ +#KlO6S1T$TU	
< 
. 	' 	'+:	'		' 	'r'   rk   )rO   collectionsr   r   dataclassesr   enumr   typingr   r   r	   r
   torchgen.modelr   r   r   r   r   r   torchgen.utilsr   re   r   r)   r.   rB   rk   r&   r'   r(   <module>r      s     / !  + +  (   .+=~*NO $	( 	( 	( $R
 R
 R
j $R' R' R'r'   