
    AVhV                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ  ej6                  d      dej8                  fd       Z ej6                  d      dej8                  fd       Zdej8                  fdZ ej6                  d      dej8                  fd       Z  ej6                  d      dej8                  fd       Z! ejD                  d         ej6                  d!      dej8                  fd"       Z# ej6                  d#      dej8                  fd$       Z$ ej6                  d%      dej8                  fd&       Z% ej6                  d'      dej8                  fd(       Z& ej6                  d)      dej8                  fd*       Z' ej6                  d+      dej8                  fd,       Z( ejD                  d-        ej6                  d.      d/        Z) ej6                  d0      d1        Z* ej6                  d2      d3        Z+ ej6                  d4      dej8                  fd5       Z, ej6                  d6      dej8                  fd7       Z- ej6                  d8      dej8                  fd9       Z. ej6                  d:      dej8                  fd;       Z/ ej6                  d<      dej8                  fd=       Z0 ej6                  d>      dej8                  fd?       Z1 ej6                  d@      dej8                  fdA       Z2 ej6                  dB      dej8                  fdC       Z3 ej6                  dD      dej8                  fdE       Z4 ejD                  dF        ej6                  dG      dH        Z5 ejD                  dI        ejD                  dJ        ej6                  dK      dej8                  fdL       Z6dM Z7 ej6                  dN      dej8                  fdO       Z8dP Z9dQ Z: ej6                  dR      dej8                  fdS       Z; ej6                  dT      dej8                  fdU       Z< ej6                  dV      dej8                  fdW       Z= ej6                  dX      dej8                  fdY       Z> ej6                  dZ      dej8                  fd[       Z? ej6                  d\       ej6                  d]      d^               Z@ ej6                  d_      d`        ZA ej6                  da      db        ZB ej6                  dc      dd        ZC ejD                  de        ej6                  df      dej8                  fdg       ZD ejD                  dh       dej8                  fdiZE ej6                  dj      dej8                  fdk       ZF ej6                  dl      dej8                  fdm       ZG ej6                  dn      dej8                  fdo       ZH ej6                  dp      dej8                  fdq       ZI ejD                  dr        ejD                  ds        ejD                  dt        ejD                  du        ej6                  dv      dej8                  fdw       ZJ ejD                  dx       dej8                  fdyZK  ej6                  dz      eK         ej6                  d{      eK        ej6                  d|      dej8                  fd}       ZL ej6                  d~      dej8                  fd       ZM ej6                  d      dej8                  fd       ZN ej6                  d      dej8                  fd       ZO ej6                  d      dej8                  fd       ZP ej6                  d      dej8                  fd       ZQ ej6                  d      dej8                  fd       ZR ej6                  d      dej8                  fd       ZS ej6                  d      dej8                  fd       ZT ejD                  d        ej6                  d      dej8                  fd       ZU ej6                  d      dej8                  fd       ZV ejD                  d        ejD                  d        ejD                  d        ej6                  d      d        ZW ej6                  d      d        ZX ej6                  d      d        ZY ej6                  d      dej8                  fd       ZZ ej6                  d      dej8                  fd       Z[ ej6                  d      dej8                  fd       Z\ ej6                  d      dej8                  fd       Z] ej6                  d      dej8                  fd       Z^dej8                  fdZ_ ej6                  d      dej8                  fd       Z` ej6                  d      dej8                  fd       Za ej6                  d      dej8                  fd       Zb ej6                  d      dej8                  fd       Zc ej6                  d      dej8                  fd       Zdy)z0Gradients for operators defined in array_ops.py.    )gen_xla_ops)
pywrap_tfe)context)constant_op)dtypesindexed_slices)ops)sparse_tensor)tensor)tensor_shape)tensor_util)	array_ops)array_ops_stack)cond)control_flow_util)gen_array_ops)gen_math_ops)gen_resource_variable_ops)math_ops)
sparse_opsPackopc                 n    t        j                  || j                  d      | j                  d            S )zGradient for pack op.Naxis)numr   )r   unstackget_attrr   grads     P/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/ops/array_grad.py	_PackGradr#   '   s0     
	 	 
C r{{6':
< <    Unpackc                 N    t        j                  || j                  d            S )zGradient for unpack op.r   r   )r   stackr   r   gradss     r"   _UnpackGradr+   .   s      
		u2;;v+>	??r$   c                 
   d }d }t        | j                        dk(  r||k  r|dgz   S dg|z   S | j                  |   }| j                  || }g }	t        |t        j                        rt        j                         st        |t        j                        rb|j                         j                  d      |d   j                         z  }
t        j                  ||
      }t        j                  |||
      }	nTt!        j"                  |      ryt%        j&                  |j(                        }t%        j&                  |j(                        }||k7  r6t+        j,                  |      }t!        j.                  ||j0                        }|t        j2                  |d         z  }
 ||      }t        |      dkD  r\t        j4                  t        j6                  t9        j:                  |d	      |
dgdd
g            }t        j                  |||
      }	n9t=        j>                  |
|      }tA        ||      D ]+  \  }}|	jC                  t        j6                  |||             - nt        |tD        jF                        r|t        j2                  |d         z  }
t+        j,                  |      }|tI        d      |dk  r=t+        j,                  t        j2                  |d               }|tI        d      ||z  }|D cg c]  }t        jJ                  |       }}|dkD  r |||
      \  }}|D ]  }t        j6                  |jL                  |t        jN                  d
