U
    9%e>1                     @   s  d dl 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 d dlZd dlmZ d dlmZmZmZmZ edd	G d
d dZeeee f eeee f eeee f dddZeeee f eeee f eeee f dddZeeedddZeedddZdS )    )defaultdict)Iterable)	dataclass)DictListOptionalSetTupleN)NativeFunction)merge_debug_infomerge_operator_dictsSelectiveBuildOperatorstrip_operator_overload_nameT)frozenc                   @   s  e Zd ZU eed< eeedf  ed< eee	f ed< eee
e f ed< eee
e f ed< ee ed< ee ed< eed	< ed d
ddZeeeef d dddZeed dddZeed dddZeee eed dddZeedddZeedddZeeddd Zeedd!d"Zeedd#d$Zeeed%d&d'Zee
e e
e d(d)d*Zeeef d
d+d,Zd-S ).SelectiveBuilderinclude_all_operators._debug_info	operatorskernel_metadataet_kernel_metadatacustom_classesbuild_featuresinclude_all_non_op_selectives)returnc                   C   s   t ddiS )Nr   Tr   from_yaml_dict r   r   `/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torchgen/selective_build/selector.pyget_nop_selectorA   s    z!SelectiveBuilder.get_nop_selector)datar   c              	   C   s  ddddddddh}t |  }t|| d	krHtd
d|| | dd}t|tsbt	d }d| kr| d }t|t
st	tdd |D }i }| di }t|tst	| D ]\}}	t||	||< qi }
| di }t|tst	| D ]\}}	dd |	D |
t|< q| di }t|ts8t	| dg }t|tsTt	t |}| dg }t|tsxt	t |}| dd}t|tst	t||||
||||S )Nr   r   
debug_infor   r   r   r   r   r   z!Got unexpected top level keys: {},Fc                 s   s   | ]}t |V  qd S Nstr).0xr   r   r   	<genexpr>`   s     z2SelectiveBuilder.from_yaml_dict.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   r#   )r%   dtyper   r   r   
<listcomp>n   s     z3SelectiveBuilder.from_yaml_dict.<locals>.<listcomp>)setkeyslen	Exceptionformatjoinget
isinstanceboolAssertionErrorlisttupledictitemsr   r   r$   r   r   )r   Zvalid_top_level_keysZtop_level_keysr   r    Zdi_listr   Zoperators_dictkvr   Zkernel_metadata_dictr   r   r   r   r   r   r   r   E   sj    
zSelectiveBuilder.from_yaml_dict)config_contentsr   c                 C   s   t | }t|S r"   )yaml	safe_loadr   r   )r:   contentsr   r   r   from_yaml_str   s    
zSelectiveBuilder.from_yaml_str)config_pathr   c              
   C   s4   t | "}t|}t|W  5 Q R  S Q R X d S r"   )openr;   r<   r   r   )r?   fr=   r   r   r   from_yaml_path   s    

zSelectiveBuilder.from_yaml_path)
allow_listis_root_operatoris_used_for_trainingr   c                 C   s0   i }| D ]}|||dd||< qt |ddS )NT)namerD   rE   include_all_overloads)r   r   r   )rC   rD   rE   r   opr   r   r   &from_legacy_op_registration_allow_list   s    z7SelectiveBuilder.from_legacy_op_registration_allow_list)rF   r   c                 C   s6   | j r
dS || jkrdS t|}|| jko4| j| jS NT)r   r   r   rG   )selfrF   r   r   r   is_operator_selected   s    
z%SelectiveBuilder.is_operator_selected)funcr   c                 C   s   t |}| |S r"   )op_name_from_native_functionrL   rK   rM   op_namer   r   r   is_native_function_selected   s    z,SelectiveBuilder.is_native_function_selectedc                 C   st   |  |sdS | jrdS tddddd d}|}|| jkrB| j| }t|}|}|| jkrb| j| }|jpr|jor|jS )NFT )rF   rD   rE   rG   r   )rL   r   r   r   r   rE   rG   )rK   rF   Znot_training_oprH   base_opr   r   r   !is_operator_selected_for_training   s*    





