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

ScalarTyper   r                     N)__name__
__module____qualname__ByteCharShortIntLongFloatDoubleBool r$   r$   O/var/www/html/ai/venv/lib/python3.10/site-packages/torchgen/executorch/model.pyr      s    r   ETParsedYamlnative_functionskernel_indexT)frozenc                   @   s<   e Zd ZU eed< eed< eedf ed< defddZdS )	ETKernelKeyOpArgMetaarg_namedtype.	dim_orderreturnc                 C   s4   t | j j}t| jdd dd}| d| S )Nr     ;)r   r,   valuestrr-   replace)self	dtype_strdim_strr$   r$   r%   to_native_string-   s   z%ETKernelKeyOpArgMeta.to_native_stringN)r   r   r   r4   __annotations__r   intr9   r$   r$   r$   r%   r*   &   s
   
 r*   c                
   @   s   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dZd
efddZdS )ETKernelKeyr$   .arg_metaFdefaultversionargstype_alias_mapdim_order_alias_mapr.   c                    s  dd |  D }g }t }|  D ]!\}}| v s"J dt| ||v s.J dt| || q fdd|D }dd ttj| D }i }	|D ]:}
g }|   D ](\}}|
|d  }||d	  }||t|f }|	vrvt	| |	|< |
|	|  qU|
tt| qM|S )
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
        c                 S   s    i | ]\}}|d d |D qS )c                 S      g | ]}t |qS r$   )r;   ).0aliasr$   r$   r%   
<listcomp>S       z8ETKernelKey.gen_from_yaml.<locals>.<dictcomp>.<listcomp>r$   )rD   kvr$   r$   r%   
<dictcomp>R   s    z-ETKernelKey.gen_from_yaml.<locals>.<dictcomp>zUndefined type alias: zUndefined dim_order alias: c                    s"   g | ]  fd d  D qS )c                    s   g | ]} |fqS r$   r$   )rD   r,   rE   r$   r%   rF   f   rG   z8ETKernelKey.gen_from_yaml.<locals>.<listcomp>.<listcomp>r$   )rD   rA   rK   r%   rF   e   s    z-ETKernelKey.gen_from_yaml.<locals>.<listcomp>c                 S   rC   r$   )dict)rD   permutationr$   r$   r%   rF   i   s    r   r   )itemssetvaluesr4   addlist	itertoolsproducttupler*   appendr<   )r@   rA   rB   kernel_keysdtype_alias_used
type_aliasr-   alias_dtypesalias_permutationsop_arg_cacherN   arg_listr+   arg_specr,   	cache_keyr$   rL   r%   gen_from_yaml=   s@   


zETKernelKey.gen_from_yamlc                 C   s0   | j rdS dtt d ddd | jD  S )Nr>   rI   /|c                 S   s   g | ]}|  qS r$   )r9   )rD   argr$   r$   r%   rF      rG   z0ETKernelKey.to_native_string.<locals>.<listcomp>)r>   r4   KERNEL_KEY_VERSIONjoinr=   )r6   r$   r$   r%   r9   ~   s   zETKernelKey.to_native_stringN)r   r   r   r=   r   r*   r:   r>   boolre   r?   r;   staticmethodr   r4   r   ra   r9   r$   r$   r$   r%   r<   3   s   
 @r<   c                	   @   s  e Zd ZU eeeeef f ed< dee	e
f defddZdee	e
f deeef fddZedeeeeef f d	eeeeef f dd
fddZed	eeeeef f dd fddZd	eeeeef f dd fddZdefddZe		 		 		 dddZd
S )ETKernelIndexindexgr.   c                 C   s   |  |}|d uS N)get_kernels)r6   rk   mr$   r$   r%   has_kernels   s   
zETKernelIndex.has_kernelsc                 C   sJ   t |tr|}nt |tr|j}nt| |jj| jvri S | j|jj S rl   )
isinstancer   r   
functionalr   funcnamerj   )r6   rk   fr$   r$   r%   rm      s   

zETKernelIndex.get_kernelsr(   backend_indicesNc                 C   sV   |D ]&}|| }|  D ]\}}|| v r|| | tdd< qtdd|i| |< qqd S )NTr>   )rO   r<   )r(   ru   dkrj   opbackend_metadatar$   r$   r%   grow_from_backend_indices   s   z'ETKernelIndex.grow_from_backend_indicesc                 C   s   t t}t||  t|S rl   )r   rM   ri   rz   )ru   r(   r$   r$   r%   from_backend_indices   s   z"ETKernelIndex.from_backend_indicesc                 C   s   t | j| | S rl   )ri   rz   rj   )r6   ru   r$   r$   r%   grow   s   zETKernelIndex.growc              	   C   sr   i }| j D ])}| j | }t| dksJ d| d| |tddtdddd||< qttjd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 Trv   r1   F)kernel
structuredcpp_namespace)dispatch_keyuse_out_as_primarydevice_guardexternalrj   )	rj   lenrQ   getr<   r   r
   r   CPU)r6   rj   rx   kernel_dictr$   r$   r%   _to_backend_index   s"   


zETKernelIndex._to_backend_indexindex_aindex_bc                 C   sJ   t t| j }|j D ]\}}| D ]
\}}||| |< qqt|S rl   )r   rM   rj   copyrO   ri   )r   r   combinedrx   entrykeymetadatar$   r$   r%   merge_indices   s   zETKernelIndex.merge_indices)r   ri   r   ri   r.   ri   )r   r   r   r   r   r<   r   r:   r	   r   r   rg   ro   rm   rh   r   rz   r{   r|   r
   r   r   r$   r$   r$   r%   ri      sH   
 


	
ri   )rT   collectionsr   r   dataclassesr   enumr   typingr   r   r   r	   torchgen.modelr
   r   r   r   r   r   torchgen.utilsr   re   r   r&   r*   r<   ri   r$   r$   r$   r%   <module>   s     U