a
    h$                     @  s  d dl mZ d dlZd dlmZ d dl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rd d
lmZ dddddZdddddZdddddZddddddZddddddZ ddddddZ!d d!ddd"d#d$Z"d%dddd&d'd(Z#d!dd)d*d+Z$d,dd-d.d/Z%d0d1d2d3d4Z&d0dd2d5d6Z'd0d1d2d7d8Z(ed9d:G d;d< d<Z)d=dd>d?d@Z*dS )A    )annotationsN)	dataclass)TYPE_CHECKING)	translate)DispatcherSignature)method_with_native_function)
ArgumentBaseTyBaseTypeFunctionSchemaListTypeNativeFunctionOptionalTypeReturn
SchemaKindType)mapMaybe)Sequencer   bool)typreturnc                 C  s   t | to| jtjkS N)
isinstancer
   namer	   ZTensorr    r   H/var/www/auris/lib/python3.9/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    strz	list[str])r   cur_level_varr   c              	   C  s.   d|  d|  d|  d| d	}t |dS )Nz
    auto [_value, z_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    std::optional<Tensor> z#_value;
    std::optional<int64_t> z_bdim;
    if (z) {
        std::tie(r#   z_bdim) = unwrapTensorAtLevel(z
.value(), z);
    }r&   r'   r+   r   r   r   unwrap_optional_tensor/   s     r.   zSequence[Argument]ztuple[str, list[str]])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}||v s||v r|
| d| dg7 }
q|
| q|	|
fS )	Nc                 S  s   g | ]
}|j qS r   r   .0ar   r   r   
<listcomp><       zgen_unwraps.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r   )typer1   r   r   r   r4   =   r5   c                 S  s   g | ]\}}t |r|qS r   )r   r2   r   r   r   r   r   r4   ?   r5   c                 S  s   g | ]\}}t |r|qS r   )r   r7   r   r   r   r4   @   s   r&   _valueZ_bdim)zipr-   r.   joinappend)r/   r"   	arg_namesZ	arg_typesZtensorsZoptional_tensorsunwrapsZtensorZ
opt_tensorZunwrap_codeunwrapped_arg_listargr   r   r   gen_unwraps9   s$    
r@   r   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)r2   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"   Z
conditionsZ	flat_argsr?   sigZtranslated_argsr   r   r   !gen_case_where_all_bdims_are_noneU   s"    



rO   ztuple[Return, ...])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rd|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:   )rP   r"   rQ   idxwrapped_returnsretr,   r   r   r   gen_returnsi   s&    
&

&

rY   )rB   r   c                 C  s   t dd | jjD S )Nc                 s  s   | ]}|j  V  qd S r   r6   rJ   r1   r   r   r   rF      r5   z4accepts_at_least_one_tensor_input.<locals>.<genexpr>)anyrH   rI   )rB   r   r   r   !accepts_at_least_one_tensor_input   s    r\   r   )argumentr   c                 C  s   | j d uo| j jS r   )
annotationZis_write)r]   r   r   r   is_mutated_arg   s    r_   r   
str | None)native_functionr   c                 C  s
  | j }t|}|j}| tjks(J 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 sd S t|sd 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_   )r2   r?   r   r   r   r4      r5   z-gen_vmap_inplace_plumbing.<locals>.<listcomp>rR   c                 s  s"   | ]}t |jpt|jV  qd S r   )r   r6   r    r2   rX   r   r   r   rF      r5   z,gen_vmap_inplace_plumbing.<locals>.<genexpr>	cur_level:template <typename batch_rule_t, batch_rule_t batch_rule>
_generated_plumbingr0   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   rP   kindr   inplacer_   rH   rI   rU   allr\   r@   rO   declr   rM   r(   indentr:   )ra   rB   rN   rP   r"   r=   r>   bdims_all_none_caser   r   r   gen_vmap_inplace_plumbing   s<    


	
ro   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   r0   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   rO   rl   r   rM   r(   rm   r:   )ra   rB   rN   r"   r=   r>   rn   r   r   r   gen_vmap_plumbing_no_returns   s     


	rp   c                 C  s"  | j }t|}|j}t|s"d S t|dkr6t| S ddg}tdd |D sb|j	 |vrbd S d| j
v rpd S | tjkrt| S | tjkrd 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   Z#_scaled_dot_product_flash_attentionZ#_scaled_dot_product_cudnn_attentionc                 s  s   | ]}|j  V  qd S r   rZ   rb   r   r   r   rF      r5   z$gen_vmap_plumbing.<locals>.<genexpr>Zinplace_viewresultsrc   rd   re   r0   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   rP   r\   rU   rp   rk   r   rM   tagsri   r   rj   ro   Z
functionalr@   rH   rI   rO   rY   rl   r(   rm   r:   )ra   rB   rN   rP   Zreturn_symint_overridesrQ   r"   r=   r>   rn   rW   r   r   r   gen_vmap_plumbing   sR    



		
rs   T)frozenc                   @  s    e Zd ZedddddZdS )ComputeBatchRulePlumbingr   r`   )fr   c                 C  s   t |}|S r   )rs   )selfrv   r,   r   r   r   __call__  s    z!ComputeBatchRulePlumbing.__call__N)__name__
__module____qualname__r   rx   r   r   r   r   ru      s   ru   zSequence[NativeFunction])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   ru   )r|   bodyr   r   r   gen_all_vmap_plumbing  s    r   )+
__future__r   r(   Zdataclassesr   typingr   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   collections.abcr   r   r   r    r-   r.   r@   rO   rY   r\   r_   ro   rp   rs   ru   r   r   r   r   r   <module>   s4   0
,3