U
    dF(                     @   s   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
 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d
ddZe
edddZdS )    )DictSetOptionalTupleListN)	dataclass)NativeFunction)SelectiveBuildOperatormerge_debug_infomerge_operator_dictsstrip_operator_overload_nameT)frozenc                   @   sX  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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f d	d'd(Zd)S )*SelectiveBuilderinclude_all_operators._debug_info	operators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   E/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/selective_build/selector.pyget_nop_selector:   s    z!SelectiveBuilder.get_nop_selector)datar   c                 C   sv  dddddddh}t |  }t|| dkrFtd	d
|| | dd}t|ts`t	d }d| kr| d }t|t
st	ttdd |}i }| di }t|tst	| D ]\}}	t||	||< qi }
| di }t|tst	| D ]"\}}	t
tdd |	|
t|< q| dg }t |}| dg }t |}| dd}t|tsbt	t||||
|||S )Nr   r   
debug_infor   r   r   r   r   z!Got unexpected top level keys: {},Fc                 S   s   t | S Nstr)xr   r   r   <lambda>X       z1SelectiveBuilder.from_yaml_dict.<locals>.<lambda>c                 S   s   t | S r   r    )dtyper   r   r   r#   f   r$   )setkeyslen	Exceptionformatjoinget
isinstanceboolAssertionErrorlisttuplemapdictitemsr	   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   >   s^    	zSelectiveBuilder.from_yaml_dict)config_contentsr   c                 C   s   t | }t|S r   )yaml	safe_loadr   r   )r7   contentsr   r   r   from_yaml_str{   s    
zSelectiveBuilder.from_yaml_str)config_pathr   c              
   C   s6   t | d"}t|}t|W  5 Q R  S Q R X d S )Nr)openr8   r9   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)namerB   rC   include_all_overloads)r   r   r   )rA   rB   rC   r   opr   r   r   &from_legacy_op_registration_allow_list   s    z7SelectiveBuilder.from_legacy_op_registration_allow_list)rD   r   c                 C   s6   | j r
dS || jkrdS t|}|| jko4| j| jS NT)r   r   r   rE   )selfrD   r   r   r   is_operator_selected   s    
z%SelectiveBuilder.is_operator_selected)funcr   c                 C   s   t |}| |S r   )op_name_from_native_functionrJ   rI   rK   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 )rD   rB   rC   rE   r   )rJ   r   r	   r   r   rC   rE   )rI   rD   Znot_training_oprF   base_opr   r   r   !is_operator_selected_for_training   s*    





z2SelectiveBuilder.is_operator_selected_for_trainingc                 C   s   t |}| |S r   )rL   rR   rM   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)rJ   r   r   rB   r   rE   )rI   rD   rF   rQ   r   r   r   rB      s    




z!SelectiveBuilder.is_root_operator)
kernel_tagr%   r   c                 C   s(   | j s| jrdS || jko&|| j| kS rH   )r   r   r   )rI   rT   r%   r   r   r   is_kernel_dtype_selected   s
    
z)SelectiveBuilder.is_kernel_dtype_selectedc                 C   s   | j | jd}i }| j D ]\}}| ||< q||d< | jd k	rRt| j|d< dd | j D |d< t| j|d< t| j	|d< |S )	N)r   r   r   r   c                 S   s   i | ]\}}|t t|qS r   )sortedr0   ).0r5   r6   r   r   r   
<dictcomp>   s     z,SelectiveBuilder.to_dict.<locals>.<dictcomp>r   r   r   )
r   r   r   r4   to_dictr   rV   r   r   r   )rI   retr   rN   rF   r   r   r   rY      s    

zSelectiveBuilder.to_dictN)__name__
__module____qualname__r.   __annotations__r   r   r!   r   r	   r   r   staticmethodr   objectr   r;   r@   rG   rJ   r   rO   rR   rS   rB   rU   rY   r   r   r   r   r      s8   
<  		r   )lhsrhsr   c                 C   sV   i }t |  t |  D ]4\}}t|}||krD|t|| O }t |||< q|S r   )r0   r4   r&   )ra   rb   r   Ztag_nameZdtypesZdtypes_copyr   r   r   merge_kernel_metadata   s     rc   c           	      C   sr   | j p
|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   rc   r   r   r   unionr   r   )	ra   rb   r   r   r   r   r   r   r   r   r   r   combine_selective_builders  s"    
re   )r?   r   c                 C   s   d| j j S )Nzaten::)rK   rD   )r?   r   r   r   rL     s    rL   )typingr   r   r   r   r   r8   Zdataclassesr   Ztorchgen.modelr   Z!torchgen.selective_build.operatorr	   r
   r   r   r   r!   rc   re   rL   r   r   r   r   <module>   s     ` 