
    %VjiFp                        d dl mZ d dlZd dlmc 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mZmZmZmZ d dlmZ d dlmZ  G d	 d
e          Z e            Ze                    ej                  e                    ej                  d                         Zd Z dZ!e!fdZ" G d de          Z#d Z$d Z%e                    ej&                  d             Z'd Z(d Z)d Z*e                    ej+                  d             Z,d Z-d Z. G d d          Z/ G d de/          Z0 G d de/          Z1	 d%d Z2	 d%d!Z3d" Z4 G d# d$e          Z5 e5            Z6dS )&    )
NamedTupleN)_unwrap_for_grad_wrap_for_gradcurrent_levelTransformType)vmap)%enable_single_level_autograd_function)_add_batch_dim_broadcast_to_and_flattenrestore_vmapunwrap_batchedwrap_batched)HigherOrderOperator)_set_fwd_grad_enabledc                   *     e Zd Zd fdZ fdZ xZS )!CustomFunctionHigherOrderOperatorreturnNc                 J    t                                          d           d S )Ncustom_function_callsuper__init__self	__class__s    \/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_functorch/autograd_function.pyr   z*CustomFunctionHigherOrderOperator.__init__!   s"    /00000    c                     t           j                                        r t                      j        |g|R i |S  |j        |i |S N)torch_C _are_functorch_transforms_activer   __call__apply)r   autograd_functionargskwargsr   s       r   r#   z*CustomFunctionHigherOrderOperator.__call__$   s]     84466 	H#577#$5GGGGGGG& &7777r   r   N__name__
__module____qualname__r   r#   __classcell__r   s   @r   r   r       sV        1 1 1 1 1 18 8 8 8 8 8 8 8 8r   r   c                     t          | |          }t                      5   |j        | }d d d            n# 1 swxY w Y   |S r   )generate_single_level_functionr	   r$   )interpreterr%   operands	Generatedflat_outs        r   custom_function_call_gradr5   X   s     /{<MNNI	.	0	0 . ."9?H-. . . . . . . . . . . . . . .Os   6::c           
      2                                       fd}fd}fd}fd}j         d}t          |t          j        j        j        ft          |          t          |          t          |          t          |          d          }|S )Nc                     t          j        t          j        fd|           }t          j                    5  t          d          5                                  5  t          g|R  }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   fd}t          ||| |          S )Nc                 $    t          |           S r   )r   )xlevels    r   <lambda>zAgenerate_single_level_function.<locals>.forward.<locals>.<lambda>f   s    $4Q$>$> r   Tc                 $    t          |           S r   )r   )outputr:   s    r   wrap_fnz@generate_single_level_function.<locals>.forward.<locals>.wrap_fnq   s    !&%000r   )	pytreetree_map_onlyr    Tensorenable_gradr   lowerr   !wrap_outputs_maintaining_identity)r2   unwrapped_operandsunwrapped_outputr>   r%   r1   r:   s       r   forwardz/generate_single_level_function.<locals>.forwardd   s   #1L>>>>
 
    	 	"7"="= 	 	{?P?P?R?R 	 	3! $6     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 		1 	1 	1 	1 	1 10(G
 
 	
sY   B%BA7+B7A;;B>A;?BB%B	B%B	B%%B),B)c                 2                         | ||          S r   )setup_context)ctxinputsr=   r%   s      r   rI   z5generate_single_level_function.<locals>.setup_contextx   s     ..sFFCCCr   c                 $     j         | g|R  }|S r   )backward)rJ   gradsresultr%   s      r   rM   z0generate_single_level_function.<locals>.backward|   s#    +"+C8%888r   c                 $     j         | g|R  }|S r   )jvp)rJ   tangentsrO   r%   s      r   rQ   z+generate_single_level_function.<locals>.jvp   s#    &"&s6X666r   r3   )rG   rM   rQ   rI   )r:   r*   typer    autogradfunction_SingleLevelFunctionstaticmethod)	r1   r%   rG   rI   rM   rQ   namer3   r:   s	   ``      @r   r0   r0   a   s    E
 
 
 
 
 
 
(D D D D D    
      (333D		 	57#G,,$X..$$)-88		
 	
	 	I r   znot specifiedc           	         t          j        | }t          j        | }d t          ||          D             }t          j        |           \  }}	g }
