o
    2hV                     @   s>  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ddejfddZeddejfddZdejfddZeddejfd d!Z ed"dejfd#d$Z!e"d% ed&dejfd'd(Z#ed)dejfd*d+Z$ed,dejfd-d.Z%ed/dejfd0d1Z&ed2dejfd3d4Z'ed5dejfd6d7Z(e"d8 ed9d:d; Z)ed<d=d> Z*ed?d@dA Z+edBdejfdCdDZ,edEdejfdFdGZ-edHdejfdIdJZ.edKdejfdLdMZ/edNdejfdOdPZ0edQdejfdRdSZ1edTdejfdUdVZ2edWdejfdXdYZ3edZdejfd[d\Z4e"d] ed^d_d` Z5e"da e"db edcdejfdddeZ6dfdg Z7edhdejfdidjZ8dkdl Z9dmdn Z:edodejfdpdqZ;edrdejfdsdtZ<edudejfdvdwZ=edxdejfdydzZ>ed{dejfd|d}Z?ed~eddd Z@eddd ZAeddd ZBeddd ZCe"d eddejfddZDe"d dejfddZEeddejfddZFeddejfddZGeddejfddZHeddejfddZIe"d e"d e"d e"d eddejfddZJe"d dejfddZKedeK edeK eddejfddZLeddejfddZMeddejfddZNeddejfddZOeddejfddZPeddejfddZQeddejfddZReddejfddZSed¡dejfddĄZTe"dš edơdejfddȄZUedɡdejfdd˄ZVe"d̡ e"d͡ e"dΡ edϡddф ZWedҡddԄ ZXedաddׄ ZYedءdejfddڄZZedۡdejfdd݄Z[edޡdejfddZ\eddejfddZ]eddejfddZ^dejfddZ_eddejfddZ`eddejfddZaeddejfddZbeddejfddZceddejfddZddS )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                 C   s   t j|| d| ddS )zGradient for pack op.Naxis)numr   )r   unstackget_attrr   grad r    [/var/www/html/chatgem/venv/lib/python3.10/site-packages/tensorflow/python/ops/array_grad.py	_PackGrad'   s   r"   Unpackc                 G   s   t j|| ddS )zGradient for unpack op.r   r   )r   stackr   r   gradsr    r    r!   _UnpackGrad.   s   r(   c                 C   s^  dd }dd }t | jdkr||kr|dg S dg| S | j| }| j|| }g }	t|tjrt s;t|tjrW|	 
d|d   }
t||
}t|||
}	nIt|ryt|j}t|j}||kryt|}tj||jd}|t|d  }
||}t |d	krtttj|d
d|
dgd
dg}t|||
}	nt|
|}t ||D ]\}}|	!t||| qnt|t"j#r|t|d  }
t|}|du rt$d|dk rtt|d }|du rt$d||; }dd |D }|dkr<|||
\}}|D ],}t|j%|t&dgt|d
gdggd}|	!t"#||j'| t()||| }qndtjd|j'jd}|D ]O}t*||
}|j|j'jkr`t(j+||j'jd}|| }tjt,t(-|j'|k|j'|k d
gd}t*|j'|| }t*|j%|}|	!t"#||| |}qGnt.dt/| ||kr|	dg S dg|	 S )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                 S   sb   t | d }t t jt |dtjddgt j|| d tjdgd}t j|tjd}||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beginr    r    r!   _CreateDenseMaskAndBeginI   s   z3_ConcatGradHelper.<locals>._CreateDenseMaskAndBeginc                 S   sj   t  r	t| S g }d}| D ]}t|}t|tjr"|jj	dkr&d} n|
| q|r0|S t| S )z-Extract the shapes of a set of input tensors.TConstF)r   executing_eagerlyr   shape_nr,   
isinstancer   Tensorr   typeappend)inputsr1   fully_knownxinput_shaper    r    r!   _ExtractInputShapesX   s    


