o
    <&i2                  	   @   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deeee f deeee f deeee f fddZdeeee f deeee f deeee f fddZdededefddZdedef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d2ddZedeeef d
d fddZeded
d fddZeded
d fddZedee deded
d fddZded
efddZded
efdd Zded
efd!d"Zded
efd#d$Zded
efd%d&Zd'ed(ed
efd)d*Zd+ed,e
e d
e
e fd-d.Zd
eeef fd/d0Zd1S )3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   LC:\wamp64\www\opt\env\Lib\site-packages\torchgen/selective_build/selector.pyget_nop_selectorA   s   z!SelectiveBuilder.get_nop_selectordatac              	   C   s  h d}t |  }t|| dkrtdd|| | dd}t|ts+J d }d| v rE| d }t|t	s<J t
dd	 |D }i }| d
i }t|tsTJ | D ]\}}	t||	||< qXi }
| di }t|tstJ | D ]\}}	dd |	D |
t|< qx| di }t|tsJ | dg }t|tsJ t |}| dg }t|tsJ t |}| dd}t|tsJ t||||
||||S )N>   r   r   r   r   r   
debug_infor   r   r   z!Got unexpected top level keys: {},r   Fr    c                 s   s    | ]}t |V  qd S Nstr).0xr   r   r   	<genexpr>`   s    z2SelectiveBuilder.from_yaml_dict.<locals>.<genexpr>r   r   c                 S   s   g | ]}t |qS r   r#   )r%   dtyper   r   r   
<listcomp>n   s    z3SelectiveBuilder.from_yaml_dict.<locals>.<listcomp>r   r   r   r   )setkeyslen	Exceptionformatjoinget
isinstancebool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   sZ   
zSelectiveBuilder.from_yaml_dictconfig_contentsc                 C   s   t | }t|S r"   )yaml	safe_loadr   r   )r9   contentsr   r   r   from_yaml_str   s   

zSelectiveBuilder.from_yaml_strconfig_pathc                 C   s@   t | }t|}t|W  d    S 1 sw   Y  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_trainingc                 C   s0   i }| D ]}|||dd||< qt |ddS )NT)namerC   rD   include_all_overloads)r   r   r   )rB   rC   rD   r   opr   r   r   &from_legacy_op_registration_allow_list   s   z7SelectiveBuilder.from_legacy_op_registration_allow_listrE   c                 C   s6   | j rdS || jv rdS t|}|| jv o| j| jS NT)r   r   r   rF   )selfrE   r   r   r   is_operator_selected   s   
z%SelectiveBuilder.is_operator_selectedfuncc                 C      t |}| |S r"   )op_name_from_native_functionrK   rJ   rL   op_namer   r   r   is_native_function_selected      
z,SelectiveBuilder.is_native_function_selectedc                 C   st   |  |sdS | jrdS tddddd d}|}|| jv r!| j| }t|}|}|| jv r1| j| }|jp9|jo9|jS )NFT )rE   rC   rD   rF   r   )rK   r   r   r   r   rD   rF   )rJ   rE   Znot_training_oprG   base_opr   r   r   !is_operator_selected_for_training   s*   





z2SelectiveBuilder.is_operator_selected_for_trainingc                 C   rM   r"   )rN   rU   rO   r   r   r   (is_native_function_selected_for_training   rR   z9SelectiveBuilder.is_native_function_selected_for_trainingc                 C   s^   |  |sdS | jrdS || jv r| j| }|jS t|}|| jvr$dS | j| }|jo.|jS )NFT)rK   r   r   rC   r   rF   )rJ   rE   rG   rT   r   r   r   rC      s   




z!SelectiveBuilder.is_root_operator
kernel_tagr(   c                 C   s(   | j s| jrdS || jv o|| j| v S rI   )r   r   r   )rJ   rW   r(   r   r   r   is_kernel_dtype_selected   s
   
z)SelectiveBuilder.is_kernel_dtype_selectedrP   
kernel_keyc                 C   s   || j vr| jr
|S g S t }| j | D ]3}d}|D ]}|dkr7|dd |dd kr7|| d} nq|sGd|vrBtd|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-   r3   )rJ   rP   rY   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 ur)t| j|d< dd | j D |d< | j|d< t| j	|d< t| j
|d	< |S )
N)r   r   r   r    c                 S      i | ]	\}}|t |qS r   sorted)r%   r7   r8   r   r   r   
<dictcomp>  s    z,SelectiveBuilder.to_dict.<locals>.<dictcomp>r   r   r   r   )r   r   r   r6   to_dictr   rc   r   r   r   r   )rJ   retr   rP   rG   r   r   r   re     s    


zSelectiveBuilder.to_dictN)r   r   )__name__
__module____qualname__r2   __annotations__r   r	   r$   r   r   r   r   staticmethodr   objectr   r=   rA   rH   rK   r
   rQ   rU   rV   rC   rX   r`   re   r   r   r   r   r      sF   
 C		r   lhsrhsr   c                 C   sV   i }t |  t |  D ]\}}t|}||v r"|t|| O }t |||< q|S r"   )r3   r6   r*   )rm   rn   r   Ztag_nameZdtypesZdtypes_copyr   r   r   merge_kernel_metadata"  s    ro   c                 C   sd   t t}t|  t|  D ]}|| | |g  || ||g  qdd | D S )Nc                 S   ra   r   rb   )r%   rG   valr   r   r   rd   :  s    z,merge_et_kernel_metadata.<locals>.<dictcomp>)r   r*   r3   r+   updater0   r6   )rm   rn   merge_et_kernel_metadatarG   r   r   r   rr   1  s
   rr   c           
   	   C   s   | j p|j }t| j|j}t| j|j}t| j|j}t| j|j}| j	p'|j	}| j
|j
}| j|j}	t|||||||	|S r"   )r   r   r   r   r   ro   r   rr   r   r   r   unionr   r   )
rm   rn   r   r    r   r   r   r   r   r   r   r   r   combine_selective_builders=  s*   
rt   r@   c                 C   s   | j  d| jj S )Nz::)	namespacerL   rE   )r@   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$   ro   rr   rt   rN   r   r   r   r   <module>   sB      