|t          k    }|rCt          ||	          }|1t          d| dt          j        |          d          d|	 d          t          |          D ]\  }}t          |t          j
                  s|
                    |           5t          |          |v r)|
                    |t          |                              o|r&|
                     ||||                              |
                     ||                     t          j        |
|	          S )Nc                 4    i | ]\  }}t          |          |S  )id).0	unwrappedorigs      r   
<dictcomp>z5wrap_outputs_maintaining_identity.<locals>.<dictcomp>   s4     % % %It 	9t% % %r   zoThe autograd.Function's vmap staticmethod returned an incompatible (output, out_dims) tuple. Expected out_dims=zI to be compatible with the structure of `output`. out_dims has structure    z but output has structure zV. For more details, please see https://pytorch.org/docs/main/notes/extending.func.html)r?   arg_tree_leavesziptree_flattenNO_OUT_DIMSr   RuntimeError	enumerate
isinstancer    rA   appendr\   tree_unflatten)outputsunwrapped_inputsorig_inputsr>   out_dimsflat_unwrapped_inputsflat_orig_inputsunwrapped_input_to_orig_inputflat_outputsspecrO   out_dims_specifiedflat_out_dimsir=   s                  r   rD   rD      s    #24DE-{;% %"#8:JKK% % %!
  ,W55L$F![0 1(DAA  K%-K K +1*=h*G*G*J	K K
 -1K K K	 	 	 |,, 
+ 
+	6&%,// 	MM&!!!f::666MM76

CDDD 	+MM''&-*:;;<<<<MM''&//**** ...r   c                   $    e Zd ZU eed<   eed<   dS )VmapInfo
batch_size
randomnessN)r*   r+   r,   int__annotations__strr[   r   r   rx   rx      s"         OOOOOOOOr   rx   c                 <    | j         t          j        j        j         uS r   )r   r    rT   Function)r%   s    r   has_overridden_vmap_ruler     s    !)@)EEEr   c                     d}t          | t                    s#t          |dt          |            dz             t	          |           dk    s#t          |dt	          |            dz             d S )Nz}Expected the vmap staticmethod to have two returns, an output and out_dims with pytree structure compatible with the output. zGot a z instead   zGot z returns instead)rh   tuplerf   rS   len)rO   base_error_msgs     r   +validate_vmap_returns_tuple_of_two_elementsr   	  s    	J  fe$$ M>,KT&\\,K,K,KKLLLv;;!>,P3v;;,P,P,PPQQQ r   c                    t          d t          j        j                            |          d         D                       rt          d|           |j        r5t          |          rt          d|j	         d          t          | |g|R  S t          |          st          d|j	         d          t          | |j        |g|R i |S )Nc              3   J   K   | ]}t          |t          j                  V  d S r   )rh   r    rA   )r]   vals     r   	<genexpr>z,custom_function_call_vmap.<locals>.<genexpr>  sB         	3%%     r   r   z|Run vmap on autograd.Function with kwarg-only Tensor args. Please do not pass kwarg-only Tensors to autograd.Function. Got: zYou tried to vmap over a  , but it has both generate_vmap_rule=True and an overridden vmap staticmethod. Please set generate_vmap_rule=False or delete the overridden vmap staticmethod to avoid ambiguity. For more details, please see https://pytorch.org/docs/main/notes/extending.func.htmlz, but it does not have vmap support. Please override and implement the vmap staticmethod or set generate_vmap_rule=True. For more details, please see https://pytorch.org/docs/main/notes/extending.func.html)anyr    utils_pytreerd   NotImplementedErrorgenerate_vmap_ruler   rf   r*   'custom_function_call_vmap_generate_rule custom_function_call_vmap_helperr   )r1   r%   r2   r'   s       r   custom_function_call_vmapr     sd   
  ;&33F;;A>     
 " 
 
 	
 + 
#$566 
	 K*;*D K K K   7*
-5
 
 
 	
 $$566 	
 G&7&@ G G G
 
 	
 ,&+->AI  MS  r   c                                                       t                                                                                      }t	          |t
          j        j        j                   fd}t          |          \  }}t          j        d |          rE |            5  rt          |g|R  cd d d            S  ||i |cd d d            S # 1 swxY w Y    |            5   |||g|R i |}	d d d            n# 1 swxY w Y   t          |	           |	\  }
}fd}t          |
||||          S )N)ry   rz   c                       r                                 S t          j                            t          j                            t          j        j        j                            S r   )rC   r    r!   _ExcludeDispatchKeyGuardDispatchKeySetDispatchKeyFuncTorchBatched)autograd_function_caser1   s   r   lower_to_nextz7custom_function_call_vmap_helper.<locals>.lower_to_nextL  sR    ! 	$$&&&844''(<(MNN  r   c                 
    | d u S r   r[   )dims    r   r;   z2custom_function_call_vmap_helper.<locals>.<lambda>X  s
    3$; r   c                 .    || nt          | |          S r   )r
   )r=   out_dimr   s     r   r>   z1custom_function_call_vmap_helper.<locals>.wrap_fne  s%      F??	