gt        j6                  |dgd
g      gd            }|	jC                  tE        jF                  ||jP                  |             tS        jT                  |||z        } nyt!        j.                  d|jP                  j0                        }|D ]0  }t        jV                  ||
      }|j0                  |jP                  j0                  k7  r+tS        jX                  ||jP                  j0                        }||z   }t        j4                  t        jZ                  tS        j\                  |jP                  |k\  |jP                  |k              dg	      }t        jV                  |jP                  |      |z
  }t        jV                  |jL                  |      }|	jC                  tE        jF                  |||             |}3 nt_        dta        |      z        ||k  r|	dgz   S dg|	z   S c c}w )a8  Gradient for concat op.

  Args:
    op: An operation.
    grad: `Tensor` or `IndexedSlices` representing the gradients with respect to
      each output of the op.
    start_value_index: An integer index of the first value in the op.inputs.
    end_value_index: An integer index of the last value in the op.inputs.
    dim_index: An integer index of concat_dim or axis parameter in op.inputs.

  Returns:
    Tensors representing the partial gradients with respect to each input
    of the op.

  Raises:
    ValueError: if concat_dim/axis is not statically known.
  c                 x   t        j                  | d         }t        j                  t        j                  t        j                  |d      t
        j                        dgt        j                  ||z
  dz
  t
        j                        gd      }t        j                  |t
        j                        }||fS )zBCreate variables for iteratively slicing a dense gradients tensor.r   dtype   )r   shapeconcatzerosexpand_dimsr   int32)sizes
concat_dimshape_of_shapemaskbegins        r"   _CreateDenseMaskAndBeginz3_ConcatGradHelper.<locals>._CreateDenseMaskAndBeginI   s     __U1X.N !!*a0	FHIs3a7v||L 		
D
 OON&,,?E;r$   c                 V   t        j                         rt        j                  |       S g }d}| D ]_  }t        j                  |      }t        |t        j                        r|j                  j                  dk7  rd} n|j                  |       a |r|S t        j                  |       S )z-Extract the shapes of a set of input tensors.TConstF)r   executing_eagerlyr   shape_nr1   
isinstancer   Tensorr   typeappend)inputsr6   fully_knownxinput_shapes        r"   _ExtractInputShapesz._ConcatGradHelper.<locals>._ExtractInputShapesX   s      "v&&EK  OOA&k'*5..*=*=*Hll;  lv&&r$      Nr   )valuer/      r0   r'   zHCan only compute IndexedSlices gradient with statically-known concat_dimzkCan only compute IndexedSlices gradient with negative concat_dim when first value rank is statically-known.r.   z(Expected Tensor or IndexedSlices, got %s)1lenrD   r@   r   rA   r   r>   r
   EagerTensor_numpyitem_rankr   TFE_Py_TensorShapeSlicer   splitr   is_constantr   GetOutputContextr   r   constant_valueconstantr/   ranksqueezeslicer   r(   r   concat_offsetziprC   indexed_slices_libIndexedSlices
ValueErrorr1   valuesr2   indicesr   addgathercastwherelogical_and	TypeErrorrB   )r   r!   start_value_indexend_value_index	dim_indexr;   rH   r7   input_values	out_gradsnon_neg_concat_dimr6   grad_contextdim_contextrJ   offsetr:   sizeconcat_dim_staticrX   rF   r9   
new_valuesstartsize_concat_dimendindices_to_selectnew_indicess                               r"   _ConcatGradHelperry   4   s   *'( 	^q+y844&=KtftmKyy#*,_=,)fmm$  "jS__&M 



"
"1
%Q(=(=(?
?  001CEe//$/ABi		 	 	, )99$''B'88G,&,,Z8%"++%z?O?OP* &	|A(GG ",/e
 
Ub!!OO%%e!47I16MB OOD%1CD	,,-?G / 	?MUD


9??4=
>	?$*889 $inn\!_&EE#22:>  5 6 61''	|A(GHd	 - . 	. 4)56AY__Q6E61 -U4FGkdE 1$__KKrdIOOD1#t$DEqIK
 	,,ZtL	N UD4K01 ""1DLL,>,>?e $#**41CD  DLL$6$66$MMT\\%7%79/o%%--OO$$T\\U%:%)\\C%79: 	
  &&t||5FG%O%%dkk3DE
,,ZdK	M!$ >dK
LL /9 <)tf
 4&
C Q 7s   U Concatc                 H    t        | |dt        | j                        d      S )Nr0   r   rh   ri   rj   )ry   rM   rD   r    s     r"   _ConcatGradr}      s&    	
"))n
 r$   ConcatV2c                 "    t        | |ddd      S )Nr   rL   r|   )ry   r    s     r"   _ConcatGradV2r      s    	$!R2
G Gr$   ConcatOffsetSlicec                    | j                   d   }| j                   d   }t        j                  |      }|j                  }t        j                  | j
                  d   |      }t        j                  t        j                               r-t        j                  t        j                  |      ||      ddfS t        j                  |dg      }t        j                  ||      }t        j                  t        j                  ||      |z
  |z
  |      }	t        j                   ||	gd      }
t        j"                  ||
      ddfS )zGradient for Slice op.r   r0   out_typeN)rD   r   rX   r/   r1   outputsr   GraphOrParentsInXlaContextr
   get_default_graphr   xla_dynamic_update_slice
zeros_liker   r(   reshaper2   pad)r   r!   	input_vec	begin_vec
input_rankindex_dtype
slice_sizer1   
before_pad	after_padpaddingss              r"   
_SliceGradr      s    iil)iil)~~i(*+rzz!}{C*11#2G2G2IJ//	0D0DY0O04iABFM M 

Q
0%  E2*ooi+6CiO) z95q9(	tX	&d	22r$   StridedSlicec                 l   | j                   d   }| j                   d   }| j                   d   }t        j                  | j                   d   |j                        }t	        j
                  |      }||n|}t	        j
                  |      }||n|}t	        j
                  |      }||n|}t	        j
                  |      }	|	|	n|}t        j                  |||||| j                  d      | j                  d      | j                  d	      | j                  d
      | j                  d      
      dddfS )zGradient for StridedSlice op.r0   rI      r   r   N
begin_maskend_maskellipsis_masknew_axis_maskshrink_axis_maskr   r   r   r   r   )rD   r   r1   r/   r   rV   strided_slice_gradr   )
r   r!   r:   rv   stridesrF   x_staticbegin_static
end_staticstrides_statics
             r"   _StridedSliceGradr     s(    ))A,%
		!#IIaL' oobiilU[[9!''*(&hA!++E2,&2,%))#.* ,
