U
    •Ê¹jä#  ã                   @   sÂ  d dl Z d dlmZ d dlmZmZmZmZ 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mZmZmZmZmZ d dlmZ eed	œd
d„Zeed	œdd„Zeed	œdd„Zeeee dœdd„Z eeee dœdd„Z!ee eeeee f dœdd„Z"eeeedœdd„Z#eedf e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d%œd(d)„Z(eee d%œd*d+„Z)ed,d-�G d.d/„ d/ƒƒZ*ee ed0œd1d2„Z+dS )3é    N)Ú	dataclass)ÚListÚOptionalÚSequenceÚTuple)Ú	translate)ÚDispatcherSignature)Úmethod_with_native_function)
ÚArgumentÚBaseTyÚBaseTypeÚFunctionSchemaÚListTypeÚNativeFunctionÚOptionalTypeÚReturnÚ
SchemaKindÚType)ÚmapMaybe)ÚtypÚreturnc                 C   s   t | tƒo| jtjkS ©N)Ú
isinstancer   Únamer   ZTensor©r   © r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchgen/gen_vmap_plumbing.pyÚ	is_tensor   s    r   c                 C   s   t | tƒot| jƒS r   )r   r   r   Úelemr   r   r   r   Úis_optional_tensor   s    r   c                 C   s   t | tƒot| jƒS r   )r   r   r   r   r   r   r   r   Úis_tensor_list   s    r    )r   Úcur_level_varr   c                 C   s:   d| › d| › d| › d| › d| › d|› d�}t  |¡ d¡S )	Nz    Tensor ú_value;
    optional<int64_t> z_bdim;
    std::tie(ú_value, ú_bdim) = unwrapTensorAtLevel(ú, ú);Ú
©ÚtextwrapÚdedentÚsplit©r   r!   Úresultr   r   r   Úunwrap_tensor#   s    ÿÿÿÿÿýr.   c                 C   s@   d| › d| › d| › d| › d| › d| › d|› d�}t  |¡ d	¡S )
Nz    optional<Tensor> r"   z_bdim;
    if (z) {
        std::tie(r#   r$   z
.value(), z);
    }r'   r(   r,   r   r   r   Úunwrap_optional_tensor+   s     ÿÿÿÿÿÿür/   )Úflat_argumentsr!   r   c                 C   sÌ   dd„ | D ƒ}dd„ | D ƒ}dd„ t ||ƒD ƒ}dd„ t ||ƒD ƒ}g }|D ]}|t||ƒ7 }qL|D ]}|t||ƒ7 }qdd |¡}	g }
|D ]8}||ksž||kr¸|
|› d�|› d�g7 }
qŠ|
 |¡ qŠ|	|
fS )	Nc                 S   s   g | ]
}|j ‘qS r   ©r   ©Ú.0Úar   r   r   Ú
<listcomp>8   s     zgen_unwraps.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   )Útyper2   r   r   r   r5   9   s     c                 S   s   g | ]\}}t |ƒr|‘qS r   )r   ©r3   r   r   r   r   r   r5   ;   s      c                 S   s   g | ]\}}t |ƒr|‘qS r   )r   r7   r   r   r   r5   <   s     r'   Ú_valueZ_bdim)Úzipr.   r/   ÚjoinÚappend)r0   r!   Ú	arg_namesZ	arg_typesZtensorsZoptional_tensorsÚunwrapsZtensorZ
opt_tensorZunwrap_codeÚunwrapped_arg_listÚargr   r   r   Úgen_unwraps5   s$    ÿ
r@   )Ú	outer_sigÚschemar!   r   c                 C   sŽ   g }|j j}|D ]*}|j ¡ s q| d|j› d|› d�¡ qt |¡}d dd„ t	|   ¡ |  ¡ ƒD ƒ¡}dd |¡› d|j
j ¡ › d	|› d
�S )Nz!isBatchedAtLevel(r%   ú)c                 s   s   | ]}|j V  qd S r   )Úexpr)r3   Úer   r   r   Ú	<genexpr>\   s    z4gen_case_where_all_bdims_are_none.<locals>.<genexpr>zif (z && z) {
  return at::_ops::z::call(ú);
})Ú	argumentsÚflat_allr6   Úis_tensor_liker;   r   r   Úfrom_schemar:   r   ÚfuncÚunambiguous_name)rA   rB   r!   Ú
conditionsZ	flat_argsr?   ÚsigZtranslated_argsr   r   r   Ú!gen_case_where_all_bdims_are_noneQ   s"    


ÿÿ
þþrP   .)Úreturnsr!   Úresults_varr   c                 C   sê   d}g }| D ]¨}t |jƒrR| d|› d|› d|d › d|› d|› d�¡ |d7 }qt|jƒr”| d	|› d|› d|d › d|› d|› d�¡ |d7 }q| d
|› d|› d�¡ |d7 }qt|ƒdkrÔd|d › d�}ndd |¡› d�}|S )Nr   zmakeBatched(std::get<z>(z), std::get<é   z), rC   é   zmakeBatchedVector(std::get<z	std::get<zreturn ú;zreturn std::make_tuple(r%   r&   )r   r6   r;   r    Úlenr:   )rQ   r!   rR   ÚidxÚwrapped_returnsÚretr-   r   r   r   Úgen_returnse   s&    
&ÿ

&ÿ