r   )rn   )r:   rx   ry   rz   rh   r    rT   rU   FunctionMetar   r?   tree_allr   r   rD   )r1   vmap_functionopr2   r'   infor   rE   in_dimsrO   rF   rn   r>   r   r   s   `            @@r   r   r   @  s]     %%''M))++))++  D (EN,C,PQQ      #1="I"I ..88 /]__ 	/ 	/% /+B::::	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ r8.v..		/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 
 M MtWL/ALLLVLLM M M M M M M M M M M M M M M/777!'h
 
 
 
 
 -,h(   s*   *CCC!C/D		DDc                 j    | d         }t          |t                    r| d d         } n| d         } | |fS )Nr   )rh   r   )rk   rn   s     r   unpack_outputsr   q  s@    r{H(E"" #2#,!*Hr   c                    t          ||                                           \  }}t          |||                                 |                                           }|                                 5  t          |g|R  }d d d            n# 1 swxY w Y   t          |t                    sJ t          |          \  }}t          |||                                           S r   )r   r:   vmapify_autograd_functionry   rz   rC   r   rh   r   r   r   )r1   r%   r2   rE   r   vmapped_functionrk   rn   s           r   r   r   z  s-   "0;;L;L;N;N"O"O07K$:$:$<$<k>T>T>V>V  
				 N N&'7M:LMMMN N N N N N N N N N N N N N N gu%%%%%&w//GX;+<+<+>+>???s   0B

BBc                      t          d          )Nz0NYI: Functionalize rule for custom_function_call)rf   )r1   r%   r   r2   s       r   "custom_function_call_functionalizer     s     I
J
JJr   c           
          	  fd}	 fd}	 fd}	 fd}d j          }t          |t          j        j        ft          |          t          |          t          |          t          |          dd          		S )Nc                       t          j                  |  \  }}t          |t          j                  r||fS g ||R S r   )r   rG   rh   r    rA   )r2   rk   rn   r%   ry   r   rz   s      r   rG   z*vmapify_autograd_function.<locals>.forward  sc    
