o
    "i9                  	   @   s  d dl Z d dlm  mZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZmZmZ d dlm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"m#Z# G dd deZ$e$dddZ%edddZ&edddi d d ddZ'dd Z(dd Z)G dd de j*j+Z,dd Z-dd Z.dd Z/e&0ej1d d! Z2e&0ej3d"d# Z4e&0ed$d% Z5e&0ed&d' Z6e&0ej7d(d) Z8e&0e j9j:j;j7d*d+ Z<e&=ej> e&=ej? e&=ej@ e&=ejA e&=ejB dS ),    N)_ExcludeDispatchKeyGuardDispatchKeyDispatchKeySet)suspend_functionalization)	AOTConfigcreate_joint)#_unwrap_all_tensors_from_functional_wrap_all_tensors_to_functionalfunctionalize)!_has_potential_branch_input_alias$_has_potential_branch_input_mutation!UnsupportedAliasMutationException)HigherOrderOperator)FakeTensorMode)disable_proxy_modes_tracingmake_fxProxyTorchDispatchModetrack_tensor_tree)StorageWeakRef)_get_current_dispatch_mode_pop_mode_temporarilyc                   @   s   e Zd Zdd ZdS )
MapWrapperc                 G   s   t |g|R  S N)map_wrapper)selfxsargs r   j/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/functorch/experimental/_map.py__call__#   s   zMapWrapper.__call__N)__name__
__module____qualname__r   r   r   r   r   r   "   s    r   mapT)Z_deprecated_global_nsmap_implF)Zfw_compilerZbw_compilerZpartition_fnZdecompositionsZnum_params_buffersZaot_idZkeep_inference_input_mutationsc              	      sL  |d  }|d  }t   t Y dd fddt|d D }fdd|D }t g ||R  }tdd |D rQtd	d
d |D  dfdd|D }t g ||R  }	W d    n1 sow   Y   fdd}
t|t| t|
g |||R  }|	|fW  d    S 1 sw   Y  d S )Nc                 S   sB   t | tjr| jtjkrtj|  |  | j| jdS | 	 S | S )N)dtyperequires_grad)

isinstancetorchTensorr%   boolZempty_stridedsizeZstrider&   clonetr   r   r   from_funK   s   z$create_fw_bw_graph.<locals>.from_func                       g | ]} |qS r   r   .0r   r/   r   r   
<listcomp>X       z&create_fw_bw_graph.<locals>.<listcomp>r   c                    s$   g | ]}t |tjr |n|qS r   r'   r(   r)   r2   argr3   r   r   r4   Y   s    c                 s   s&    | ]}|d urt |tj V  qd S r   r6   r2   outr   r   r   	<genexpr>`   s    z%create_fw_bw_graph.<locals>.<genexpr>z?Expect outputs of map only contains tensors or None. Got types c                 S   s   g | ]}t |qS r   )typer9   r   r   r   r4   g   r5   .c                    r0   r   r   r9   r3   r   r   r4   i   r5   c            
         s   | d  }| d  }|d  }|d  }fdd}t |td}|t|t| dd |D \}}dd | D   fdd	}	t|	|S )
Nc                     s    |  }|dd |D fS )Nc                 S   s&   g | ]}t |tjr|jrd ndqS )TF)r'   r(   r)   r&   )r2   retr   r   r   r4   v   s    
zNcreate_fw_bw_graph.<locals>.joint_f.<locals>.fw_with_masks.<locals>.<listcomp>r   )r   Zfw_out)fr   r   fw_with_maskst   s   z:create_fw_bw_graph.<locals>.joint_f.<locals>.fw_with_masks)Z
aot_configc                 S   s   g | ]}|d ur|j r|qS r   )r&   )r2   Zgradr   r   r   r4      s
    z7create_fw_bw_graph.<locals>.joint_f.<locals>.<listcomp>c                 S   s$   h | ]}t |tjrt| qS r   )r'   r(   r)   r   _typed_storager7   r   r   r   	<setcomp>   s    

z6create_fw_bw_graph.<locals>.joint_f.<locals>.<setcomp>c                    s(   t | tjrt|   v r|  S | S r   )r'   r(   r)   r   rA   r,   r-   Zinput_storager   r   maybe_clone   s
   