##--g6.,8Ng'		%	%	
\*{{:&KK0KK0{{#56

8 :>tT

J 
Jr$   StridedSliceGradc                 8   | j                   d   }| j                   d   }| j                   d   }ddddt        j                  ||||| j                  d      | j                  d      | j                  d      | j                  d      | j                  d	      
	      fS )z!Gradient for StridedSliceGrad op.r0   rI   r   Nr   r   r   r   r   r   )rD   r   strided_slicer   )r   r!   r:   rv   r   s        r"   _StridedSliceGradGradr   0  s     ))A,%
		!#IIaL'	tT4!8!8
	\*{{:&KK0KK0{{#56	"8 	
8 	8r$   TensorStridedSliceUpdatec           
         | j                   d   }| j                   d   }| j                   d   }| j                  d      | j                  d      | j                  d      | j                  d      | j                  d      fd	} |t        j                  ||||      } |t        j                  ||||t        j
                  |            }t        j                  ||j                  
      }t        j                  | j                   d   |j                  
      }	t        j                  ||	      \  }
}t        j                  ||d      }t        j                  ||	      }|d d d |fS )Nr0   rI   r   r   r   r   r   r   c           	           | |dS )N)r   r   r   r   r    )fargsr   r   r   r   r   s     r"   Applyz,_TensorStridedSliceUpdateGrad.<locals>.ApplyM  s!    d".((* *r$   r      Tr   keepdims)rD   r   r   r   tensor_strided_slice_updater   r1   r/   r   broadcast_gradient_argsr   
reduce_sumr   )r   r!   r:   rv   r   r   dydxslice_shapevalue_shape_reduction_axesdy_reshapedr   r   r   r   r   s                @@@@@r"   _TensorStridedSliceUpdateGradr   C  sG   
))A,%
		!#IIaL'{{<(*[[$(++o.-++o.-[[!34* * Y$$5#w("Y225#w	(<(<R(@B"
 U[[9+		!{7H7HI+#;;; !^##B^dK+k2"	T4r	!!r$   Splitc                 ^    d t        j                  t        |      | j                  d         fS Nr   )r   r2   listrD   r)   s     r"   
_SplitGradr   f  s&    	yURYYq\:	::r$   SplitVc                     t        j                  t        |      | j                  d         }|gd gt	        | j                        dz
  z  z   }|S )NrI   r0   )r   r2   r   rD   rM   )r   r*   	returnvals      r"   _SplitVGradr   k  sS    tE{BIIaL9)k
 
"))nq ) 
r$   r=   Diagc                 ,    t        j                  |      S N)r   	diag_partr   r!   s     r"   	_DiagGradr   x  s    			T	""r$   DiagPartc                 ,    t        j                  |      S r   )r   diagr   s     r"   _DiagPartGradr   }  s    		r$   
MatrixDiagc                 ,    t        j                  |      S r   )r   matrix_diag_partr   s     r"   _MatrixDiagGradr     s    		#	#D	))r$   MatrixDiagV2c                 T    t        j                  || j                  d         d d d d fS )Nr0   k)r   r   rD   r    s     r"   _MatrixDiagV2Gradr     s0    		#	#
biil
!4t
4 4r$   MatrixDiagV3c                 t    t        j                  || j                  d   | j                  d            d d d d fS )Nr0   alignr   r   )r   r   rD   r   r    s     r"   _MatrixDiagV3Gradr     s=    		#	#
biil"++g"6
89=tT4
P Pr$   MatrixDiagPartc                    | j                   d   j                         dd  }|j                         r |d   |d   k(  rt        j                  |      S t        j
                  t        j                  | j                   d         |      S )Nr   r0   rD   	get_shapeis_fully_definedr   matrix_diagmatrix_set_diagr   r   r!   matrix_shapes      r"   _MatrixDiagPartGradr     sq    1'')"#.,""$aLO)K  &&$$Y%9%9"))A,%GNNr$   MatrixDiagPartV2c                 P   | j                   d   j                         dd }|j                         r/t        j                  || j                   d   |d   |d         ddfS t        j
                  t        j                  | j                   d         || j                   d         ddfS )zGradient for MatrixDiagPartV2.r   r   Nr0   )r   num_rowsnum_colsr   r   r   s      r"   _MatrixDiagPartV2Gradr     s     1'')"#.,""$  
))A,aa	" $(	. . $$RYYq\*DBIIaLBCGN Nr$   MatrixDiagPartV3c                 v   | j                   d   j                         dd }| j                  d      }|j                         r0t	        j
                  || j                   d   |d   |d   |      ddfS t	        j                  t	        j                  | j                   d         || j                   d   |      ddfS )zGradient for MatrixDiagPartV3.r   r   Nr   r0   )r   r   r   r   r   )rD   r   r   r   r   r   r   r   )r   r!   r   r   s       r"   _MatrixDiagPartV3Gradr     s     1'')"#.,
++g
%""$  
))A,aa
 D! ! $$RYYq\*DBIIaLD! !r$   MatrixSetDiagc                    | j                   d   j                         j                  |j                               }| j                   d   j                         }|dd j                  |dd       }|dd }|j                         r<|j                         r,|j	                         t        |j	                               gz   }nt        j                  |      5  t        j                  |      }t        j                  |      }t        j                  |dg|dz
  g      }t        j                  ||dz
  gdg      }t        j                  |      }t        j                  ||ggd      }ddd       t        j                  |t        j                   ||j"                              }	t        j$                  |      }
|	|
fS # 1 sw Y   WxY w)zGradient for MatrixSetDiag.r   r0   Nr   rL   rI   r.   )rD   r   
merge_withr   as_listminr
   colocate_withr   r1   rX   rZ   r   
