
    %Vji3/                         d dl Z d dlmZ d dlZd dlmc mZ d Zd Z	d Z
d Zd Ze j        d             Zd	 Zd
 Zd Zd Zd ZdS )    N)
namedtuplec                 4     t                      fd}|S )Nc                                          d          r"                    d          j        } || i |S                      d          s                     d          rY                     d          rdnd}|dk    rdnd}                    |          j        }t	          d| d d| d| d	           | i |S )	Nautogradsave_for_backwardbackwardzWe found a 'z' registration for  at z but were unable to find a 'z' registration. To use the CustomOp API to register a backward formula, please provide us both a backward function and a 'save for backward' function via `impl_backward` and `impl_save_for_backward` respectively.)	_has_impl	_get_implfunclocationRuntimeError)argskwargskernelmissingfoundlocautograd_fallback	custom_ops         S/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_custom_op/autograd.pyinnerz*autograd_kernel_indirection.<locals>.inner   s&   z** 	+((449F64*6***
 233 	y7J7J:7V7V 	'0':'::'F'FV##J  ,3j+@+@''jE%%e,,5C:u : : : :: :4;: : :   ! $1&111    )autograd_not_implemented)r   r   r   s   ` @r   autograd_kernel_indirectionr      s7    0;;2 2 2 2 2 20 Lr   c                       fd}|S )Nc                      t          j                    r't          j        d | |f          rt	          d          t           j                                        5   | i |cd d d            S # 1 swxY w Y   d S )Nc                 D    t          | t          j                  o| j        S N)
