o
    i#                  	   @   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 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e fddZ deded
ee fddZ!dee ded
eeee f fddZ"dededed
efddZ#deedf de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e fd)d*Z'd(ed
efd+d,Z(d(ed
ee fd-d.Z)ed/d0G d1d2 d2Z*d3ee d
efd4d5Z+dS )6    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   i/var/www/html/eduruby.in/lip-sync/lip-sync-env/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   cur_level_varc                 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   r1   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    r2   flat_argumentsc                 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>8       zgen_unwraps.<locals>.<listcomp>c                 S   r4   r   )typer6   r   r   r   r9   9   r:   c                 S      g | ]
\}}t |r|qS r   )r   r7   r   r   r   r   r   r9   ;   s    c                 S   r<   r   )r!   r=   r   r   r   r9   <   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_unwraps5   s$   
rF   	outer_sigschemac                 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)r7   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_likerA   r   r   from_schemar@   r   funcunambiguous_name)rG   rH   r$   Z
conditionsZ	flat_argsrE   sigZtranslated_argsr   r   r   !gen_case_where_all_bdims_are_noneQ   s"   



rU   returns.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), rI      zmakeBatchedVector(std::get<z	std::get<zreturn ;zreturn std::make_tuple(r(   r)   )r   r;   rA   r#   lenr@   )rV   r$   rW   idxwrapped_returnsretr0   r   r   r   gen_returnse   s(   
&

&

r_   c                 C   s   t dd | jjD S )Nc                 s       | ]}|j  V  qd S r   r;   rP   r6   r   r   r   rL          z4accepts_at_least_one_tensor_input.<locals>.<genexpr>)anyrN   rO   )rH   r   r   r   !accepts_at_least_one_tensor_input   r   rd   argumentc                 C   s   | j d uo| j jS r   )
annotationZis_write)re   r   r   r   is_mutated_arg   s   rg   native_functionc                 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   )rg   )r7   rE   r   r   r   r9      s    z-gen_vmap_inplace_plumbing.<locals>.<listcomp>rX   c                 s   s$    | ]}t |jpt|jV  qd S r   )r   r;   r#   r7   r^   r   r   r   rL      s   " z,gen_vmap_inplace_plumbing.<locals>.<genexpr>	cur_level:template <typename batch_rule_t, batch_rule_t batch_rule>
_generated_plumbingr5   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;
})rR   r   rQ   rV   kindr   inplacerg   rN   rO   r[   allrd   rF   rU   declr   rS   r,   indentr@   )rh   rH   rT   rV   r$   rC   rD   bdims_all_none_caser   r   r   gen_vmap_inplace_plumbing   s<   


	
rv   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 )Nrj   rk   rl   r5   z {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing_no_returns");
  int64_t rm   rn   r*   ro   r(   rM   )rR   r   rQ   rF   rN   rO   rU   rs   r   rS   r,   rt   r@   )rh   rH   rT   r$   rC   rD   ru   r   r   r   gen_vmap_plumbing_no_returns   s    


	rw   c           
      C   s  | j }t|}|j}t|sd S t|dkrt| S tdd |D s&d S d| jv r-d S |	 t
jkr8t| S |	 t
jkrAd 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   r`   r   ra   ri   r   r   r   rL      rb   z$gen_vmap_plumbing.<locals>.<genexpr>Zinplace_viewresultsrj   rk   rl   r5   z {
  c10::impl::ExcludeDispatchKeyGuard guard(DispatchKey::FuncTorchBatched);
  auto maybe_layer = maybeCurrentDynamicLayer();
  vmap_check_escaped(maybe_layer, "gen_vmap_plumbing");
  int64_t rm   rn   r*   z
  auto z = batch_rule(r(   z);
  z
})rR   r   rQ   rV   rd   r[   rw   rr   tagsrp   r   rq   rv   Z
functionalrF   rN   rO   rU   r_   rs   r   rS   r,   rt   r@   )
rh   rH   rT   rV   rW   r$   rC   rD   ru   r]   r   r   r   gen_vmap_plumbing   sF   



		
rz   T)frozenc                   @   s&   e Zd Zededee fddZdS )ComputeBatchRulePlumbingfr   c                 C   s   t |jj}t|}|S r   )strrR   r   rz   )selfr}   opnamer0   r   r   r   __call__   s   z!ComputeBatchRulePlumbing.__call__N)__name__
__module____qualname__r	   r   r   r~   r   r   r   r   r   r|      s    r|   native_functionsc                 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   r|   )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#   r~   r1   r2   rF   rU   r_   rd   rg   rv   rw   rz   r|   r   r   r   r   r   <module>   s\    0




,,