z._ConcatGradHelper.<locals>._ExtractInputShapes   Nr   )valuer*      r+   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.c                 S   s   g | ]}t |qS r    )r   r,   ).0r@   r    r    r!   
<listcomp>   s    z%_ConcatGradHelper.<locals>.<listcomp>r)   z(Expected Tensor or IndexedSlices, got %s)0lenr>   r:   r   r;   r   r8   r	   EagerTensor_numpyitem_rankr   TFE_Py_TensorShapeSlicer   splitr   is_constantr   GetOutputContextr   r   constant_valueconstantr*   ranksqueezeslicer   r%   r   concat_offsetzipr=   indexed_slices_libIndexedSlices
ValueErrorvaluesr-   indicesr   addgathercastwherelogical_and	TypeErrorr<   )r   r   start_value_indexend_value_index	dim_indexr6   rB   r2   input_values	out_gradsnon_neg_concat_dimr1   grad_contextdim_contextrD   offsetr5   sizeconcat_dim_staticrT   r4   
new_valuesstartsize_concat_dimendindices_to_selectnew_indicesr    r    r!   _ConcatGradHelper4   s   




ru   Concatc                 C   s   t | |dt| jddS )Nr+   r   rd   re   rf   )ru   rI   r>   r   r    r    r!   _ConcatGrad   s   rx   ConcatV2c                 C   s   t | |ddddS )Nr   rF   rw   )ru   r   r    r    r!   _ConcatGradV2   s   
rz   ConcatOffsetSlicec                 C   s   | j d }| j d }t|}|j}tj| jd |d}tt	 r0t
t|||ddfS t|dg}t||}ttj||d| | |}	t||	gd}
t||
ddfS )zGradient for Slice op.r   r+   out_typeN)r>   r   rT   r*   r,   outputsr   GraphOrParentsInXlaContextr	   get_default_graphr   xla_dynamic_update_slice
zeros_liker   r%   reshaper-   pad)r   r   	input_vec	begin_vec
input_rankindex_dtype
slice_sizer,   
before_pad	after_padpaddingsr    r    r!   
_SliceGrad   s&   


r   StridedSlicec           
      C   s   | j d }| j d }| j d }tj| j d |jd}t|}|dur%|n|}t|}|dur2|n|}t|}|dur?|n|}t|}	|	durL|	n|}tj|||||| d| d| d	| d
| dd
dddfS )zGradient for StridedSlice op.r+   rC      r   r}   N
begin_maskend_maskellipsis_masknew_axis_maskshrink_axis_maskr   r   r   r   r   )r>   r   r,   r*   r   rR   strided_slice_gradr   )
r   r   r5   rr   stridesr@   x_staticbegin_static
end_staticstrides_staticr    r    r!   _StridedSliceGrad  s4   







r   StridedSliceGradc                 C   sb   | j d }| j d }| j d }ddddtj||||| d| d| d| d| d	d
	fS )z!Gradient for StridedSliceGrad op.r+   rC   r   Nr   r   r   r   r   r   )r>   r   strided_slicer   )r   r   r5   rr   r   r    r    r!   _StridedSliceGradGrad0  s   


r   TensorStridedSliceUpdatec              	      s   | j d }| j d }| j d }| d | d| d| d| d fd	d
}|tj||||}|tj||||t|}tj||jd}tj| j d |jd}	t	||	\}
}t
j||dd}t||	}|d d d |fS )Nr+   rC   r   r   r   r   r   r   c                    s   | | dS )N)r   r   r   r   r   r    )fargsr   r   r   r   r   r    r!   ApplyM  s   z,_TensorStridedSliceUpdateGrad.<locals>.Applyr}      Tr   keepdims)r>   r   r   r   tensor_strided_slice_updater   r,   r*   r   broadcast_gradient_argsr   
reduce_sumr   )r   r   r5   rr   r   r   dydxslice_shapevalue_shape_reduction_axesdy_reshapedr    r   r!   _TensorStridedSliceUpdateGradC  s.   







r   Splitc                 G   s   d t t|| jd fS Nr   )r   r-   listr>   r&   r    r    r!   
_SplitGradf  s   r   SplitVc                 G   s4   t t|| jd }|gd gt| jd   }|S )NrC   r+   )r   r-   r   r>   rI   )r   r'   	returnvalr    r    r!   _SplitVGradk  s   r   r7   Diagc                 C   
   t |S N)r   	diag_partr   r   r    r    r!   	_DiagGradx     