reduce_minr2   r   r3   r/   r   )r   r!   rG   
diag_shapebatch_shaper   
grad_shape	grad_rankmin_dim
grad_input	grad_diags              r"   _MatrixSetDiagGradr    s    		!&&(33DNN4DE+yy|%%'*CR ++JsO<+RS!,!!#(E(E(G$$&#l.B.B.D*E)FFJ			4	  A??4(j..&iOOJi!m_Ek__Z)a-1#Fl##L1g##[7)$<a@jA ((
IOOJdjj9;*((.)
i	  A As   BF<<GMatrixSetDiagV2c                 n   | j                   d   j                         }|j                         st        j                  |      }|dd }|dd }t        j
                  | j                   d   dg      }|d   |d   t        j                  t        j                  d      fdd       }t        j                  t        j                  d      fd	d
       }t        j                  |d   |z   |d   |z         t        j                  t        j                        fdfd      }	t        j                  ||	gd      }t        j                  |t        j                  ||j                        | j                   d         }
t        j                   || j                   d         }|
|dfS )zGradient for MatrixSetDiagV2.r0   Nr   rI   rL   r   c                       S r   r   d_uppers   r"   <lambda>z&_MatrixSetDiagGradV2.<locals>.<lambda>      7 r$   c                       yr   r   r   r$   r"   r  z&_MatrixSetDiagGradV2.<locals>.<lambda>      r$   c                  
      S r   r   d_lowers   r"   r  z&_MatrixSetDiagGradV2.<locals>.<lambda>  	    wh r$   c                       yr   r   r   r$   r"   r  z&_MatrixSetDiagGradV2.<locals>.<lambda>  r
  r$   c                  0    t        j                   g      S r   r
   convert_to_tensormax_diag_lens   r"   r  z&_MatrixSetDiagGradV2.<locals>.<lambda>      %%|n5 r$   c                  >    t        j                   z
  dz   g      S Nr0   r  r  r  r  s   r"   r  z&_MatrixSetDiagGradV2.<locals>.<lambda>  &    %%w'81'<'3'5 6 r$   r.   r   )rD   r   r   r   r1   r   r   r   lessgreaterminimumequalr2   r   r3   r/   r   )r   r!   r   r   r   r   
diag_indexy_offsetx_offsetpostfixr   r   r  r  r  s               @@@r"   _MatrixSetDiagGradV2r"    s|    yy|%%'*		$	$	&&JSb/Kbc?L""299Q<"6JmGnGyygq!?I?Hyy!$&6	CH ##LOh$>$0Oh$>@L iiw(5	67G !!;"8!<J((
IOOJdjj9RYYq\K*((1>)
i	&&r$   MatrixSetDiagV3c                    | j                   d   j                         }| j                  d      }|j                         st	        j
                  |      }|dd }|dd }t	        j                  | j                   d   dg      }|d   |d   t        j                  t        j                  d      fdd	       }t        j                  t        j                  d      fd
d       }	t        j                  |d   |z   |d   |	z         t        j                  t        j                        fdfd      }
t	        j                  ||
gd      }t	        j                  |t	        j                  ||j                         | j                   d   |      }t	        j"                  || j                   d   |      }||dfS )zGradient for MatrixSetDiagV3.r0   r   Nr   rI   rL   r   c                       S r   r   r  s   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r  r$   c                       yr   r   r   r$   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r
  r$   c                  
      S r   r   r  s   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r  r$   c                       yr   r   r   r$   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r
  r$   c                  0    t        j                   g      S r   r  r  s   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r  r$   c                  >    t        j                   z
  dz   g      S r  r  r  s   r"   r  z&_MatrixSetDiagGradV3.<locals>.<lambda>  r  r$   r.   r   )rD   r   r   r   r   r1   r   r   r   r  r  r  r  r2   r   r3   r/   r   )r   r!   r   r   r   r   r   r  r  r   r!  r   r   r  r  r  s                @@@r"   _MatrixSetDiagGradV3r+    s    yy|%%'*
++g
%		$	$	&&JSb/Kbc?L""299Q<"6JmGnGyygq!?I?Hyy!$&6	CH ##LOh$>$0Oh$>@L iiw(5	67G !!;"8!<J((
ooj

3
		!	*
 ((1UK)
i	&&r$   MatrixBandPartc                 r    | j                   d   }| j                   d   }t        j                  |||      d d fS Nr0   rI   )rD   r   matrix_band_part)r   r!   	num_lower	num_uppers       r"   _MatrixBandPartGradr2     s8    iil)iil)

$
$T9i
@$	MMr$   EditDistanceFillc                 0    d t        j                  |      fS r   )r   r   r   s     r"   	_FillGradr6  +  s    	x""4(	((r$   	ZerosLikeOnesLikePreventGradientc                 <    t        d| j                  d      z        )Nz(Gradient explicitly disabled. Reason: %smessage)LookupErrorr   )r   r   s     r"   _PreventGradientGradr=  4  s#    >KK	*+ 	, ,r$   c                     t        | t        j                        s| S | j                  t	        dt        |       z        t        j                  | j                  | j                  | j                  d         S )zEConverts an IndexedSlices to a Tensor without sparse->dense warnings.zETensor conversion requested for IndexedSlices without dense_shape: %sr   )
r@   r]   r^   dense_shaper_   strr   unsorted_segment_sumr`   ra   r   s    r"   _IndexedSlicesToTensorNoWarningrB  :  sx    	N$6$D$D	E'
O
n
	  
	&	&~'<'<'5'='='5'A'A!'D
F Fr$   Gatherc                    | j                   d   }t        j                  |      5  t        j                  |      }ddd       | j                   d   }t        j
                  t        j                  |      d      }t        j                  |dd gd      }t        j                  t        |      |      }t        j                  ||      }t        j                  |||      dgS # 1 sw Y   xY w)zGradient for Gather op.r   Nr0   )rD   r
   r   r   r1   r4   rq   r2   r   rB  r]   r^   )r   r!   paramsparams_shapera   rq   values_shaper`   s           r"   _GatherGradrH  H  s     99Q<&
  +??6*L+ IIaL'			y~~g6	:$!!4ab)9":A>,%d+\;&gt,'