L%w
J
 
 gu|,, 	&H$$%G%X%%%r   c                      t          |          \  }}t                     fd} t          |	|f
          ||           t           d          si  _         j                            |i           d S )Nc                 v   t          t                                }                    || |           t          d | D                       }t	          d          si _        j                            |i           t	          d          si _        j                            |j        i           d S )Nc              3   \   K   | ]'}t          |t          j                  r|j        nd V  (d S r   )rh   r    rA   shape)r]   inps     r   r   zRvmapify_autograd_function.<locals>.setup_context.<locals>.inner.<locals>.<genexpr>  sJ       ! !ILZU\::D		! ! ! ! ! !r   _pt_input_shapes_pt_saved_tensors_bdims_stack)	CtxCustomSaver   rI   r   hasattrr   updater   _pt_saved_tensors_bdims)rK   rk   wrapped_ctxinput_shapesr%   rJ   keys       r   innerz?vmapify_autograd_function.<locals>.setup_context.<locals>.inner  s    
 (]__==K++KIII ! ! !PV! ! !  L 3 233 *')$ ''l(;<<<3 ?@@ 7461-44{:<    r   _pt_out_dims)r   r\   r   r   r   r   )rJ   rK   rk   rn   r   r   r3   r%   ry   r   rz   s   `    @r   rI   z0vmapify_autograd_function.<locals>.setup_context  s    *733mm	 	 	 	 	 	 	4	
h		
 	

 '	 	 	 sN++ 	"!Ch00000r   c                 6    t                    }	 fd}t          |          } t          | j        |         |f
           j        |          \  }}t          || j        |         
          }t          |t          j	                  r|d fS g |d R S )Nc                 @    t          |           } j        |g|R  S r   )CtxWithSavedTensorsrQ   )saved_tensorsrR   r   r%   rJ   s      r   jvp_no_contextz>vmapify_autograd_function.<locals>.jvp.<locals>.jvp_no_context  s.    -c=AAK($(@x@@@@r   )
r\   get_tangents_in_dimsr   r   r   	reductifyr   rh   r    rA   )rJ   rR   r   r   tangent_in_dimsout_tangentsout_tangents_dimsrO   r3   r%   ry   r   rz   s   `       r   rQ   z&vmapify_autograd_function.<locals>.jvp  s    mm	A 	A 	A 	A 	A 	A /wAA+
,.s3_E	+
 +

 
X+' +''' +S-=c-BJ
 
 fel++ 	!4< F=D== r   c                     t          	          }|d d         } j        |         }t          |t                    s|f}t          d t	          ||          D                       }
 fd} t          | j        |         |ff           j        |f          \  }}t          || j	        |                   }|S )Nr   c              3   (   K   | ]\  }}||nd V  d S r   r[   )r]   grad_outputin_dims      r   r   z>vmapify_autograd_function.<locals>.backward.<locals>.<genexpr>  sC       %
 %
#V "-FF4%
 %
 %
 %
 %
 %
r   c                 J    | \  }}t          |          } j        |g|R  S r   )r   rM   )rK   r   grad_outputsr   r%   rJ   s       r   backward_no_contextzHvmapify_autograd_function.<locals>.backward.<locals>.backward_no_context  s8    *0'M<-c=AAK-$-kILIIIIr   )
r\   r   rh   r   rc   r   r   r   r   r   )rJ   r   r   grad_outputs_grad_outputs_in_dimsr   grad_insgrad_ins_dimsrO   r3   r%   ry   r   rz   s   `        r   rM   z+vmapify_autograd_function.<locals>.backward  s   mm$SbS)"/4.66 	;$8#: $ %
 %
'*=:N'O'O%
 %
 %
  
  

	J 	J 	J 	J 	J 	J
#
,/46JKM	#
 #

 m
,#. #.- mWj#:Ns:S
 
 r   VmappedT)rG   rM   rQ   rI   r   )r*   rS   r    rT   r   rW   )
r%   r   ry   rz   rG   rI   rQ   rM   rX   r3   s
   ````     @r   r   r     s(   & & & & & & & &'1 '1 '1 '1 '1 '1 '1 '1 '1R! ! ! ! ! ! ! ! !.        : 2&/11D		 "#G,,$X..$$)-88"&	
 	

 
I r   c                     t          j        |           \  }}t          j        | }d t          ||          D             }t          j        ||          S )Nc                      g | ]\  }}|d n|S r   r[   )r]   r   tangents      r   
<listcomp>z(get_tangents_in_dims.<locals>.<listcomp>
  s4       FG V  r   )r?   rd   rb   rc   rj   )