rZ   )rB   r   c                 C   s   t dd„ | jjD ƒƒS )Nc                 s   s   | ]}|j  ¡ V  qd S r   ©r6   rJ   r2   r   r   r   rF   €   s     z4accepts_at_least_one_tensor_input.<locals>.<genexpr>)ÚanyrH   rI   )rB   r   r   r   Ú!accepts_at_least_one_tensor_input   s    r]   )Úargumentr   c                 C   s   | j d k	o| j jS r   )Ú
annotationZis_write)r^   r   r   r   Úis_mutated_argƒ   s    r`   )Únative_functionr   c                 C   s
  | j }t |¡}|j}| ¡ tjks(t‚t|j	j
d ƒs<d S tdd„ |j	j
D ƒƒdksZd S t|ƒdkrjd S tdd„ |D ƒƒs€d S t|ƒsŒd S d}t|j	j
|ƒ\}}t|||ƒ}d|j|j ¡ d	 d
�› d|› dt |d¡› dt |d¡› dd |¡› d|j	j
d j› d�S )Nr   c                 S   s   g | ]}t |ƒr|‘qS r   )r`   )r3   r?   r   r   r   r5   •   s      z-gen_vmap_inplace_plumbing.<locals>.<listcomp>rS   c                 s   s"   | ]}t |jƒpt|jƒV  qd S r   )r   r6   r    ©r3   rY   r   r   r   rF   ›   s     z,gen_vmap_inplace_plumbing.<locals>.<genexpr>Ú	cur_levelú:template <typename batch_rule_t, batch_rule_t batch_rule>
Ú_generated_plumbingr1   zÉ {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_inplace_plumbing");
  int64_t ú = maybe_layer->layerId();
ú  r'   ú
  batch_rule(r%   z);
  return z;
})rL   r   rK   rQ   Úkindr   ÚinplaceÚAssertionErrorr`   rH   rI   rV   Úallr]   r@   rP   Údeclr   rM   r)   Úindentr:   )ra   rB   rO   rQ   r!   r=   r>   Úbdims_all_none_caser   r   r   Úgen_vmap_inplace_plumbing‡   s<    
þú
ù
ø	÷
örp   c                 C   s~   | j }t |¡}d}t|jj|ƒ\}}t|||ƒ}d|j|j 	¡ d d�› d|› dt
 |d¡› dt
 |d¡› d	d
 |¡› d�S )Nrc   rd   re   r1   zÌ {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing_no_returns");
  int64_t rf   rg   r'   rh   r%   rG   )rL   r   rK   r@   rH   rI   rP   rm   r   rM   r)   rn   r:   )ra   rB   rO   r!   r=   r>   ro   r   r   r   Úgen_vmap_plumbing_no_returns³   s     
þú
ù
ø	÷rq   c           
      C   s  | j }t |¡}|j}t|ƒs"d S t|ƒdkr6t| ƒS tdd„ |D ƒƒsLd S d| jkrZd S | 	¡ t
jkrpt| ƒS | 	¡ t
jkr‚d S d}d}t|jj|ƒ\}}t|||ƒ}t|||ƒ}	d|j|j ¡ d d	�› d
|› dt |d¡› dt |d¡› d|› dd |¡› d|	› d�S )Nr   c                 s   s   | ]}|j  ¡ V  qd S r   r[   rb   r   r   r   rF   Ò   s     z$gen_vmap_plumbing.<locals>.<genexpr>Zinplace_viewÚresultsrc   rd   re   r1   zÁ {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing");
  int64_t rf   rg   r'   z
  auto z = batch_rule(r%   z);
  z
})rL   r   rK   rQ   r]   rV   rq   rl   Útagsri   r   rj   rp   Z
functionalr@   rH   rI   rP   rZ   rm   r   rM   r)   rn   r:   )
ra   rB   rO   rQ   rR   r!   r=   r>   ro   rX   r   r   r   Úgen_vmap_plumbingÈ   sF    

þú
ù
ø	÷	÷
ört   T)Úfrozenc                   @   s$   e Zd Zeeee dœdd„ƒZdS )ÚComputeBatchRulePlumbing)Úfr   c                 C   s   t |jjƒ}t|ƒ}|S r   )ÚstrrL   r   rt   )Úselfrw   Úopnamer-   r   r   r   Ú__call__ö   s    z!ComputeBatchRulePlumbing.__call__N)Ú__name__Ú
__module__Ú__qualname__r	   r   r   rx   r{   r   r   r   r   rv   ô   s   rv   )Únative_functionsr   c                 C   s"   d  tttƒ | ƒƒ¡}d|› d�S )Nr'   z|
#pragma once
#include <ATen/Operators.h>
#include <ATen/functorch/PlumbingHelper.h>

namespace at { namespace functorch {

z 

}} // namespace at::functorch
)r:   Úlistr   rv   )r   Úbodyr   r   r   Úgen_all_vmap_plumbingý   s    ùr‚   ),r)   Údataclassesr   Útypingr   r   r   r   Ztorchgen.api.translater   Ztorchgen.api.typesr   Ztorchgen.contextr	   Ztorchgen.modelr
   r   r   r   r   r   r   r   r   r   Ztorchgen.utilsr   Úboolr   r   r    rx   r.   r/   r@   rP   rZ   r]   r`   rp   rq   rt   rv   r‚   r   r   r   r   Ú<module>   sD   0 þ  þ
  þ,,