*
*67L
I4	PP+ +s   C$$C-c                 Z   |}|j                   j                  }t        j                  | |      }t	        j
                  d|      }t        |dd      D ]  }||dz
     }|||   z  }t	        j                  d|      }	t	        j
                  d|      }
t        j                  |	||
      }||z  }t	        j                  t	        j                  dg|dz
  g      |gt	        j                  dgt	        j                  |      |z
  g      gd      }|t	        j                  ||      z  } |S )zEAddds the batch offsets to the given indices and returns the results.r   r.   r   rL   r0   r'   )r/   
base_dtyper   rd   r   onesranger3   r2   tilerX   r   )rF  ra   
batch_dimsbatch_indicesindices_dtypecasted_params_shapeaccum_dim_valuedim	dim_valuert   stepdim_indices	dim_shapes                r"   _GetBatchIndicesrX  Z  s   ---**- lMBNN2];/:q"% ?c#C!G,I*3//OOOBm4E>>"M2D..	48K?"K  sS1WI&sY^^G4s:;<" I Y&&{I>>M? 
r$   c                    t        j                  t        j                  |      d      }|rt        j                  |      }|d| }||d dd }t	        j
                  |dgd      }	t        j                  dg|gd      }
||	z  }t        | ||      }t        j                  t        |      |
      }t        j                  ||      }t        j                  |||      }|r,t        j                  |t        j                  
gd            }|S )z7Returns the gradient of GatherV2 with batch dimensions.r   Nr0   FrL   )r   r4   rq   r1   r   prodr2   rX  r   rB  r   rA  )rF  r`   ra   rN  gather_dim_sizeindices_sizerG  outer_shapeinner_shape
batch_sizeflat_values_shapeparams_grads               r"   _BatchGatherGradrb  p  s   
 &&y~~g'>B,??6*L{
+Kz{+AB/K"";U;J!((2$)<a@z!O|WjAG'/1BDF g|4'--fgO+##Y%%{4E&FJLK 
r$   GatherV2c                    | j                   d   }t        j                  |      5  t        j                  |      }ddd       | j                   d   }t        j
                  t        j                  |      d      }| j                   d   }t        j                  |      }t        | j                  d            }|dk  r@|j                  j                  t        d| d|       ||j                  j                  z  }|dk(  rt        j                         rAt        j                  |j                        5  t        j                         dd }	ddd       ndd }	t        j"                  |	gd      }
t        j$                  t'        |      |
      }t        j$                  ||      }t)        j*                  ||      }nAd| }||d dd }t        j"                  |dg|gd      }
t        j                  |
      }t        j                  |      }t-        j.                  |      }t-        j.                  ||      }t-        j.                  |dz   |      }t        j$                  t'        |      |
      }t        j"                  ||g||gd      }t        j0                  ||      }t        j2                  ||      }t5        ||||||         }t        j"                  ||dz   |g|gd      }t        j0                  ||      }t7        |t(        j*                        s)t        j$                  |t        j                  |            }|ddgS # 1 sw Y   xY w# 1 sw Y   xY w)	zGradient for GatherV2 op.r   Nr0   rI   rN  zCurrently, it is unsupported to take the gradient of tf.gather when batch_dims < 0 and the rank of the indices is unknown. Please pass a positive batch_dims or use tf.ensure_shape to update the shape of indices when calling tf.gather. Got batch_dims=z and indices=rL   )rD   r
   r   r   r1   r4   rq   r   rV   intr   ndimsr_   r   r>   deviceidentityr2   r   rB  r]   r^   r   rL  	transposerc   rb  r@   )r   r!   rE  rF  ra   r\  r   axis_staticrN  params_tail_shaperG  r`   ra  r]  r^  values_dims	axis_dimsouter_batches_indicesbatch_axis_indicesinner_axes_indicestranspose_dimsvalues_transposeparams_shape_transposeinvert_transpose_dimss                           r"   _GatherV2Gradru    sP    99Q<&
  +??6*L+ IIaL'&&y~~g'>B,	1$**40+2;;|,-*!^}}" #|=		;< < '--%%%J A  "::l))* A%..|<QR@A A 'qr*##\3D$EqIL'-|=F6G$22673?AK
 u%Ktu%ab)K##[2$$DaHL...K{+I$NN:6!
I>!	A{C'-|=F %%	{,>' 	
N !**6>B&--lNK"#9;K#*JT8JLK
 &,,1A5
|. 	
 %%k3HIK	K!3!A!A	B##K
 tT	""W+ +,A As   M6MMM#GatherNdc                    | j                   d   }| j                   d   }t        j                  ||j                        }|j                  j                  dk(  rV|j                  j
                  d   j                  dk(  r0t        j                  |t        j                  |d      |      }|d gS t        j                  |||| j                  d            }|d gS )	Nr   r0   r   rI   rL   r'   bad_indices_policy)rx  )rD   r   r1   r/   rf  dimsrJ   r]   r^   rY   
scatter_ndr   r   r!   refra   	ref_shaperef_grads         r"   _GatherNdGradr    s    
		!#IIaL'oocGMM:)]]A'--"4"4R"8">">!"C!//ib19>H D	 ##y;;';<>H D	r$   ResourceGatherNdc                    | j                   d   }| j                   d   }t        j                  ||j                        }|j                  j
                  dk(  rV|j                  j                  d   j                  dk(  r0t        j                  |t        j                  |d      |      }|d gS t        j                  |||      }|d gS )Nr   r0   rI   rL   r'   )rD   r   variable_shaper/   r1   rf  ry  rJ   r]   r^   r   rY   rz  r{  s         r"   _ResourceGatherNdGradr    s    
		!#IIaL''66sGMMJ)]]A'--"4"4R"8">">!"C!//ib19>H D	 ##GT9=H