r   DiagPartc                 C   r   r   )r   diagr   r    r    r!   _DiagPartGrad}  r   r   
MatrixDiagc                 C   r   r   )r   matrix_diag_partr   r    r    r!   _MatrixDiagGrad  r   r   MatrixDiagV2c                 C   s   t j|| jd dd d d d fS )Nr+   k)r   r   r>   r   r    r    r!   _MatrixDiagV2Grad  s
   
r   MatrixDiagV3c                 C   s&   t j|| jd | ddd d d d fS )Nr+   alignr   r   )r   r   r>   r   r   r    r    r!   _MatrixDiagV3Grad  s
   r   MatrixDiagPartc                 C   sP   | j d  dd  }| r|d |d krt|S tt| j d |S )Nr   r+   r>   	get_shapeis_fully_definedr   matrix_diagmatrix_set_diagr   r   r   matrix_shaper    r    r!   _MatrixDiagPartGrad  s   
r   MatrixDiagPartV2c                 C   sl   | j d  dd }| r"tj|| j d |d |d dddfS tjt| j d || j d dddfS )zGradient for MatrixDiagPartV2.r   r   Nr+   )r   num_rowsnum_colsr   r   r   r    r    r!   _MatrixDiagPartV2Grad  s   r   MatrixDiagPartV3c                 C   sz   | j d  dd }| d}| r(tj|| j d |d |d |dddfS tjt| j d || j d |dddfS )zGradient for MatrixDiagPartV3.r   r   Nr   r+   )r   r   r   r   r   )r>   r   r   r   r   r   r   r   )r   r   r   r   r    r    r!   _MatrixDiagPartV3Grad  s$   
r   MatrixSetDiagc                 C   s$  | j d  | }| j d  }|dd |dd }|dd }| r:| r:| t| g }nCt|6 t	|}t
|}t|dg|d g}t||d gdg}t|}t||ggd}W d   n1 sxw   Y  t|tj||jd}	t|}
|	|
fS )zGradient for MatrixSetDiag.r   r+   Nr   rF   rC   r)   )r>   r   
merge_withr   as_listminr	   colocate_withr   r,   rT   rV   r   
reduce_minr-   r   r.   r*   r   )r   r   rA   
diag_shapebatch_shaper   
grad_shape	grad_rankmin_dim
grad_input	grad_diagr    r    r!   _MatrixSetDiagGrad  s&   



r   MatrixSetDiagV2c                    s6  | j d  }| s{t|}|dd }|dd }t| j d dg}|d  |d ttdfddd	d }tt	 d fd
ddd }t
|d | |d | tt fdd fdd}	t||	gd}tj|tj||jd| j d d}
tj|| j d d}|
|dfS )zGradient for MatrixSetDiagV2.r+   Nr   rC   rF   r   c                          S r   r    r    d_upperr    r!   <lambda>      z&_MatrixSetDiagGradV2.<locals>.<lambda>c                   S      dS r   r    r    r    r    r!   r     r   c                           S r   r    r    d_lowerr    r!   r         c                   S   r   r   r    r    r    r    r!   r     r   c                         t  gS r   r	   convert_to_tensorr    max_diag_lenr    r!   r         c                         t   d gS Nr+   r   r    r   r   r   r    r!   r         r)   r   )r>   r   r   r   r,   r   r   r   lessgreaterminimumequalr-   r   r.   r*   r   )r   r   r   r   r   r   
diag_indexy_offsetx_offsetpostfixr   r   r    r  r!   _MatrixSetDiagGradV2  s8   




r  MatrixSetDiagV3c                    sD  | j d  }| d}| st|}|dd }|dd }t| j d dg}|d  |d tt	dfdd	d
d	 }tt
 d fdd	dd	 }	t|d | |d |	 tt fdd	 fdd	}
