
    ¯wg                        d dl mZ 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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)    )annotationsN)defaultdict
namedtuple)	dataclass)IntEnum)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     ^/home/mcse/projects/flask/flask-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                  4    e Zd ZU ded<   ded<   ded<   ddZy)	ETKernelKeyOpArgMetastrarg_namedtypeztuple[int, ...]	dim_orderc                    t         | j                     j                  }t        | j                        dd j                  dd      }| d| S )Nr     ;)r   r.   valuer,   r/   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returnr,   )r   r   r   __annotations__r:   r#   r$   r%   r+   r+   (   s    MJ(r$   r+   c                  b    e Zd ZU dZded<   dZded<   eZded<   e	 	 	 	 	 	 	 	 dd	       Z	dd
Z
y)ETKernelKeyr#   z tuple[ETKernelKeyOpArgMeta, ...]arg_metaFbooldefaultintversionc                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   )itemsrC   setvaluesr,   addlist	itertoolsproductdicttupler+   appendr?   )argstype_alias_mapdim_order_alias_mapkvaliaskernel_keysdtype_alias_used
type_aliasr/   r.   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 )NrB   rT   /|)rB   r,   KERNEL_KEY_VERSIONjoinr@   r:   )r7   args     r%   r:   zETKernelKey.to_native_string   s\    <<$%& hh$--H3,,.HIJ	
 Is   A
N)rP   zdict[str, tuple[str, str]]rQ   zdict[str, list[str]]rR   zdict[str, list[int]]r<   zlist[ETKernelKey]r;   )r   r   r   r@   r=   rB   rd   rD   staticmethodr`   r:   r#   r$   r%   r?   r?   5   sa     24H.3 GT%GS%>(>,> 2> 
	> >@
r$   r?   c                      e Zd ZU ded<   ddZ	 	 	 	 ddZe	 	 	 	 	 	 dd       Ze	 	 	 	 dd       Z	 	 	 	 ddZ	ddZ
edd	       Zy
)ETKernelIndex6dict[OperatorName, dict[ETKernelKey, BackendMetadata]]indexc                ,    | j                  |      }|d uS N)get_kernels)r7   g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 rm   )
isinstancer   r   
functionalr   funcnamerk   )r7   ro   fs      r%   rn   zETKernelIndex.get_kernels   s^     a(A/0AO66;;djj(Izz!&&++&&r$   c                    |D ]G  }||   }|j                         D ]-  \  }}|| v r|| |   t        d      <   t        d      |i| |<   / I y )NTrB   )rF   r?   )r(   backend_indicesdkrk   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 rm   )r   rM   ri   r~   )rz   r(   s     r%   from_backend_indicesz"ETKernelIndex.from_backend_indices   s.      	 	//oN\**r$   c                F    t         j                  | j                  |       | S rm   )ri   r~   rk   )r7   rz   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 Try   r3   F)kernel
structuredcpp_namespace)dispatch_keyuse_out_as_primarydevice_guardexternalrk   )	rk   lenrH   getr?   r	   r   r
   CPU)r7   rk   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 rm   )r   rM   rk   copyrF   ri   )index_aindex_bcombinedr|   entrykeymetadatas          r%   merge_indiceszETKernelIndex.merge_indices   so    tW]]%7%7%9: ,,. 	-IB!& -X$,S!-	- X&&r$   N)ro   %NativeFunction | NativeFunctionsGroupr<   rA   )ro   r   r<   z"dict[ETKernelKey, BackendMetadata])r(   rj   rz   6dict[DispatchKey, dict[OperatorName, BackendMetadata]]r<   None)rz   r   r<   ri   )r<   r   )r   ri   r   ri   r<   ri   )r   r   r   r=   rq   rn   rg   r~   r   r   r   r   r#   r$   r%   ri   ri      s    AA'6'	+' 
UL
UO
U 

U 
U +O+	+ +U	
. ' 'r$   ri   )
__future__r   rK   collectionsr   r   dataclassesr   enumr   torchgen.modelr   r	   r
   r   r   r   torchgen.utilsr   rd   r   r&   r+   r?   ri   r#   r$   r%   <module>r      s    #  / !   (    .+=~*NO $	( 	( 	( $R
 R
 R
j $P' P' P'r$   