o
    vZh$                     @  sD  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rNd d
lmZ dDddZdDddZdDddZdEddZdEddZ dFd d!Z!dGd&d'Z"dHd+d,Z#dId-d.Z$dJd1d2Z%dKd6d7Z&dLd8d9Z'dKd:d;Z(ed<d=G d>d? d?Z)dMdBdCZ*dS )N    )annotationsN)	dataclass)TYPE_CHECKING)	translate)DispatcherSignature)method_with_native_function)
ArgumentBaseTyBaseTypeFunctionSchemaListTypeNativeFunctionOptionalTypeReturn
SchemaKindType)mapMaybe)Sequencetypr   returnboolc                 C  s   t | to
| jtjkS N)
isinstancer
   namer	   ZTensorr    r   I/var/www/auris/lib/python3.10/site-packages/torchgen/gen_vmap_plumbing.py	is_tensor      r   c                 C     t | to	t| jS r   )r   r   r   elemr   r   r   r   is_optional_tensor!      r!   c                 C  r   r   )r   r   r   r    r   r   r   r   is_tensor_list%   r"   r#   r   strcur_level_var	list[str]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   r1   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    r2   flat_argumentsSequence[Argument]tuple[str, list[str]]c                 C  s   dd | D }dd | D }dd t ||D }dd t ||D }g }|D ]	}|t||7 }q&|D ]	}|t||7 }q2d|}	g }
|D ]}||v sO||v r\|
| d| dg7 }
qE|
| qE|	|
fS )	Nc                 S     g | ]}|j qS r   r   .0ar   r   r   
<listcomp><       zgen_unwraps.<locals>.<listcomp>c                 S  r6   r   )typer8   r   r   r   r;   =   r<   c                 S     g | ]
\}}t |r|qS r   )r   r9   r   r   r   r   r   r;   ?   s    c                 S  r>   r   )r!   r?   r   r   r   r;   @   s
    r*   _valueZ_bdim)zipr1   r2   joinappend)r3   r%   	arg_namesZ	arg_typesZtensorsZoptional_tensorsunwrapsZtensorZ
opt_tensorZunwrap_codeunwrapped_arg_listargr   r   r   gen_unwraps9   s$   
rH   	outer_sigr   schemar   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)r9   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_allr=   is_tensor_likerC   r   r   from_schemarB   r   funcunambiguous_name)rI   rJ   r%   Z
conditionsZ	flat_argsrG   sigZtranslated_argsr   r   r   !gen_case_where_all_bdims_are_noneU   s"   



rW   returnstuple[Return, ...]results_varc                 C  s   d}g }| D ]T}t |jr)|d| d| d|d  d| d| d |d7 }qt|jrJ|d	| d| d|d  d| d| d |d7 }q|d
| d| d |d7 }qt|dkrkd|d  d}|S dd| d}|S )Nr   zmakeBatched(std::get<z>(z), std::get<   z), rK      zmakeBatchedVector(std::get<z	std::get<zreturn ;zreturn std::make_tuple(r(   r)   )r   r=   rC   r#   lenrB   )rX   r%   rZ   idxwrapped_returnsretr0   r   r   r   gen_returnsi   s(   
&

&

rb   c                 C  s   t dd | jjD S )Nc                 s      | ]}|j  V  qd S r   r=   rR   r8   r   r   r   rN          z4accepts_at_least_one_tensor_input.<locals>.<genexpr>)anyrP   rQ   )rJ   r   r   r   !accepts_at_least_one_tensor_input   r   rg   argumentr   c                 C  s   | j d uo| j jS r   )
annotationZis_write)rh   r   r   r   is_mutated_arg   s   rj   native_functionr   
str | Nonec                 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s-d S t
|dkr5d S tdd |D s@d S t|sFd 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   )rj   )r9   rG   r   r   r   r;      s    z-gen_vmap_inplace_plumbing.<locals>.<listcomp>r[   c                 s  s$    | ]}t |jpt|jV  qd S r   )r   r=   r#   r9   ra   r   r   r   rN      s   " z,gen_vmap_inplace_plumbing.<locals>.<genexpr>	cur_level:template <typename batch_rule_t, batch_rule_t batch_rule>
_generated_plumbingr7   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;
})rT   r   rS   rX   kindr   inplacerj   rP   rQ   r^   allrg   rH   rW   declr   rU   r,   indentrB   )rk   rJ   rV   rX   r%   rE   rF   bdims_all_none_caser   r   r   gen_vmap_inplace_plumbing   s<   


	
rz   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 )Nrn   ro   rp   r7   z {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing_no_returns");
  int64_t rq   rr   r*   rs   r(   rO   )rT   r   rS   rH   rP   rQ   rW   rw   r   rU   r,   rx   rB   )rk   rJ   rV   r%   rE   rF   ry   r   r   r   gen_vmap_plumbing_no_returns   s    


	r{   c                 C  s"  | j }t|}|j}t|sd S t|dkrt| S ddg}tdd |D s1|j	 |vr1d S d| j
v r8d S | tjkrCt| S | tjkrLd 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  rc   r   rd   rm   r   r   r   rN      re   z$gen_vmap_plumbing.<locals>.<genexpr>Zinplace_viewresultsrn   ro   rp   r7   z {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing");
  int64_t rq   rr   r*   z
  auto z = batch_rule(r(   z);
  z
})rT   r   rS   rX   rg   r^   r{   rv   r   rU   tagsrt   r   ru   rz   Z
functionalrH   rP   rQ   rW   rb   rw   r,   rx   rB   )rk   rJ   rV   rX   Zreturn_symint_overridesrZ   r%   rE   rF   ry   r`   r   r   r   gen_vmap_plumbing   sP   



		
r~   T)frozenc                   @  s   e Zd ZedddZdS )	ComputeBatchRulePlumbingfr   r   rl   c                 C  s   t |}|S r   )r~   )selfr   r0   r   r   r   __call__  s   z!ComputeBatchRulePlumbing.__call__N)r   r   r   rl   )__name__
__module____qualname__r   r   r   r   r   r   r      s    r   native_functionsSequence[NativeFunction]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
)rB   listr   r   )r   bodyr   r   r   gen_all_vmap_plumbing  s   r   )r   r   r   r   )r   r$   r%   r$   r   r&   )r3   r4   r%   r$   r   r5   )rI   r   rJ   r   r%   r$   r   r$   )rX   rY   r%   r$   rZ   r$   r   r$   )rJ   r   r   r   )rh   r   r   r   )rk   r   r   rl   )rk   r   r   r$   )r   r   r   r$   )+
__future__r   r,   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#   r1   r2   rH   rW   rb   rg   rj   rz   r{   r~   r   r   r   r   r   r   <module>   s6    0












,
3