t||
gd}tj|tj||jd| j d |d}tj|| j d |d}||dfS )zGradient for MatrixSetDiagV3.r+   r   Nr   rC   rF   r   c                      r   r   r    r    r   r    r!   r     r   z&_MatrixSetDiagGradV3.<locals>.<lambda>c                   S   r   r   r    r    r    r    r!   r     r   c                      r   r   r    r    r   r    r!   r     r   c                   S   r   r   r    r    r    r    r!   r     r   c                      r   r   r   r    r   r    r!   r     r   c                      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   r   r   r   r   r   r   r  r  r	  r
  r   r   r    r  r!   _MatrixSetDiagGradV3  s@   





r  MatrixBandPartc                 C   s(   | j d }| j d }t|||d d fS Nr+   rC   )r>   r   matrix_band_part)r   r   	num_lower	num_upperr    r    r!   _MatrixBandPartGrad   s   

r  EditDistanceFillc                 C   s   d t |fS r   )r   r   r   r    r    r!   	_FillGrad+     r  	ZerosLikeOnesLikePreventGradientc                 C   s   t d| d )Nz(Gradient explicitly disabled. Reason: %smessage)LookupErrorr   )r   r   r    r    r!   _PreventGradientGrad4  s   r  c                 C   sB   t | tjs| S | jdu rtdt|  t| j| j	| jd S )zEConverts an IndexedSlices to a Tensor without sparse->dense warnings.NzETensor conversion requested for IndexedSlices without dense_shape: %sr   )
r:   rY   rZ   dense_shaper[   strr   unsorted_segment_sumr\   r]   r   r    r    r!   _IndexedSlicesToTensorNoWarning:  s   
r!  Gatherc                 C   s   | j d }t| t|}W d   n1 sw   Y  | j d }tt|d}t||dd gd}tt	||}t||}t
|||dgS )zGradient for Gather op.r   Nr+   )r>   r	   r   r   r,   r/   rm   r-   r   r!  rY   rZ   )r   r   paramsparams_shaper]   rm   values_shaper\   r    r    r!   _GatherGradH  s   

r&  c              
   C   s   |}|j j}t| |}tjd|d}t|ddD ]M}||d  }||| 9 }tjd|d}	tjd|d}