D	r$   CheckNumericsc                 R    t        j                  |d| j                  d      z        S zGradient for check_numerics op.zDNot a number (NaN) or infinity (Inf) values detected in gradient. %sr;  )r   check_numericsr   r    s     r"   _CheckNumericsGradr    s.     
	!	!
Lkk)
 r$   CheckNumericsV2c                 R    t        j                  |d| j                  d      z        S r  )r   check_numerics_v2r   r    s     r"   _CheckNumericsV2Gradr    s.     
	$	$
Lkk)
 r$   PlaceholderWithDefaultIdentityc                     |S r   r   r   s     r"   _IdGradr    s	     
+r$   _EagerConstc                     t        d      )NzDThis op should never interact with gradient APIs. Please file a bug.)AssertionErrorr   s     r"   _EagerConstGradr    s    L	N Nr$   RefIdentityc                     |S r   r   r   s     r"   
_RefIdGradr         	+r$   	IdentityNc                     |S r   r   r   s     r"   _IdNGradr  %  r  r$   StopGradientReshapec                    | j                   d   j                  }|j                  |j                         s||j	                         }g }d}t        |      D ]!  \  }}||j                  |       |dk(  s d}# t        |      dk(  r+|s)d||d   <   t        j                  t        |      |      dgS t        j                  t        |      t        j                  | j                   d               dgS )z/Defines the gradient for `array_ops.reshape()`.r   NFTr0   rL   )rD   r1   rX   r   r   	enumeraterC   rM   r   r   rB  )r   r!   rG   input_shape_as_listundefined_dimshas_zero_dimirS  s           r"   _ReshapeGradr  -  s    		!""+!+*F*F*H &--/NL/0 3	a !8  >a/1.+, ? E 356:< < 
)$
/11NP

 r$   InvertPermutationc                     t        j                  t        |      t        j                  | j                  d               S )z9Reshapes the gradient to the shape of the original input.r   )r   r   rB  r1   rD   r    s     r"   _ReshapeToInputr  N  s2    			%d+Y__RYYq\-J
L Lr$   
ExpandDimsc                     t        | |      d gS r   r  r    s     r"   _ExpandDimsGradr  T  s    
"d
#T	**r$   Squeezec                     t        | |      S r   r  r    s     r"   _SqueezeGradr  Y  s    	T	""r$   	Transposec                 v    | j                   d   }t        j                  |t        j                  |            dgS )zReturns unshuffle(grad).r0   NrD   r   ri  invert_permutationr   r!   ps      r"   _TransposeGradr  ^  s4     	iil!


dI$@$@$C
Dd	KKr$   ConjugateTransposec                 z    | j                   d   }t        j                  |t        j                  |      d      dgS )zReturns conj(unshuffle(grad)).r0   T)	conjugateNr  r  s      r"   _ConjugateTransposeGradr  e  s?     	iil!
	,,Q/4ABF
 r$   ShapeShapeNRankSizeTilec                    t        j                  | j                  d   | j                  d   j                        }t        j                  t        j
                  t        j                  | j                  d   |g            dg      }t        j                  dt        j                  |      d      }t        |t        j                        rt        j                  |d   |j                  j                        }t        j                   |j"                  t        j$                  |j                  |      |      }t        j&                  dg|dd gd      }t        j(                  t        j                  ||      |      }t+        j,                         s,|j/                  | j                  d   j1                                |dgS )z,Sum reduces grad along the tiled dimensions.r   r0   r   rL   rI   Nr'   )r   r1   rD   r/   r   ri  r   r(   r   rL  rq   r@   r]   r^   rd   ra   rA  r`   modr2   r   r   r>   	set_shaper   )r   r!   rG   split_shapeaxesinput_shape_0
input_grads          r"   	_TileGradr  x  sR    		!ryy|7I7IJ+ !!///1{0KLM	d+ 
9>>+6	:$(667MM+a.$,,2D2DEM((X\\$,,>OD""QCQR#9BK""9#4#4T;#GN*		"	"	$1//12
d	r$   BroadcastGradientArgsc           	         | j                   d   }| j                   d   }t        j                  |ddgt        j                  t        j
                  |      dg            }t        j                  |dg      }t        j                  ||j                        }t        j                  |||      }t        | j                         dk(  r|ddfS |dfS )zGradient for Pad.r   r0   rL   r   r   N)
rD   r   rZ   r   r(   rX   r   r1   r/   rM   )r   r!   rF   a
pad_beforer:   r6   x_grads           r"   _PadGradr    s     	iil!iil!q1a&.44innQ6G5KLN* 

J
-%
//!ekk
2%??4.&^q44<r$   PadPadV2ReverseSequencec                     | j                   d   }t        j                  || j                  d      | j                  d      |      d gS )Nr0   	batch_dimseq_dim)
batch_axisseq_axisseq_lengths)rD   r   reverse_sequencer   )r   r!   r  s      r"   _ReverseSequenceGradr    sJ    		!+  
[[-;;y)!	# %)
 r$   Reversec                 P    | j                   d   }t        j                  ||      d fS r  )rD   r   reverse)r   r!   reverse_dimss      r"   _ReverseGradr    s'    1,			t\	2D	88r$   	ReverseV2c                 P    | j                   d   }t        j                  ||      d fS r  )rD   r   
