
    קg*.                         d dl Z d dlmc mZ d dlmZ d dl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         U/var/www/html/ai-engine/env/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  ##  ,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 2. 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>4   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>.kernel2   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   1   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   <   so     +&%(( 	""9LL!L+,,L0A0AAAAA%'"*3C8PR^4_4_*`*` 	2 	2&C&.##u|,, % ;.55c:::#t$$ % ;.55c::: 2"15M 1 1!1 1CG991 1 12 2 22 & 	E'C')CDDDD/ ,+,	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>.forwardh   s8   %%d+++(i$??D4466 , ,$d+, , , , , , , , , , , , , , , (d335 5I +:&$*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>.applyd   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   \   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C C 	C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<     3 3 3#//113SX 3 3 3r   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   C C C C C &-- / .*++. . 	/ 	/ 	/3 3);)E)N 3 3 3M"''))K## (( ()4( ( ( 	) 	) 	) ',,.. #A #A
d9d++h%% 	dUDM22 ( 'D ' 'd' ' ' ( ( ( t99H-- %D % %(+H% %T% % & & & #,Ch,?,?"@"@ . .Ya9!!U\22 AE @ @ @'+Aww@ @:=@ @ A A A "$55 .E - - -%(- -!$- - #+- - . . . <$-- 	NE MT

 M MM M M N N N (EL11 	AE @T @ @BF@ @3;@ @ @ A A AC#A #A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<     7 7 7:3 5573 7 7 7r   c                 L    g | ]!\  }}t          |t          j                  |"S r,   r   r   s      r   rm   z,save_pytree_for_backward.<locals>.<listcomp>   s<     ? ? ?zsE(==?s ? ? ?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7 7:)>)> 7 7 7K? ?Yz-B-B ? ? ?OP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   )r!   torch.utils._pytreeutils_pytreer(   collectionsr   	functoolsr   r   r6   rc   r_   	lru_cachert   rD   rV   rW   rF   rT   r,   r   r   <module>r      s    $ $ $ $ $ $ $ $ $ " " " " " "      >  E E E@6 6 6r	 	 	     9A 9A 9Ax- - -* * *&    r   