t|	||
}||9 }tjt	dg|d g|gt	dgt
|| ggdd}|t||7 }q|S )zEAddds the batch offsets to the given indices and returns the results.r    r)   r   rF   r+   r$   )r*   
base_dtyper   r`   r   onesranger.   r-   tilerT   r   )r$  r]   
batch_dimsbatch_indicesindices_dtypecasted_params_shapeaccum_dim_valuedim	dim_valuerp   stepdim_indices	dim_shaper    r    r!   _GetBatchIndicesZ  s&   r5  c                 C   s   t t |d}|rCt |}|d| }||d dd }t|dgd}	t dg|gd}
||	9 }t| ||}t t	||
}t ||}t
|||}|r^t |t ||
gd}|S )z7Returns the gradient of GatherV2 with batch dimensions.r   Nr+   FrF   )r   r/   rm   r,   r   prodr-   r5  r   r!  r   r   )r$  r\   r]   r+  gather_dim_sizeindices_sizer%  outer_shapeinner_shape
batch_sizeflat_values_shapeparams_gradr    r    r!   _BatchGatherGradp  s&   
r>  GatherV2c                 C   sX  | j d }t| t|}W d   n1 sw   Y  | j d }tt|d}| j d }t|}t	| 
d}|dk rX|jjdu rRtd| d| ||jj7 }|dkrt rt|j t|dd }	W d   n1 szw   Y  n|dd }	t||	gd}
tt||
}t||}t|||}ns|d| }||d dd }t|dg|gd}
t|
}t|}t|}t||}t|d |}tt||
}t||g||gd}t||}t||}t|||||| }t||d |g|gd}t||}t|tjs't|t|}|ddgS )	zGradient for GatherV2 op.r   Nr+   rC   r+  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=rF   )r>   r	   r   r   r,   r/   rm   r   rR   intr   ndimsr[   r   r8   deviceidentityr-   r   r!  rY   rZ   r   r)  	transposer_   r>  r:   )r   r   r#  r$  r]   r8  r   axis_staticr+  params_tail_shaper%  r\   r=  r9  r:  values_dims	axis_dimsouter_batches_indicesbatch_axis_indicesinner_axes_indicestranspose_dimsvalues_transposeparams_shape_transposeinvert_transpose_dimsr    r    r!   _GatherV2Grad  s   
	







rP  GatherNdc                 C   s   | j d }| j d }tj||jd}|jjdkr1|jjd jdkr1t|tj	|dd|}|d gS tj
|||| dd}|d gS )	Nr   r+   r}   rC   rF   r$   bad_indices_policy)rR  )r>   r   r,   r*   rA  dimsrD   rY   rZ   rU   
scatter_ndr   r   r   refr]   	ref_shaperef_gradr    r    r!   _GatherNdGrad  s   

rY  ResourceGatherNdc                 C   sv   | j d }| j d }t||j}|jjdkr0|jjd jdkr0t	|t
j|dd|}|d gS t
|||}|d gS )Nr   r+   rC   rF   r$   )r>   r   variable_shaper*   r,   rA  rS  rD   rY   rZ   r   rU   rT  rU  r    r    r!   _ResourceGatherNdGrad  s   

r\  CheckNumericsc                 C      t |d| d S zGradient for check_numerics op.zDNot a number (NaN) or infinity (Inf) values detected in gradient. %sr  )r   check_numericsr   r   r    r    r!   _CheckNumericsGrad     ra  CheckNumericsV2c                 C   r^  r_  )r   check_numerics_v2r   r   r    r    r!   _CheckNumericsV2Grad  rb  re  PlaceholderWithDefaultIdentityc                 C      |S r   r    r   r    r    r!   _IdGrad  s   ri  _EagerConstc                 C   s   t d)NzDThis op should never interact with gradient APIs. Please file a bug.)AssertionErrorr   r    r    r!   _EagerConstGrad  s   rl  RefIdentityc                 C   rh  r   r    r   r    r    r!   
_RefIdGrad      rn  	IdentityNc                 G   rh  r   r    r   r    r    r!   _IdNGrad%  ro  rq  StopGradientReshapec                 C   s   | j d j}|jdurH| sH| }g }d}t|D ]\}}|du r)|| q|dkr/d}qt|dkrH|sHd||d < t	t
||dgS t	t
|t| j d dgS )z/Defines the gradient for `array_ops.reshape()`.r   NFTr+   rF   )r>   r,   rT   r   r   	enumerater=   rI   r   r   r!  )r   r   rA   input_shape_as_listundefined_dimshas_zero_dimir0  r    r    r!   _ReshapeGrad-  s.   
ry  InvertPermutationc                 C   s   t t|t | jd S )z9Reshapes the gradient to the shape of the original input.r   )r   r   r!  r,   r>   r   r    r    r!   _ReshapeToInputN  s   r{  
ExpandDimsc                 C   s   t | |d gS r   r{  r   r    r    r!   _ExpandDimsGradT  r  r~  Squeezec                 C   
   t | |S r   r}  r   r    r    r!   _SqueezeGradY  r   r  	Transposec                 C   s    | j d }t|t|dgS )zReturns unshuffle(grad).r+   Nr>   r   rD  invert_permutationr   r   pr    r    r!   _TransposeGrad^  s   
r  ConjugateTransposec                 C   s$   | j d }tj|t|dddgS )zReturns conj(unshuffle(grad)).r+   T)	conjugateNr  r  r    r    r!   _ConjugateTransposeGrade  s   
r  ShapeShapeNRankSizeTilec                 C   s   t j| jd | jd jd}t t t| jd |gdg}t	dt 
|d}t|tjrUt|d |jj}t|jt|j||}t jdg|dd gdd}tt |||}t sm|| jd   |dgS )z,Sum reduces grad along the tiled dimensions.r   r+   r}   rF   rC   Nr$   )r   r,   r>   r*   r   rD  r   r%   r   r)  rm   r:   rY   rZ   r`   r]   r   r\   modr-   r   r   r8   	set_shaper   )r   r   rA   split_shapeaxesinput_shape_0
input_gradr    r    r!   	_TileGradx  s    	r  BroadcastGradientArgsc              	   C   s   | j d }| j d }t|ddgtt|dg}t|dg}tj||jd}t|||}t	| j dkr=|ddfS |dfS )zGradient for Pad.r   r+   rF   r}   r   N)
r>   r   rV   r   r%   rT   r   r,   r*   rI   )r   r   r@   a
pad_beforer5   r1   x_gradr    r    r!   _PadGrad  s   