reverse_v2)r   r!   r   s      r"   _ReverseV2Gradr    s'    	1$			dD	)4	//r$   SpaceToBatchc                 r    | j                  d      }t        j                  || j                  d   |      d gS N
block_sizer0   )r  )r   r   batch_to_spacerD   r   r!   r  s      r"   _SpaceToBatchGradr    8     {{<(*tRYYq\jI4
 r$   SpaceToBatchNDc                 j    t        j                  || j                  d   | j                  d         d d gS r.  )r   batch_to_space_ndrD   r    s     r"   _SpaceToBatchNDGradr    4     !!$		!biilCT4
 r$   BatchToSpacec                 r    | j                  d      }t        j                  || j                  d   |      d gS r  )r   r   space_to_batchrD   r  s      r"   _BatchToSpaceGradr    r  r$   BatchToSpaceNDc                 j    t        j                  || j                  d   | j                  d         d d gS r.  )r   space_to_batch_ndrD   r    s     r"   _BatchToSpaceNDGradr    r  r$   SpaceToDepthc                     | j                  d      }| j                  d      }|dk(  rt        d      t        j                  |||      S )Nr  data_formatNCHW_VECT_Cz\Cannot compute SpaceToDepth gradient with NCHW_VECT_C. NCHW_VECT_C requires qint8 data type.r  )r   r_   r   depth_to_spacer   r!   r  r  s       r"   _SpaceToDepthGradr    O     {{<(*M*+M!
 = > >		!	!$
	LLr$   DepthToSpacec                     | j                  d      }| j                  d      }|dk(  rt        d      t        j                  |||      S )Nr  r  r  z\Cannot compute DepthToSpace gradient with NCHW_VECT_C. NCHW_VECT_C requires qint8 data type.r  )r   r_   r   space_to_depthr  s       r"   _DepthToSpaceGradr    r  r$   OneHot	MirrorPadc                 r    | j                  d      }t        j                  || j                  d   |      d gS Nmoder0   )r  )r   r   mirror_pad_gradrD   r   r!   r  s      r"   _MirrorPadGradr
    s2    	V	$

'
'biil
F	MMr$   MirrorPadGradc                 r    | j                  d      }t        j                  || j                  d   |      d gS r  )r   r   
mirror_padrD   r	  s      r"   _MirrorPadGradGradr  	  s2    	V	$

"
"41D
A4	HHr$   FakeQuantWithMinMaxArgsGradientFakeQuantWithMinMaxVarsGradient)FakeQuantWithMinMaxVarsPerChannelGradientQuantizeAndDequantizec                     |S r   r   r   s     r"   _QuantizeAndDequantizeGradr    r  r$   QuantizeAndDequantizeV2c                     |d d gS r   r   r   s     r"   _QuantizeAndDequantizeV2Gradr    s    
d	r$   QuantizeAndDequantizeV3c                     |d d d gS r   r   r   s     r"   _QuantizeAndDequantizeV3Gradr    s     dD	!!r$   ExtractImagePatchesc                 d   t        j                  | j                  d   t        j                        }t        j                  |      \  }}}}t        j                  | j                  d   t        j                        }t        j                  |dd       \  }}	| j                  d      \  }
}}}
||z  }t        j                  t        j                  d|dz   t        j                  j                        d||df      }t        j                  || j                  d      | j                  d      | j                  d      | j                  d	            }t        j                   |t        j                        }t        j"                  t        j                  t%        |      |||	|||f      d
      }t        j                  |d||z  f      }t        j                  |dg      dz
  }t        j&                  |||      }t        j                  |||||f      }t        j"                  |d      }|gS )Nr   r   r0   r   ksizesr.   r   ratespadding)r0   rI   r   r   r      rL   )num_segments)rI   r   r0   r   )r   r1   rD   r   int64r   r   r   r   r   r   rL  r
   float32r   extract_image_patchesrd   ri  rB  rA  )r   r!   
input_bhwcr_  rows_incols_inchannelsoutput_bhwcrows_outcols_outr   ksize_rksize_cinput_indices_num	input_idxinput_idx_patchedgrad_expanded	grad_flatsegment_idsgrad_outs                       r"   _ExtractImagePatchesGradr5  $  s   ryy|fllC*+:+B+B:+N(*gw

1E+&..{1Q/?@(H;;x0!Wgq
 ' nnQ)A-SZZ5G5GH'7A) $99X&I(>kk'BKK	24 mm$5v||D%%
)$
/x7GX
FH 	-
 J4I/JK) !!"3bT:Q>+**+<( ':x8(   <8(
r$   ExtractVolumePatchesc                 4   | j                   d   j                  j                  D cg c]  }|j                   c}\  }}}}}t	        j                  | j                   d         }|d   }|d   }d||z  |z  z   }	t	        j
                  t        j                  d|	t        j                  j                        d|||df      }
t        j                  |
| j                  d      | j                  d      | j                  d            }| j                  d   j                  j                  D cg c]  }|j                   c}\  }}}}}| j                  d      \  }}}}}||z  |z  }||z  |z  |z  }t	        j
                  t        j                  |t        j                  j                        d|||||z  |z  f      }t	        j                  t	        j                   |d	      t	        j                   |d	      gd	      }t	        j
                  |d
      }|	|f}t#        j$                  |t	        j&                  |g|j(                        |      }t+        j,                  |d|	dz
  |f      }t	        j.                  t	        j
                  t1        |      ||||||||f      d      }t	        j
                  |d||z  f      }t+        j2                  ||      }t	        j
                  ||||||f      }t	        j.                  |d      }|gS c c}w c c}w )Nr   r   r0   r.   r  r   r  rL   r'   )rL   rI   )r0   r   )r0   rI   r   r   r      r      )r   r   r0   rI   r   )rD   r1   ry  rJ   r   r   r   rL  r
   r   r"  r   extract_volume_patchesr   r   r2   r4   r   SparseTensorrK  r/   r   sparse_sliceri  rB  sparse_tensor_dense_matmul)r   r!   rS  r_  	planes_inr&  r'  r(  input_bphwcr.  r/  r0  r   
planes_outr*  r+  ksize_pr,  r-  prc_indices_numoutput_indices_num
output_idx
idx_matrixidx_mapsp_shapesp_mat_fullsp_matr1  r2  jacr4  s                                  r"   _ExtractVolumePatchesGradrK  S  s    99Q<--227cii73*i'8 		!-+1~*^(
 )g-77nnQ)1A1AB)Wgq)+) $::X&I(>kk) ::a=..33*cii*&!Z8Q %'KK$9!!Wgw)H4/&07:WD  nn'szz/?/?@*h'G*;g*EFH*
 -B7JR0! &(	)*
 j'2'!34(**y~~12$**ExQ+ "";$5$9;M#NP& %%
)$
/z8XwH !9	:-
 J4I/JK)--fi@#	IwX>@(  ?;(