isinstancetorchTensorrequires_gradxs    r   <lambda>z:autograd_not_implemented.<locals>.kernel.<locals>.<lambda>6   s    jEL11Eao r   z.Autograd has not been implemented for operator)r!   is_grad_enabledpytreetree_anyr   _C_AutoDispatchBelowAutograd)r   r   r   s     r   r   z(autograd_not_implemented.<locals>.kernel4   s     "" 	QvEEf~(
 (
 	Q OPPPX0022 	. 	.9d-f--	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   A//A36A3 )r   r   s   ` r   r   r   3   s#    . . . . . Mr   c                    |t          |t                    s|f}n|}t          |          t          |          k    sJ g }t          t	          ||                    D ]\  }\  }}t          |t
          j                  r|s|                    |           :t          |t                    r|s|	                    |           g|r&t          d| d| dt          |           d          |r | j        |  d S d S d S )NzWith output_differentiability=z	. At idx z , we received an object of type za that is not a Tensor, so it cannot have be marked as differentiable in output_differentiability.)r    tuplelen	enumeratezipr!   r"   appendlistextendr   typemark_non_differentiable)ctxoutputoutput_differentiabilitytuple_outputnon_differentiable_tensorsidxdifferentiableouts           r   r6   r6   ?   su     +&%(( 	""9LL!L+,,L0A0AAAAA%'"*3(,77+
 +
 	 	&C&.# #u|,, % ;.55c:::#t$$ % ;.55c::: "15M 1 1!1 1CG991 1 1   & 	E'C')CDDDD5 ,+2	E 	Er   c                 &      fd}|S )Nc                      t          j        |           \  }d 
fd}	fd}t          	j        dz   ||          } |j        | }J t          j        t          |                    S )Nc                    |                      d           t          j        t          |                    }t          j                                        5   | }d d d            n# 1 swxY w Y   t          t          j        t          |                    }t          |          } ||          }t          | ||f           t          | |
           t          j        |          \  }	t          |          S )NT)set_materialize_gradsr(   tree_unflattenr3   r!   r*   r+   namedtuple_argstree_mapr5   save_pytree_for_backwardr6   tree_flattenr.   )r7   	flat_argsr   r8   	args_infosave_for_backward_fn_inputsto_saveflat_outputop_overloadout_specr9   save_for_backward_fnschemaspecs           r   forwardz9construct_autograd_kernel.<locals>.apply.<locals>.forwardn   s1   %%d+++(i$??D4466 , ,$d+, , , , , , , , , , , , , , , (d0K0KLLI*9&$*G*G'**+FOOG$S7I*>???#C1IJJJ %+$7$?$?!K%%%s   A))A-0A-c                    	J t          j        t          |          	          }t          |           \  }}t	                      }t          |t                    s|f} ||g|R  }t          ||           t          ||          S r   )	r(   rC   r3   unpack_savedobjectr    r.   validate_grad_inputs_dictgrad_inputs_dict_to_flat_tuple)
r7   flat_grad_outputgradssavedrI   	inner_ctxgrad_inputs_dictbackward_fnr   rN   s
          r   r   z:construct_autograd_kernel.<locals>.apply.<locals>.backward   s    ''')$/?*@*@(KKE+C00E9 IeU++ !*{9eDeDDD &&6	9MMM12BINNNr   	_customop)r(   rG   gen_autograd_function_opnameapplyrC   r3   )r   rH   rR   r   generated_clsrL   rN   rQ   r]   r   rM   r9   rO   rP   s         @@r   ra   z(construct_autograd_kernel.<locals>.applyj   s     -d33	4	& 	& 	& 	& 	& 	& 	& 	& 	& 	&&	O 	O 	O 	O 	O 	O 	O  .+Wh
 
 *m)95###$T+%6%6AAAr   r,   )rP   r9   r   rM   rO   r]   ra   s   `````` r   construct_autograd_kernelrc   b   sL    -B -B -B -B -B -B -B -B -B -B^ Lr   c                     t          | t          j        j        ft	          |          t	          |          d          }|S )N)rR   r   )r5   r!   r   Functionstaticmethod)namerR   r   rb   s       r   r_   r_      sG    		 "#G,,$X..	
 	
 M r   c                     d | j         j        D             }t          | j                  dz   }t	          ||          }|S )Nc                     g | ]	}|j         
S r,   )rg   .0args     r   
<listcomp>z'namedtuple_args_cls.<locals>.<listcomp>   s    ===Csx===r   _args)	argumentsflat_allstrrg   r   )rP   attribsrg   	tuple_clss       r   namedtuple_args_clsrt      sD    ==6#3#<===Gv{g%D4))Ir   c                 X    t          |t                    sJ t          |           } || S r   )r    r.   rt   )rP   r   rs   s      r   rD   rD      s2    dE"""""#F++I9dr   c                    fd}t          | t                    s |dt          |                       d j        j        j        D             }|                                 }||k    r |d| d| d           |                                 D ]\  }}t          ||          }t          |t                    r t          |t          t          f          s |d| dt          |           d	           t          |          t          |          k    s. |d| d
t          |           dt          |                      t          t          ||                    D ]w\  }	\  }
}|
t          |
t          j                  s! |d| dt          |
           d|	            t!          |t          j                  s |d| d|	 d|	 d|            xL|Pt          |t          j                  s |dt          |           d| d           t!          |t          j                  s |d| d| d| d           d S )Nc                 h                         d          }t          d d|j         d|            )Nr   z%In the backward function defined for r	   z using the CustomOp API, )r   r   r   )whatr   
forward_ops     r   errorz(validate_grad_inputs_dict.<locals>.error   s]    ''
33BJ B B B B;?B B
 
 	
r   zBexpected the output of the backward function to be a dict but got c                 N    h | ]"}|j                                         |j        #S r,   )r5   is_tensor_likerg   rj   s     r   	<setcomp>z,validate_grad_inputs_dict.<locals>.<setcomp>   s>       8""$$  r   z3expected the returned grad_input dict to have keys z	 but got z. The backward function must return a gradient (can be None) for each arg to the CustomOp that may be a Tensor or Sequence[Tensor]. Args declared to be non-Tensor-like types should not appear in the grad_input dictzfor input 'zR' expected the grad_input dict to hold a list of gradients but got object of type .z1' expected the grad_input dict to hold a list of z gradients but got z\' expected the grad_input dict to hold a list of None or Tensor gradients but got object of z
 at index z(', got a Tensor as the gradient for the z(-th value but expected None because the z(-th value was not a Tensor (it was type zgot object of type z as the gradient for input 'z:', but expected the gradient to be either None or a Tensorz(got a Tensor as the gradient for input 'z3' but expected None as the gradient because input 'z ' was not a Tensor (it was type z).)r    dictr5   _schemaro   rp   keysitemsgetattrr3   r.   r/   r0   r1   r!   r"   
issubclass)r\   ry   rI   rz   expected_keysactual_keysrg   gradarg_infor<   ginfos    `          r   rV   rV      s   
 
 
 
 
 &-- 
,()), ,	
 	
 	

 %/8  M
 #''))K##&& &'2& & &	
 	
 	
 ',,.. / /
d9d++h%% 	dUDM22 %$ % %Dzz% % %  
 t99H--#$ # #&)(mm# #4yy# #  
 #,Ch,?,?"@"@  Ya9!!U\22 E>d > >%)!WW> >8;> >  
 "$55 E+d + +#&+ +"+ + !)+ +   <$-- 	EKd4jj K KK K K  
 (EL11 	E>4 > >@D> >19> > >  W/ /r   c                 2   g }|                                                                 D ]N\  }}|| vr*|                    t          j        d |                     3|                    | |                    Ot          t          j        |                    S )Nc                     d S r   r,   r$   s    r   r&   z0grad_inputs_dict_to_flat_tuple.<locals>.<lambda>  s    D r   )_asdictr   r2   r(   rE   r.   tree_leaves)r\   rI   resultrg   r   s        r   rW   rW     s    F#++--3355 . .h'''MM&/..(CCDDD&t,----#F++,,,r   c                 @   t          j        |          \  }}t          |          }d t          |          D             }d t          |          D             }d |D             }d |D             }|| _        || _         | j        |  || _        || _        || _	        d S )Nc                 L    g | ]!\  }}t          |t          j                  |"S r,   r    r!   r"   rk   r<   things      r   rm   z,save_pytree_for_backward.<locals>.<listcomp>  s=       Uz%7V7V  r   c                 L    g | ]!\  }}t          |t          j                  |"S r,   r   r   s      r   rm   z,save_pytree_for_backward.<locals>.<listcomp>  s>       C%..  r   c                 F    g | ]}t          |t          j                  |S r,   r   rk   r   s     r   rm   z,save_pytree_for_backward.<locals>.<listcomp>   s)    PPP
5%,0O0OPuPPPr   c                 F    g | ]}t          |t          j                  |S r,   r   r   s     r   rm   z,save_pytree_for_backward.<locals>.<listcomp>!  s)    XXXU
5%,8W8WX5XXXr   )
r(   rG   r/   r0   rQ   num_eltsr   tensor_idxssaved_non_tensorsnon_tensor_idxs)	r7   stuff
flat_stuffrQ   r   r   r   tensorsnon_tensorss	            r   rF   rF     s    *511J:H '
33  K #J//  O
 QP*PPPGXXjXXXKCHCLC7##!CO'C)Cr   c                     d g| j         z  }t          | j        | j                  D ]
\  }}|||<   t          | j        | j                  D ]
\  }}|||<   t          j        || j                  }|S r   )	r   r1   saved_tensorsr   r   r   r(   rC   rQ   )r7   r   tensorr<   
non_tensorr   s         r   rT   rT   ,  s    #,&J3,co>> ! ! 
3s4c6IJJ % %
C$
3!*ch77ELr   )	functoolscollectionsr   r!   torch.utils._pytreeutils_pytreer(   r   r   r6   rc   r_   	lru_cachert   rD   rV   rW   rF   rT   r,   r   r   <module>r      s       " " " " " "  $ $ $ $ $ $ $ $ $  @	 	 	 E  E  EF7 7 7t	 	 	     M M M`- - -* * *.    r   