r  PadPadV2ReverseSequencec                 C   s,   | j d }tj|| d| d|dd gS )Nr+   	batch_dimseq_dim)
batch_axisseq_axisseq_lengths)r>   r   reverse_sequencer   )r   r   r  r    r    r!   _ReverseSequenceGrad  s   
r  Reversec                 C      | j d }t||d fS r   )r>   r   reverse)r   r   reverse_dimsr    r    r!   _ReverseGrad     
r  	ReverseV2c                 C   r  r   )r>   r   
reverse_v2)r   r   r   r    r    r!   _ReverseV2Grad  r  r  SpaceToBatchc                 C   $   |  d}tj|| jd |dd gS N
block_sizer+   )r  )r   r   batch_to_spacer>   r   r   r  r    r    r!   _SpaceToBatchGrad     
r  SpaceToBatchNDc                 C       t || jd | jd d d gS r  )r   batch_to_space_ndr>   r   r    r    r!   _SpaceToBatchNDGrad     r  BatchToSpacec                 C   r  r  )r   r   space_to_batchr>   r  r    r    r!   _BatchToSpaceGrad  r  r  BatchToSpaceNDc                 C   r  r  )r   space_to_batch_ndr>   r   r    r    r!   _BatchToSpaceNDGrad  r  r  SpaceToDepthc                 C   4   |  d}|  d}|dkrtdtj|||d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  r    r    r!   _SpaceToDepthGrad  
   