u7&*s   L,L	ScatterNdc                 V    | j                   d   }t        j                  ||      }d |d gS r   rD   r   	gather_ndr   r!   ra   updates_grads       r"   _ScatterNdGradrR    s.    IIaL'$$T73,
d	##r$   TensorScatterUpdatec                    | j                   d   }t        j                  ||      }t        j                  t        j                  |      |t        j
                  | j                   d   |j                              }|d |gS )Nr0   rI   r.   )rD   r   rO  tensor_scatter_updaterh  r   r/   r   r!   ra   rQ  tensor_grads        r"   _TensorScatterUpdateGradrX    sl    IIaL'$$T73,//299Q<tzz:<+ t\	**r$   TensorScatterAddc                     | j                   d   }t        j                  ||      }t        j                  |      }|d |gS r  rD   r   rO  rh  rV  s        r"   _TensorScatterAddGradr\    s>    IIaL'$$T73,""4(+
t\	**r$   c                 >   | j                   d   }| j                   d   }| j                   d   }| j                  d   }t        j                  t        j                  ||      |j
                        }t        j                  ||      }t        j                  t        j                  ||      |j
                        }t        j                  ||t        j                  ||j
                              }	||	z   }
||z  |
z  }t        j                  ||
z  |      |z  }|d|gS )z3Gradient for TensorScatterMin and TensorScatterMax.r0   r   rI   r   N)
rD   r   r   rd   r  r/   r   rO  rz  r1   )r   r!   ra   rF   youtputx_indicatorsy_outputy_indicatorsys_indicators
indicatorsr  y_grads                r"   _TensorScatterMinOrMaxGradrf    s    IIaL'iil!iil!::a=&x~~a8$**E,  1(x~~a:DJJG,&&|Y__QGI-m+* ,+&tj0':\I&
$	r$   TensorScatterMaxc                     t        | |      S )z!Gradient for TensorScatterMax op.rf  r    s     r"   _TensorScatterMaxGradrj         
$B	--r$   TensorScatterMinc                     t        | |      S )z!Gradient for TensorScatterMin op.ri  r    s     r"   _TensorScatterMinGradrn    rk  r$   TensorScatterSubc                     | j                   d   }t        j                  ||      }t        j                  |      }|d | gS r  r[  rV  s        r"   _TensorScatterSubGradrq    s@    IIaL'$$T73,""4(+
tl]	++r$   ScatterNdNonAliasingAddc                 V    | j                   d   }t        j                  ||      }|d |gS r  rN  rP  s       r"   _ScatterNdNonAliasingAddGradrt    s.    IIaL'$$T73,
l	##r$   BroadcastToc                 \   | j                   d   }| j                   d   }t        j                  }t        |t        j
                        r|j                  }t        j                  ||      }t        |t        j                        s]t        j                  t        j                  |            }|j                         r%t!        j"                  |j%                         |      }t'        j(                  ||      \  }}t+        j,                  ||d      }	t        j.                  |	|      }
|
d gS )Nr   r0   r   r.   Tr   )rD   r   r5   r@   r   rA   r/   r   r1   r
   rN   r   TensorShaper   try_evaluate_constantr   r   rW   r   r   r   r   r   r   )r   r!   input_valuebroadcast_shapeshape_dtypeinput_value_shapebroadcast_shape_staticr   r   updates_grad_reshapedrQ  s              r"   _BroadcastToGradr    s    		!+IIaL/+/!''KookKH	OS__	5)55))/:<..0#,,
 
(
(
*+?o#;;(*!^"--
$0""#8:KL,
	r$   N)e__doc__tensorflow.compiler.tf2xla.opsr   tensorflow.pythonr   tensorflow.python.eagerr   tensorflow.python.frameworkr   r   r	   r]   r
   r   r   r   r   tensorflow.python.opsr   r   r   r   r   r   r   r   r   RegisterGradient	Operationr#   r+   ry   r}   r   NotDifferentiabler   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r"  r+  r2  r6  r=  rB  rH  rX  rb  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r5  rK  rR  rX  r\  rf  rj  rn  rq  rt  r  r   r$   r"   <module>r     s   7 6 ( + 3 . L + 5 . 4 3 + 1 & 3 / . ; * , f<#-- < < h@CMM @  @
eeP hCMM    j!Gcmm G "G
   n % g33== 3 3: n%J#-- J &JD ()8cmm 8 *8$ 01"cmm " 2"D g;3== ; ; hCMM      g  f# # j! " l#* $* n%4#-- 4 &4
 n%P#-- P &P
 &'OCMM O (O ()Ncmm N *N ()!cmm ! *!" o&!3== ! '!, '( 'S]]  ' ) 'F '($'S]] $' )$'N &'NCMM N (N   n % f) )   k "   j ! '(,S]] , ),
F hQCMM Q  Q",< j!T#cmm T# "T#n j!cmm  " ()	cmm 	 *	 o&3==  ' '(S]]  ) ./j! " 0 m$N %N
 m$ % k" #   n % i S]]  !:   ) *L L l#+ + $+ i #S]] # !# k"Ls}} L #L *+  ,   g    h    f    f  f#--  8   - . &    U H %    W h ' '(S]]  ) i 9S]] 9 !9
 k"0s}} 0 #0
 n%#--  & &'CMM  ( n%#--  & &'CMM  ( n%M#-- M &M n%M#-- M &M   h  k"Ns}} N #N
 o&I3== I 'I
   7 8   7 8   A B -. / /0 1 /0" 1"
 +,+ + -+\ ,-;#-- ; .;| k"$s}} $ #$ +,+ + -+ ()+cmm + *+ 3==  & ().cmm . *.
 ().cmm . *.
 (),cmm , *, /0$S]] $ 1$ m$  %r$   