z2SelectiveBuilder.is_operator_selected_for_trainingc                 C   s   t |}| |S r"   )rN   rT   rO   r   r   r   (is_native_function_selected_for_training   s    z9SelectiveBuilder.is_native_function_selected_for_trainingc                 C   s^   |  |sdS | jrdS || jkr2| j| }|jS t|}|| jkrHdS | j| }|jo\|jS )NFT)rL   r   r   rD   r   rG   )rK   rF   rH   rS   r   r   r   rD      s    




z!SelectiveBuilder.is_root_operator)
kernel_tagr(   r   c                 C   s(   | j s| jrdS || jko&|| j| kS rJ   )r   r   r   )rK   rV   r(   r   r   r   is_kernel_dtype_selected   s
    
z)SelectiveBuilder.is_kernel_dtype_selected)rP   
kernel_keyr   c                 C   s   || j kr| jr|S g S t }| j | D ]h}d}|D ]:}|dkr4|dd |dd kr4|| d} qpq4|s(d|krtdq(|d q(t|S )zF
        Return a list of kernel keys that cover the used ops
        Fdefault/   TzMissing kernel for the model)r   r   r*   splitaddr-   r4   )rK   rP   rX   Z
result_setZmodel_kernel_keysZ	key_foundkeyr   r   r   et_get_selected_kernels   s$    


z(SelectiveBuilder.et_get_selected_kernelsc                 C   s   | j | jd}i }| j D ]\}}| ||< q||d< | jd k	rRt| j|d< dd | j D |d< | j|d< t| j	|d< t| j
|d	< |S )
N)r   r   r   r    c                 S   s   i | ]\}}|t |qS r   sorted)r%   r8   r9   r   r   r   
<dictcomp>  s     z,SelectiveBuilder.to_dict.<locals>.<dictcomp>r   r   r   r   )r   r   r   r7   to_dictr   ra   r   r   r   r   )rK   retr   rP   rH   r   r   r   rc     s     


zSelectiveBuilder.to_dictN)__name__
__module____qualname__r2   __annotations__r   r	   r$   r   r   r   r   staticmethodr   objectr   r>   rB   rI   rL   r
   rQ   rT   rU   rD   rW   r_   rc   r   r   r   r   r      s<   
C  		r   )lhsrhsr   c                 C   sV   i }t |  t |  D ]4\}}t|}||krD|t|| O }t |||< q|S r"   )r4   r7   r*   )rk   rl   r   Ztag_nameZdtypesZdtypes_copyr   r   r   merge_kernel_metadata"  s     rm   c                 C   sd   t t}t|  t|  D ]0}|| | |g  || ||g  q dd | D S )Nc                 S   s   i | ]\}}|t |qS r   r`   )r%   rH   valr   r   r   rb   :  s      z,merge_et_kernel_metadata.<locals>.<dictcomp>)r   r*   r4   r+   updater0   r7   )rk   rl   merge_et_kernel_metadatarH   r   r   r   rp   1  s
    rp   c           
   	   C   s   | j p
|j }t| j|j}t| j|j}t| j|j}t| j|j}| j	pN|j	}| j
|j
}| j|j}	t|||||||	|S r"   )r   r   r   r   r   rm   r   rp   r   r   r   unionr   r   )
rk   rl   r   r    r   r   r   r   r   r   r   r   r   combine_selective_builders=  s,     
rr   )rA   r   c                 C   s   | j  d| jj S )Nz::)	namespacerM   rF   )rA   r   r   r   rN   X  s    rN   )collectionsr   collections.abcr   dataclassesr   typingr   r   r   r   r	   r;   Ztorchgen.modelr
   Z!torchgen.selective_build.operatorr   r   r   r   r   r$   rm   rp   rr   rN   r   r   r   r   <module>   s.      