r  DepthToSpacec                 C   r  )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  r    r    r!   _DepthToSpaceGrad  r  r  OneHot	MirrorPadc                 C   r  Nmoder+   )r  )r   r   mirror_pad_gradr>   r   r   r  r    r    r!   _MirrorPadGrad     
r  MirrorPadGradc                 C   r  r  )r   r   
mirror_padr>   r  r    r    r!   _MirrorPadGradGrad	  r  r  FakeQuantWithMinMaxArgsGradientFakeQuantWithMinMaxVarsGradient)FakeQuantWithMinMaxVarsPerChannelGradientQuantizeAndDequantizec                 C   rh  r   r    r   r    r    r!   _QuantizeAndDequantizeGrad  ro  r  QuantizeAndDequantizeV2c                 C   s
   |d d gS r   r    r   r    r    r!   _QuantizeAndDequantizeV2Grad  r   r  QuantizeAndDequantizeV3c                 C   s   |d d d gS r   r    r   r    r    r!   _QuantizeAndDequantizeV3Grad  s   r  ExtractImagePatchesc                 C   sN  t j| jd tjd}t|\}}}}t j| jd tjd}t|dd \}}	| d\}
}}}
|| }t 	t
jd|d tjjdd||df}t|| d| d| d| d	}t
|tj}t t 	t||||	|||fd
}t 	|d|| f}t 	|dgd }t
j|||d}t 	|||||f}t |d}|gS )Nr   r}   r+   r   ksizesr)   r   ratespadding)r+   rC   r   r   r      rF   )num_segments)rC   r   r+   r   )r   r,   r>   r   int64r   r   r   r   r   r   r)  r	   float32r   extract_image_patchesr`   rD  r!  r   )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_outr    r    r!   _ExtractImagePatchesGrad$  s@   
r  ExtractVolumePatchesc                 C   s  dd | j d jjD \}}}}}t| j d }|d }|d }d|| |  }ttjd|tjj	dd|||df}	t
|	| d| d| d	}
d
d | jd jjD \}}}}}| d\}}}}}|| | }|| | | }ttj|tjj	dd||||| | f}tjtj|
ddtj|ddgdd}t|d}||f}t|tj|g|jd|}t|d|d |f}ttt|||||||||fd}t|d|| f}t||}t||||||f}t|d}|gS )Nc                 S      g | ]}|j qS r    rD   rG   r0  r    r    r!   rH   U      z-_ExtractVolumePatchesGrad.<locals>.<listcomp>r   r   r+   r)   r  r   r  c                 S   r  r    r  r  r    r    r!   rH   h  r   rF   r$   )rF   rC   )r+   r   )r+   rC   r   r   r     r      )r   r   r+   rC   r   )r>   r,   rS  r   r   r   r)  r	   r   r  r   extract_volume_patchesr   r   r-   r/   r
   SparseTensorr(  r*   r   sparse_slicerD  r!  sparse_tensor_dense_matmul)r   r   r;  	planes_inr  r  r  input_bphwcr  r  r  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_matr  r  jacr  r    r    r!   _ExtractVolumePatchesGradS  sn   
r  	ScatterNdc                 C   s    | j d }t||}d |d gS r   r>   r   	gather_ndr   r   r]   updates_gradr    r    r!   _ScatterNdGrad     

r  TensorScatterUpdatec                 C   sF   | j d }t||}tt||tj| j d |jd}|d |gS )Nr+   rC   r)   )r>   r   r  tensor_scatter_updaterC  r   r*   r   r   r]   r  tensor_gradr    r    r!   _TensorScatterUpdateGrad  s   


r   TensorScatterAddc                 C   s*   | j d }t||}t|}|d |gS r   r>   r   r  rC  r  r    r    r!   _TensorScatterAddGrad  s   


r#  c                 C   s   | j d }| j d }| j d }| jd }tt|||j}t||}tt|||j}t||tj	||jd}	||	 }
|| |
 }t||
 || }|d|gS )z3Gradient for TensorScatterMin and TensorScatterMax.r+   r   rC   r}   N)
r>   r   r   r`   r  r*   r   r  rT  r,   )r   r   r]   r@   youtputx_indicatorsy_outputy_indicatorsys_indicators
indicatorsr  y_gradr    r    r!   _TensorScatterMinOrMaxGrad  s   




r,  TensorScatterMaxc                 C   r  )z!Gradient for TensorScatterMax op.r,  r   r    r    r!   _TensorScatterMaxGrad     
r/  TensorScatterMinc                 C   r  )z!Gradient for TensorScatterMin op.r.  r   r    r    r!   _TensorScatterMinGrad  r0  r2  TensorScatterSubc                 C   s,   | j d }t||}t|}|d | gS r   r"  r  r    r    r!   _TensorScatterSubGrad  s   

r4  ScatterNdNonAliasingAddc                 C   s    | j d }t||}|d |gS r   r  r  r    r    r!   _ScatterNdNonAliasingAddGrad  r  r6  BroadcastToc                 C   s   | j d }| j d }tj}t|tjr|j}tj||d}t|t	j
s8tt|}| r8tj| |d}t||\}}tj||dd}	t|	|}
|
d gS )Nr   r+   r}   r)   Tr   )r>   r   r0   r:   r   r;   r*   r   r,   r	   rJ   r   TensorShaper   try_evaluate_constantr   r   rS   r   r   r   r   r   r   )r   r   input_valuebroadcast_shapeshape_dtypeinput_value_shapebroadcast_shape_staticr   r   updates_grad_reshapedr  r    r    r!   _BroadcastToGrad  s,   

r@  N)e__doc__tensorflow.compiler.tf2xla.opsr   tensorflow.pythonr   tensorflow.python.eagerr   tensorflow.python.frameworkr   r   r   rY   r	   r
   r   r   r   tensorflow.python.opsr   r   r   r   r   r   r   r   r   RegisterGradient	Operationr"   r(   ru   rx   rz   NotDifferentiabler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r&  r5  r>  rP  rY  r\  ra  re  ri  rl  rn  rq  ry  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/  r2  r4  r6  r@  r    r    r    r!   <module>   sd  
 )	
""
	


#'



W





	












.>	