o
    h                     @  s   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
 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 )    )annotationsN)defaultdict
namedtuple)	dataclass)IntEnum)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!   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torchgen/executorch/model.pyr      s    r   ETParsedYamlnative_functionskernel_indexT)frozenc                   @  s0   e Zd ZU ded< ded< ded< d
ddZd	S )ETKernelKeyOpArgMetastrarg_namedtypeztuple[int, ...]	dim_orderreturnc                 C  s4   t | j j}t| jdd dd}| d| S )Nr     ;)r   r*   valuer(   r+   replace)self	dtype_strdim_strr!   r!   r"   to_native_string/   s   z%ETKernelKeyOpArgMeta.to_native_stringNr,   r(   )r   r   r   __annotations__r6   r!   r!   r!   r"   r'   (   s
   
 r'   c                   @  sJ   e Zd ZU dZded< dZded< eZded< edddZ	dddZ
dS )ETKernelKeyr!   z tuple[ETKernelKeyOpArgMeta, ...]arg_metaFbooldefaultintversionargsdict[str, tuple[str, str]]type_alias_mapdict[str, list[str]]dim_order_alias_mapdict[str, list[int]]r,   list[ETKernelKey]c                   s  dd |  D }g }t }|  D ] \}}| v s"J dt| ||v s-J d| || q fdd|D }dd ttj| D }i }	|D ]:}
g }|   D ](\}}|
|d  }||d	  }||t|f }|	vrut	| |	|< |
|	|  qT|
tt| qL|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>U       z8ETKernelKey.gen_from_yaml.<locals>.<dictcomp>.<listcomp>r!   )rG   kvr!   r!   r"   
<dictcomp>T   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!   )rG   r*   rH   r!   r"   rI   h   rJ   z8ETKernelKey.gen_from_yaml.<locals>.<listcomp>.<listcomp>r!   )rG   rA   rN   r"   rI   g   s    z-ETKernelKey.gen_from_yaml.<locals>.<listcomp>c                 S  rF   r!   )dict)rG   permutationr!   r!   r"   rI   k   s    r   r   )itemssetvaluesr(   addlist	itertoolsproducttupler'   appendr9   )r?   rA   rC   kernel_keysdtype_alias_used
type_aliasr+   alias_dtypesalias_permutationsop_arg_cacherQ   arg_listr)   arg_specr*   	cache_keyr!   rO   r"   gen_from_yaml?   s@   

zETKernelKey.gen_from_yamlr(   c                 C  s0   | j rdS dtt d ddd | jD  S )Nr<   rL   /|c                 S  s   g | ]}|  qS r!   )r6   )rG   argr!   r!   r"   rI      rJ   z0ETKernelKey.to_native_string.<locals>.<listcomp>)r<   r(   KERNEL_KEY_VERSIONjoinr:   )r3   r!   r!   r"   r6      s   zETKernelKey.to_native_stringN)r?   r@   rA   rB   rC   rD   r,   rE   r7   )r   r   r   r:   r8   r<   rh   r>   staticmethodrd   r6   r!   r!   r!   r"   r9   5   s   
 @r9   c                   @  sh   e Zd ZU ded< dddZdd
dZed ddZed!ddZd!ddZ	d"ddZ
ed#ddZdS )$ETKernelIndex6dict[OperatorName, dict[ETKernelKey, BackendMetadata]]indexg%NativeFunction | NativeFunctionsGroupr,   r;   c                 C  s   |  |}|d uS N)get_kernels)r3   rn   mr!   r!   r"   has_kernels   s   
zETKernelIndex.has_kernels"dict[ETKernelKey, BackendMetadata]c                 C  sJ   t |tr|}nt |tr|j}nt| |jj| jvri S | j|jj S rp   )
isinstancer
   r   
functionalr   funcnamerm   )r3   rn   fr!   r!   r"   rq      s   

zETKernelIndex.get_kernelsr%   backend_indices6dict[DispatchKey, dict[OperatorName, BackendMetadata]]Nonec                 C  sV   |D ]&}|| }|  D ]\}}|| v r|| | tdd< qtdd|i| |< qqd S )NTr<   )rR   r9   )r%   rz   dkrm   opbackend_metadatar!   r!   r"   grow_from_backend_indices   s   z'ETKernelIndex.grow_from_backend_indicesc                 C  s   t t}t||  t|S rp   )r   rP   rk   r   )rz   r%   r!   r!   r"   from_backend_indices   s   z"ETKernelIndex.from_backend_indicesc                 C  s   t | j| | S rp   )rk   r   rm   )r3   rz   r!   r!   r"   grow   s   zETKernelIndex.growr   c              	   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 Tr}   r/   F)kernel
structuredcpp_namespace)dispatch_keyuse_out_as_primarydevice_guardexternalrm   )	rm   lenrT   getr9   r   r   r	   CPU)r3   rm   r   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 rp   )r   rP   rm   copyrR   rk   )r   r   combinedr   entrykeymetadatar!   r!   r"   merge_indices   s   zETKernelIndex.merge_indicesN)rn   ro   r,   r;   )rn   ro   r,   rt   )r%   rl   rz   r{   r,   r|   )rz   r{   r,   rk   )r,   r   )r   rk   r   rk   r,   rk   )r   r   r   r8   rs   rq   rj   r   r   r   r   r   r!   r!   r!   r"   rk      s   
 


	
rk   )
__future__r   rW   collectionsr   r   dataclassesr   enumr   torchgen.modelr   r   r	   r
   r   r   torchgen.utilsr   rh   r   r#   r'   r9   rk   r!   r!   r!   r"   <module>   s     U