z8create_fw_bw_graph.<locals>.joint_f.<locals>.maybe_clone)r   dummy_aot_configlistpytreetree_map)
Zexample_argsZjoint_mapped_argsr   Zmapped_inputZmapped_gradsr@   Zjoint_gradsrD   )r?   joint_num_mappednum_mapped_argsrC   r   joint_fm   s"   	z#create_fw_bw_graph.<locals>.joint_f)	r   r   _unstack_pytreerG   rH   anyRuntimeErrorr   len)r?   rL   r   Z	mapped_xspos_argsZ
example_xsZexample_pos_argsZexample_flat_outZexample_gradfw_graphrM   joint_graphr   )r?   r/   rK   rL   r   create_fw_bw_graph5   s8   
$,$rU   c                    s   t |\}tdd |D std| dt|dd |D }|d d dkr1tdtfd	d|D rDtd
| dd  fdd}t t|g||R  S )Nc                 s       | ]	}t |tjV  qd S r   r6   )r2   r.   r   r   r   r;          zmap_wrapper.<locals>.<genexpr>z.Mapped xs can only consist of tensors. Got xs r=   c                 S      g | ]}|j qS r   shaper1   r   r   r   r4          zmap_wrapper.<locals>.<listcomp>r   z,Leading dimensions of mapped xs cannot be 0.c                 3   s    | ]	}|d   kV  qdS r   Nr   )r2   Z	cur_shapeleading_dim_sizer   r   r;      rW   z?Leading dimensions of mapped xs must be consistent. Got shapes c                     sB   t | d  } |g| d  R  }t |\}}||S r   )rG   tree_unflattentree_flatten)	flat_argsr   Zunflattened_outflat_outZtmp_out_spec)r?   rL   out_specxs_specr   r   flat_fn   s
   zmap_wrapper.<locals>.flat_fn)rG   r`   allrP   rQ   rO   r_   r$   )r?   r   r   flat_xsZshapesre   r   )r?   r^   rL   rc   rd   r   r      s"   
	r   c                   @   s$   e Zd Zedd Zedd ZdS )MapAutogradOpc                 G   s\   | j |  || _|| _tj  g t||g|R  R W  d    S 1 s'w   Y  d S r   )Zsave_for_backward_joint_graph_num_mapped_argsr(   _CZ_AutoDispatchBelowAutogradr$   )ctxrS   rT   rL   ra   r   r   r   forward   s   
$zMapAutogradOp.forwardc                 G   sX   | j }|d | j }|| jd  }t| j| jt| g|||R  }d d d g|R S r   )Zsaved_tensorsrj   r$   ri   rQ   )rl   Z
flat_gradsZfw_argsZfw_mapped_argsrR   rJ   r   r   r   backward   s   zMapAutogradOp.backwardN)r    r!   r"   staticmethodrm   rn   r   r   r   r   rh      s
    
rh   c                    s>  t |d | }t ||d  }|d jd  t|d }|}t|tjjs1t|g ||R  }t  |g ||R  }	 fdd}
t	
|
|	}W d    n1 sTw   Y  d }d}|std| }t| jj|rp|d7 }n|}|r_| jj|| ||g|R }t	
| jj|}| jjd||i dd}t||d | jd	S )
Nr   c                    s$   t | tjr| j g| jR  S | S r   )r'   r(   r)   expandrZ   r-   r]   r   r   expand_tensor   s   z trace_map.<locals>.expand_tensorZbody_graph_   Zcall_functionr$   )name)Zconstanttracer)rF   rZ   rN   r'   r(   ZfxZGraphModuler   r   rG   rH   hasattrrt   rootZregister_moduleZunwrap_proxyZcreate_proxyr   )Z
proxy_modeZfunc_overloadr?   
num_mappedr   r   rR   Zexample_inputZ
body_graphZexample_outsrq   Zexpanded_outsZ	next_namei	candidateZ	node_argsZ
proxy_argsZ	out_proxyr   r]   r   	trace_map   s:   




rz   c                    s   t | \ }tdd  D std  t fdd D s.tddd  D  t  }g }|D ]}|t || q6|S )Nc                 s   rV   r   r6   r1   r   r   r   r;     rW   z"_unstack_pytree.<locals>.<genexpr>zLeaves of xs must be Tensor c                 3   s(    | ]}|j d   d  j d  kV  qdS r\   rY   r1   rg   r   r   r;     s   & z3Leaves of xs must have same leading dimension size c                 S   rX   r   rY   r1   r   r   r   r4     r[   z#_unstack_pytree.<locals>.<listcomp>)rG   r`   rf   rP   zipappendr_   )r   Zinspecapytreestupler   r{   r   rN      s   rN   c                 C   s   g }d }| D ]}t |\}}|| qt| }g }|D ]*}tdd |D r1|t| qtdd |D r@|d  qtd| dt ||S )Nc                 s   rV   r   r6   r2   leafr   r   r   r;     rW   z _stack_pytree.<locals>.<genexpr>c                 s   s    | ]}|d u V  qd S r   r   r   r   r   r   r;     s    zCannot stack r=   )	rG   r`   r}   r|   rf   r(   stackrP   r_   )r   rb   rc   ptZflat_ptbZstacked_outleavesr   r   r   _stack_pytree  s   r   c                 G   sJ   |d | }||d  }g }t |D ]}|| g ||R   qt|S r   )rN   r}   r   )r?   rL   r   r   rR   r   inpr   r   r   	map_dense%  s   r   c                 G   s0   t | |g|R  \}}tj|||g|R  }|S r   )rU   rh   apply)r?   rL   r   rS   Zbw_graphrb   r   r   r   map_autograd/  s   r   c                 G   s|   t  }|d usJ dt &}|jr$t|t| |g|R  W  d    S t| |g|R  W  d    S 1 s7w   Y  d S )Nz5Mode should always be enabled for python fallback key)r   r   Zenable_tracingrz   r$   )r?   rw   r   moder   r   r   map_proxy_torch_dispatch_mode6  s   $r   c                 G   s   t | |g|R  S r   )r   )r?   rw   r   r   r   r   map_fake_tensor_modeA  s   r   c              	   G   s  t j }|d | }||d  }t||d}t||d}|r!dnd}tttjO t| |d}	t	  g t
|d |R }
W d    n1 sJw   Y  t| |
rXtdt| |
ratdt|	|g||R  }t|ddW  d    S 1 s|w   Y  d S )	Nreapply_viewsmutations_and_views	mutationsremover    torch.map is mutating the input! torch.map is aliasing the input!level)r(   rk   Z$_functionalization_reapply_views_tlsr   r   r   r   Functionalizer
   r   rN   r   r   r   r$   r	   )r?   rw   r   r   r   rR   unwrapped_xsunwrapped_argsr   functional_map_fnexample_inputs
map_returnr   r   r   map_funcF  s4   



$r   c              	   G   s  |d| }||d }|   }|rdnd}t||d}t||d}	t||d}
|  K t  g t|d |	R }W d   n1 sFw   Y  t||rTtdt||r]tdt	|
|g||	R  }t
||  d	W  d   S 1 szw   Y  dS )
z
    Functionalization implementation for torch.map. Currently:
      1. We don't allow any input mutation inside the map function
      2. Our check for above condition is not exhaustive
    Nr   r   r   r   r   r   r   r   )Zfunctionalize_add_back_viewsr   r
   lowerr   rN   r   r   r   r$   r	   r   )interpreterr?   rw   r   r   rR   r   r   r   r   r   r   r   r   r   r   map_functionalizeb  s4   


$r   )Cr(   Ztorch.utils._pytreeutilsZ_pytreerG   Ztorch._Cr   r   r   Ztorch._dispatch.pythonr   Ztorch._functorch.aot_autogradr   r   Z!torch._functorch.eager_transformsr   r	   r
   Ztorch._higher_order_ops.condr   r   r   Z
torch._opsr   Ztorch._subclasses.fake_tensorr   Z"torch.fx.experimental.proxy_tensorr   r   r   r   Z torch.multiprocessing.reductionsr   Ztorch.utils._python_dispatchr   r   r   r#   r$   rE   rU   r   ZautogradFunctionrh   rz   rN   r   Zpy_implZCompositeExplicitAutogradr   ZAutogradr   r   r   r   r   rk   Z
_functorchZTransformTyper   ZfallthroughZPythonDispatcherZPythonTLSSnapshotZADInplaceOrViewZBackendSelectZAutocastCPUr   r   r   r   <module>   s^    i (


	






"