input_dimsrR   flat_in_dimsrs   flat_tangentsrO   s         r   r   r     sa    ,Z88L$*H5M "<??  F  ...r   c                   @    e Zd ZU dZeedf         ed<   d Zd Zd Z	dS )
WrappedCtx)_pt_reserved_attrs_pt_inner_ctx.r   c                     t          |t                    s<t          |           j        }|D ]%}t	          ||          st          d| d          || _        d S )NzPyTorch reserves the zU field on ctx. Please name your fields on ctx something else to avoid name collision.)rh   r   rS   r   r   rf   r   )r   rJ   reserved_attrsrX   s       r   r   zWrappedCtx.__init__I  s~    #z** 		!$ZZ:N&  sD)) "!N ! ! !  
 !r   c                 ,    t          | j        |          S r   )getattrr   )r   rX   s     r   __getattr__zWrappedCtx.__getattr__V  s    t)4000r   c                 r    |t          |           j        v r|| j        |<   d S t          | j        ||          S r   )rS   r   __dict__setattrr   )r   rX   values      r   __setattr__zWrappedCtx.__setattr__Y  s<    4::000"'DM$Ft)4777r   N)
r*   r+   r,   r   r   r}   r|   r   r   r   r[   r   r   r   r   F  s\         *Qc3hQQQ! ! !1 1 18 8 8 8 8r   r   c                   J     e Zd Zdgej        R Z fdZed             Z xZS )r   _pt_new_saved_tensorsc                 X    t                                          |           || _        d S r   )r   r   r   )r   rJ   new_saved_tensorsr   s      r   r   zCtxWithSavedTensors.__init__d  s)    %6"""r   c                     | j         S r   )r   )r   s    r   r   z!CtxWithSavedTensors.saved_tensorsh  s    ))r   )	r*   r+   r,   r   r   r   propertyr   r-   r.   s   @r   r   r   a  sg        1RJ4QRR7 7 7 7 7 * * X* * * * *r   r   c                   B     e Zd Zddgej        R Z fdZd Zd Z xZS )r   r   _pt_current_levelc                 f    t                                          |           d| _        || _        d S )Nr[   )r   r   r   r   )r   rJ   r   r   s      r   r   zCtxCustomSave.__init__t  s1    ')$!.r   c                 b    t          || j                  \  }} | j        j        |  || _        d S r   )r   r   r   save_for_backwardr   r   tensorsunwrapped_tensorsbdimss       r   r   zCtxCustomSave.save_for_backwardy  s<    #1'4;Q#R#R 5,,.?@@',$$$r   c                 b    t          || j                  \  }} | j        j        |  || _        d S r   )r   r   r   save_for_forwardr   r   s       r   r   zCtxCustomSave.save_for_forward~  s<    #1'4;Q#R#R 5++->??',$$$r   )	r*   r+   r,   r   r   r   r   r   r-   r.   s   @r   r   r   m  sv        ! 
	& / / / / /
- - -
- - - - - - -r   r   c           	         t          | t                    s| f} t          |t                    s|f}t          |t                    s|f}|t          |           dz  }t          fdt          | |||          D                       }|S )Nr   c              3   H   K   | ]\  }}}}t          ||||          V  d S r   )reductify_leaf)r]   gigi_bdimi_bdimmaybe_ishapery   s        r   r   zreductify.<locals>.<genexpr>  sO        -B 	r7FJEE     r   )rh   r   r   rc   )
grad_inputgrad_input_bdim
input_bdimry   &target_shape_without_bdim_to_reduce_torO   s      `  r   r   r     s     j%(( # ]
ou-- -*,j%(( # ]
-514Z71J.    142	2
 2
    F Mr   c                 x   | d S ||| S |||                      |          S |J |E|                     |          } t          | j                  }|||<   |                     |          } |}|- t          t          j        j        |d f|          | |          S ||k    r| 	                    ||          } | S )N)r   rn   )
sum	unsqueezelistr   expandr   r    rA   sum_to_sizemovedim)r  r  r  ry   r  	new_shapes         r   r   r     s    t:#5"z'9~~o...0 !!!))*55
)**	 *	*&&y11
$-9
tL$$d+
 
 
 <	> > 	> _$$''DD
r   c                       fd}|S )Nc                 2     |i |} | ||           |S r   r[   )rJ   r&   r'   r=   original_forwardoriginal_setup_contexts       r   new_forwardz8autograd_function_forward_rewritten.<locals>.new_forward  s2    !!42622sD&111r   r[   )r  r  r  s   `` r   #autograd_function_forward_rewrittenr    s*         
 r   c                   &     e Zd Zd fdZd Z xZS )AutogradFunctionApplyr   Nc                 J    t                                          d           d S )Nautograd_function_applyr   r   s    r   r   zAutogradFunctionApply.__init__  s"    233333r   c                    	
 d 
|d         }|d         	t          |          }d |         } G 	
fddt          j        j                  } |j        | S )Nargs_tensor_masknon_differentiable_idxc                   L    e Zd Zefd            Ze fd            ZdS )5AutogradFunctionApply.__call__.<locals>.ApplyTemplatec                      d gR  \  }	t                    dk    r:g }t          |          D ]\  }}|v r|                    |            | j        |  |S )Nr   )r   rg   ri   mark_non_differentiable)
rJ   r&   r=   non_differentiable_outputrv   r9   fwdfwd_argsr  saved_valuess
         r   rG   z=AutogradFunctionApply.__call__.<locals>.ApplyTemplate.forward  s     (+s4';(';';';$ -..2202- )& 1 1 @ @1 6665<<Q???/C/1JKKr   c                      d g|R  S r   r[   )rJ   gradbwdr"  s     r   rM   z>AutogradFunctionApply.__call__.<locals>.ApplyTemplate.backward  s     s46$66666r   N)r*   r+   r,   rW   rG   rM   )r%  r   r!  r  r"  s   r   ApplyTemplater    sq               \ 7 7 7 7 7 \7 7 7r   r&  )r  r    rT   r   r$   )r   r   r%  r!  
fwd_kwargsr  length_of_tensor_argsnew_fwd_argsr&  r  r"  s    ```     @@r   r#   zAutogradFunctionApply.__call__  s    %&89!+,D!E #$4 5 5   6!6 67	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7EN3 	7 	7 	7( #}"L11r   r(   r)   r.   s   @r   r  r    sL        4 4 4 4 4 42 2 2 2 2 2 2r   r  r   )7typingr   r    torch.utils._pytreer   r   r?   torch._C._functorchr   r   r   r   torch._functorch.apisr   torch._functorch.utilsr	   torch._functorch.vmapr
   r   r   r   r   
torch._opsr   torch.autograd.forward_adr   r   r   py_implGradJvpr5   r0   re   rD   rx   r   r   Vmapr   r   r   r   Functionalizer   r   r   r   r   r   r   r   r  r  r  r[   r   r   <module>r7     s          $ $ $ $ $ $ $ $ $            ' & & & & & H H H H H H              + * * * * * ; ; ; ; ; ;8 8 8 8 8(; 8 8 84 98:: < m011m/00  10 213 3 3~  ?J,/ ,/ ,/ ,/r    z   
F F FR R R m011( ( 21(V. . .b  
@ 
@ 
@ m9::K K ;:Kt t tr/ / /~8 8 8 8 8 8 8 86	* 	* 	* 	* 	** 	* 	* 	*- - - - -J - - -8 ,0   B ,08 8 8 8v  "2 "2 "2 "2 "2/ "2 "2 "2J 0/11   r   