o
    ®Ÿ?eÎ°  ã                   @   sX  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d„ ƒZe d¡dd„ ƒZdd„ Ze d¡dd „ ƒZe d!¡d"d#„ ƒZ e !d$¡ e d%¡d&d'„ ƒZ"e d(¡d)d*„ ƒZ#e d+¡d,d-„ ƒZ$e d.¡d/d0„ ƒZ%e d1¡d2d3„ ƒZ&e d4¡d5d6„ ƒZ'e !d7¡ e d8¡d9d:„ ƒZ(e d;¡d<d=„ ƒZ)e d>¡d?d@„ ƒZ*e dA¡dBdC„ ƒZ+e dD¡dEdF„ ƒZ,e dG¡dHdI„ ƒZ-e dJ¡dKdL„ ƒZ.e dM¡dNdO„ ƒZ/e dP¡dQdR„ ƒZ0e dS¡dTdU„ ƒZ1e dV¡dWdX„ ƒZ2e dY¡dZd[„ ƒZ3e !d\¡ e d]¡d^d_„ ƒZ4e !d`¡ e !da¡ e db¡dcdd„ ƒZ5dedf„ Z6e dg¡dhdi„ ƒZ7djdk„ Z8dldm„ Z9e dn¡dodp„ ƒZ:e dq¡drds„ ƒZ;e dt¡dudv„ ƒZ<e dw¡dxdy„ ƒZ=e dz¡d{d|„ ƒZ>e d}¡e d~¡dd€„ ƒƒZ?e d¡d‚dƒ„ ƒZ@e d„¡d…d†„ ƒZAe d‡¡dˆd‰„ ƒZBe !dŠ¡ e d‹¡dŒd„ ƒZCe !dŽ¡ dd„ ZDe d‘¡d’d“„ ƒZEe d”¡d•d–„ ƒZFe d—¡d˜d™„ ƒZGe dš¡d›dœ„ ƒZHe !d¡ e !dž¡ e !dŸ¡ e !d ¡ e d¡¡d¢d£„ ƒZIe !d¤¡ d¥d¦„ ZJe d§¡eJƒ e d¨¡eJƒ e d©¡dªd«„ ƒZKe d¬¡d­d®„ ƒZLe d¯¡d°d±„ ƒZMe d²¡d³d´„ ƒZNe dµ¡d¶d·„ ƒZOe d¸¡d¹dº„ ƒZPe d»¡d¼d½„ ƒZQe d¾¡d¿dÀ„ ƒZRe dÁ¡dÂdÃ„ ƒZSe !dÄ¡ e dÅ¡dÆdÇ„ ƒZTe dÈ¡dÉdÊ„ ƒZUe dË¡dÌdÍ„ ƒZVe dÎ¡dÏdÐ„ ƒZWe dÑ¡dÒdÓ„ ƒZXe dÔ¡dÕdÖ„ ƒZYe d×¡dØdÙ„ ƒZZe dÚ¡dÛdÜ„ ƒZ[e dÝ¡dÞdß„ ƒZ\e dà¡dádâ„ ƒZ]dãdä„ Z^e då¡dædç„ ƒZ_e dè¡dédê„ ƒZ`e dë¡dìdí„ ƒZae dî¡dïdð„ ƒZbe dñ¡dòdó„ ƒZcdôS )õ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_opsZPackc                 C   s   t j||  d¡|  d¡dS )zGradient for pack op.ÚNÚaxis)Únumr   )r   ÚunstackÚget_attr©ÚopÚgrad© r   úa/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/ops/array_grad.pyÚ	_PackGrad'   s   ÿr!   Z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   sb  dd„ }dd„ }t | jƒdkr||kr|dg S dg| S | j| }| j||… }g }	t|tjƒrÃt ¡ s;t|tjƒrW| 	¡  
d¡|d  ¡  }
t ||
¡}t |||
¡}	q¢t |¡ryt |j¡}t |j¡}||kryt |¡}tj||jd}|t |d ¡ }
||ƒ}t |ƒd	kr¨t t tj|d
d|
dgd
dg¡¡}t |||
¡}	q¢t |
|¡}t ||ƒD ]\}}|	 !t |||¡¡ q³nßt|t"j#ƒrš|t |d ¡ }
t |¡}|du ràt$dƒ‚|dk rút t |d ¡¡}|du röt$dƒ‚||; }dd„ |D ƒ}|dkr>|||
ƒ\}}|D ],}t |j%|t &dgt |d
gdg¡gd¡¡}|	 !t" #||j'|¡¡ t( )||| ¡}qq¢tjd|j'jd}|D ]O}t *||
¡}|j|j'jkrbt(j+||j'jd}|| }tjt ,t( -|j'|k|j'|k ¡¡d
gd}t *|j'|¡| }t *|j%|¡}|	 !t" #|||¡¡ |}qIn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_dimZshape_of_shapeÚmaskÚbeginr   r   r    Ú_CreateDenseMaskAndBeginG   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} q,| 
|¡ q|r0|S t | ¡S )z-Extract the shapes of a set of input tensors.TÚConstF)r   Úexecuting_eagerlyr   Zshape_nr*   Ú
isinstancer   ÚTensorr   ÚtypeÚappend)Úinputsr/   Zfully_knownÚxÚinput_shaper   r   r    Ú_ExtractInputShapesV   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:   r6   r   r7   r   r5   r	   ÚEagerTensorZ_numpyÚitemZ_rankr   ZTFE_Py_TensorShapeSlicer   Úsplitr   Úis_constantr   ZGetOutputContextr   r   Úconstant_valueÚconstantr(   ÚrankÚsqueezeÚslicer   r#   r   Zconcat_offsetÚzipr9   Úindexed_slices_libÚIndexedSlicesÚ
ValueErrorÚvaluesr+   Úindicesr   ÚaddÚgatherÚcastÚwhereÚlogical_andÚ	TypeErrorr8   )r   r   Ústart_value_indexÚend_value_indexÚ	dim_indexr3   r=   r0   Zinput_valuesZ	out_gradsZnon_neg_concat_dimr/   Zgrad_contextZdim_contextr?   Úoffsetr2   ÚsizeZconcat_dim_staticrK   r1   Ú
new_valuesÚstartZsize_concat_dimÚendZindices_to_selectZnew_indicesr   r   r    Ú_ConcatGradHelper4   sª   
ÿÿ

þÿÿ

þÿùÿÿÿüÿðÿrb   ZConcatc                 C   s   t | |dt| jƒddS )Nr)   r   ©rZ   r[   r\   )rb   rD   r:   r   r   r   r    Ú_ConcatGradÚ   s   ûrd   ZConcatV2c                 C   s   t | |ddddS )Nr   rA   rc   )rb   r   r   r   r    Ú_ConcatGradV2ä   s   
ÿre   Z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)   ©Zout_typeN)r:   r   rK   r(   r*   Úoutputsr   ZGraphOrParentsInXlaContextr	   Zget_default_graphr   Zxla_dynamic_update_sliceÚ
zeros_liker   r#   Úreshaper+   Úpad)r   r   Z	input_vecZ	begin_vecZ
input_rankZindex_dtypeZ
slice_sizer*   Z
before_padZ	after_padZpaddingsr   r   r    Ú
_SliceGradí   s&   


ÿÿþrl   Z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)   r>   é   r   rg   NÚ
begin_maskÚend_maskÚellipsis_maskÚnew_axis_maskÚshrink_axis_mask©rn   ro   rp   rq   rr   )r:   r   r*   r(   r   rI   Zstrided_slice_gradr   )
r   r   r2   ra   Ústridesr;   Zx_staticZbegin_staticZ
end_staticZstrides_staticr   r   r    Ú_StridedSliceGrad  s4   






ö
öru   Z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)   r>   rm   Nrn   ro   rp   rq   rr   rs   )r:   r   Ústrided_slicer   )r   r   r2   ra   rt   r   r   r    Ú_StridedSliceGradGrad.  s   


÷rw   Z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)   r>   rm   rn   ro   rp   rq   rr   c                    s   | |ˆ ˆˆˆˆdœŽS )N)rn   ro   rr   rq   rp   r   )ÚfÚargs©rn   rp   ro   rq   rr   r   r    ÚApplyK  s   ûz,_TensorStridedSliceUpdateGrad.<locals>.Applyrg   é   T©r   Zkeepdims)r:   r   r   rv   Ztensor_strided_slice_updateri   r*   r(   r   Úbroadcast_gradient_argsr   Ú
reduce_sumrj   )r   r   r2   ra   rt   r{   ZdyZdxZslice_shapeZvalue_shapeÚ_Úreduction_axesZdy_reshapedr   rz   r    Ú_TensorStridedSliceUpdateGradA  s.   







ÿÿÿr‚   ZSplitc                 G   s   d t  t|ƒ| jd ¡fS ©Nr   )r   r+   Úlistr:   r$   r   r   r    Ú
_SplitGradd  s   r…   ZSplitVc                 G   s4   t  t|ƒ| jd ¡}|gd gt| jƒd   }|S )Nr>   r)   )r   r+   r„   r:   rD   )r   r%   Z	returnvalr   r   r    Ú_SplitVGradi  s   ÿýr†   r4   ZDiagc                 C   ó
   t  |¡S ©N)r   Z	diag_part©r€   r   r   r   r    Ú	_DiagGradv  ó   
rŠ   ZDiagPartc                 C   r‡   rˆ   )r   Zdiagr‰   r   r   r    Ú_DiagPartGrad{  r‹   rŒ   Z
MatrixDiagc                 C   r‡   rˆ   )r   Úmatrix_diag_partr‰   r   r   r    Ú_MatrixDiagGrad€  r‹   rŽ   Z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‘   Z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”   Z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_diagri   ©r   r   Úmatrix_shaper   r   r    Ú_MatrixDiagPartGrad‘  s   
r   Z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    Z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š   ri   )r   r   rœ   r’   r   r   r    Ú_MatrixDiagPartV3Grad©  s$   
ûûþþr¡   Z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•   rA   r>   r'   )r:   r—   Z
merge_withr˜   Úas_listÚminr	   Úcolocate_withr   r*   rK   rM   r   Z
reduce_minr+   rš   r,   r(   r   )r   r   r<   Ú
diag_shapeÚbatch_shaperœ   Ú
grad_shapeZ	grad_rankZmin_dimÚ
grad_inputÚ	grad_diagr   r   r    Ú_MatrixSetDiagGrad»  s&   


úÿ
rª   Z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•   r>   rA   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	   Z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*   rj   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Æ   ZMatrixSetDiagV3c                    sD  | j d  ¡ }|  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 MatrixSetDiagV3.r)   r’   Nr•   r>   rA   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*   rj   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Ç   ZMatrixBandPartc                 C   s(   | j d }| j d }t |||¡d d fS ©Nr)   r>   )r:   r   Zmatrix_band_part)r   r   Z	num_lowerZ	num_upperr   r   r    Ú_MatrixBandPartGrad  s   

rÉ   ZEditDistanceZFillc                 C   s   d t  |¡fS rˆ   )r   r   r‰   r   r   r    Ú	_FillGrad)  ó   rÊ   Z	ZerosLikeZOnesLikeZPreventGradientc                 C   s   t d|  d¡ ƒ‚)Nz(Gradient explicitly disabled. Reason: %sÚmessage)ÚLookupErrorr   )r   r€   r   r   r    Ú_PreventGradientGrad2  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   )
r6   rO   rP   Zdense_shaperQ   Ústrr   Úunsorted_segment_sumrR   rS   r   r   r   r    Ú_IndexedSlicesToTensorNoWarning8  s   
ÿÿþrÑ   Z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-   r^   r+   rj   rÑ   rO   rP   )r   r   ÚparamsÚparams_shaperS   r^   Úvalues_shaperR   r   r   r    Ú_GatherGradF  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   rA   r)   r"   )r(   Z
base_dtyper   rV   r   ÚonesÚranger,   r+   ZtilerK   rj   )rÓ   rS   Ú
batch_dimsZbatch_indicesZindices_dtypeZcasted_params_shapeZaccum_dim_valueÚdimZ	dim_valuer`   ÚstepZdim_indicesZ	dim_shaper   r   r    Ú_GetBatchIndicesX  s&   þýrÛ   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)   FrA   )r   r-   r^   r*   r   Úprodr+   rÛ   rj   rÑ   r   rÐ   )rÓ   rR   rS   rØ   Zgather_dim_sizeÚindices_sizerÔ   Úouter_shapeÚinner_shapeÚ
batch_sizeZflat_values_shapeÚparams_gradr   r   r    Ú_BatchGatherGradn  s&   
ÿÿrâ   ZGatherV2c                 C   sN  | j d }t |¡ tj|tjjd}t |tj	¡}W d  ƒ n1 s%w   Y  | j d }t 
t |¡d¡}| j d }t |¡}t|  d¡ƒ}|dk rc|jjdu r]td|› d|› ƒ‚||jj7 }|dkr¯t ¡ r‹t |j¡ t |¡dd… }	W d  ƒ n1 s…w   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 ||¡}|ddgS )
zGradient for GatherV2 op.r   rg   Nr)   r>   rØ   zúCurrently, 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=rA   )r:   r	   r¤   r   r*   r   Úint64r   rV   r.   r-   r^   r   rI   Úintr   ÚndimsrQ   r   r5   ZdeviceÚidentityr+   rj   rÑ   rO   rP   r×   Ú	transposerU   râ   )r   r   rÒ   rÓ   rS   rÝ   r   Zaxis_staticrØ   Zparams_tail_shaperÔ   rR   rá   rÞ   rß   Zvalues_dimsZ	axis_dimsZouter_batches_indicesZbatch_axis_indicesZinner_axes_indicesZtranspose_dimsZvalues_transposeZparams_shape_transposeZinvert_transpose_dimsr   r   r    Ú_GatherV2GradŒ  s‚   
	þ


üüÿÿ€ÿÿ


ÿþý
ÿþý
rè   ZGatherNdc                 C   sx   | 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 
|||¡}|d gS )Nr   r)   rg   r>   rA   r"   )r:   r   r*   r(   rå   Údimsr?   rO   rP   rL   Ú
scatter_nd©r   r   ÚrefrS   Z	ref_shapeZref_gradr   r   r    Ú_GatherNdGradÞ  s   

ÿÿrí   Z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)   r>   rA   r"   )r:   r   Zvariable_shaper(   r*   rå   ré   r?   rO   rP   r   rL   rê   rë   r   r   r    Ú_ResourceGatherNdGradë  s   

ÿÿrî   Z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   Zcheck_numericsr   r   r   r   r    Ú_CheckNumericsGradø  ó   ÿþrñ   ZCheckNumericsV2c                 C   rï   rð   )r   Zcheck_numerics_v2r   r   r   r   r    Ú_CheckNumericsV2Grad  rò   ró   ZPlaceholderWithDefaultZIdentityc                 C   ó   |S rˆ   r   r‰   r   r   r    Ú_IdGrad
  s   rõ   Z_EagerConstc                 C   s   t dƒ‚)NzDThis op should never interact with gradient APIs. Please file a bug.)ÚAssertionErrorr‰   r   r   r    Ú_EagerConstGrad  s   ÿr÷   ZRefIdentityc                 C   rô   rˆ   r   r‰   r   r   r    Ú
_RefIdGrad  ó   rø   Z	IdentityNc                 G   rô   rˆ   r   r‰   r   r   r    Ú_IdNGrad  rù   rú   ZStopGradientZReshapec                 C   s    t  t|ƒt  | jd ¡¡d gS rƒ   ©r   rj   rÑ   r*   r:   r   r   r   r    Ú_ReshapeGrad#  s
   ÿýrü   Z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    Ú_ReshapeToInput/  s   ÿrý   Z
ExpandDimsc                 C   s   t | |ƒd gS rˆ   ©rý   r   r   r   r    Ú_ExpandDimsGrad5  rË   rÿ   ZSqueezec                 C   ó
   t | |ƒS rˆ   rþ   r   r   r   r    Ú_SqueezeGrad:  r‹   r  Z	Transposec                 C   s    | j d }t |t |¡¡dgS )zReturns unshuffle(grad).r)   N©r:   r   rç   Zinvert_permutation©r   r   Úpr   r   r    Ú_TransposeGrad?  s   
r  Z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    Ú_ConjugateTransposeGradF  s   
ÿþr  ZShapeZShapeNZRankÚSizeZ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)   rg   rA   r>   Nr"   )r   r*   r:   r(   rj   rç   r   r#   r   r×   r^   r6   rO   rP   rV   rS   rÐ   rR   Úmodr+   r   r   r5   Ú	set_shaper—   )r   r   r<   Zsplit_shapeZaxesZinput_shape_0Z
input_gradr   r   r    Ú	_TileGradY  s    	þÿr  Z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)   rA   rg   rm   N)
r:   r   rM   r   r#   rK   rj   r*   r(   rD   )r   r   r;   ÚaZ
pad_beforer2   r/   Úx_gradr   r   r    Ú_PadGrady  s   

ÿ
r  ZPadZPadV2ZReverseSequencec                 C   s,   | j d }tj||  d¡|  d¡|dd gS )Nr)   Z	batch_dimZseq_dim)Z
batch_axisZseq_axisÚseq_lengths)r:   r   Zreverse_sequencer   )r   r   r  r   r   r    Ú_ReverseSequenceGrad‘  s   
üûr  ZReversec                 C   ó   | j d }t ||¡d fS r»   )r:   r   Úreverse)r   r   Zreverse_dimsr   r   r    Ú_ReverseGrad  ó   
r  Z	ReverseV2c                 C   r  r»   )r:   r   Z
reverse_v2)r   r   r   r   r   r    Ú_ReverseV2Grad£  r  r  ZSpaceToBatchc                 C   ó$   |   d¡}tj|| jd |dd gS ©NÚ
block_sizer)   )r  )r   r   Zbatch_to_spacer:   ©r   r   r  r   r   r    Ú_SpaceToBatchGrad©  ó   
ÿr  ZSpaceToBatchNDc                 C   ó    t  || jd | jd ¡d d gS rÈ   )r   Zbatch_to_space_ndr:   r   r   r   r    Ú_SpaceToBatchNDGrad²  ó   ÿr  ZBatchToSpacec                 C   r  r  )r   r   Zspace_to_batchr:   r  r   r   r    Ú_BatchToSpaceGradº  r  r  ZBatchToSpaceNDc                 C   r  rÈ   )r   Zspace_to_batch_ndr:   r   r   r   r    Ú_BatchToSpaceNDGradÃ  r  r   Z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   rQ   r   Zdepth_to_space©r   r   r  r"  r   r   r    Ú_SpaceToDepthGradË  ó
   

r&  ZDepthToSpacec                 C   r!  )Nr  r"  r#  z\Cannot compute DepthToSpace gradient with NCHW_VECT_C. NCHW_VECT_C requires qint8 data type.r$  )r   rQ   r   Zspace_to_depthr%  r   r   r    Ú_DepthToSpaceGradÖ  r'  r(  ZOneHotZ	MirrorPadc                 C   r  ©NÚmoder)   )r*  )r   r   Zmirror_pad_gradr:   ©r   r   r*  r   r   r    Ú_MirrorPadGradä  ó   
r,  ZMirrorPadGradc                 C   r  r)  )r   r   Z
mirror_padr:   r+  r   r   r    Ú_MirrorPadGradGradê  r-  r.  ZQuantizeAndDequantizec                 C   rô   rˆ   r   r‰   r   r   r    Ú_QuantizeAndDequantizeGradð  rù   r/  ZQuantizeAndDequantizeV2c                 C   s
   |d d gS rˆ   r   r‰   r   r   r    Ú_QuantizeAndDequantizeV2Gradõ  r‹   r0  ZQuantizeAndDequantizeV3c                 C   s   |d d d gS rˆ   r   r‰   r   r   r    Ú_QuantizeAndDequantizeV3Gradú  s   r1  Z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   rg   r)   rm   Úksizesr'   rt   ZratesÚpadding)r)   r>   rm   r|   r   é   rA   )Znum_segments)r>   r   r)   rm   )r   r*   r:   r   rã   r   r   rh   r   rj   r   r×   r	   Zfloat32r   Zextract_image_patchesrV   rç   rÑ   rÐ   )r   r   Z
input_bhwcrà   Úrows_inÚcols_inÚchannelsZoutput_bhwcÚrows_outÚcols_outr€   Úksize_rÚksize_cÚinput_indices_numÚ	input_idxÚinput_idx_patchedÚgrad_expandedÚ	grad_flatZsegment_idsÚgrad_outr   r   r    Ú_ExtractImagePatchesGrad   s@   
þþþüÿÿrB  Z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   ©r?   ©rB   rÙ   r   r   r    rC   1  ó    ÿz-_ExtractVolumePatchesGrad.<locals>.<listcomp>r   r|   r)   r'   r2  rt   r3  c                 S   rC  r   rD  rE  r   r   r    rC   D  rF  rA   r"   )rA   r>   )r)   r   )r)   r>   rm   r|   r4  é   r   é   )rm   r   r)   r>   r|   )r:   r*   ré   r   rj   r   r×   r	   r   rã   r   Zextract_volume_patchesr   rh   r+   r-   r
   ZSparseTensorrÖ   r(   r   Zsparse_slicerç   rÑ   Zsparse_tensor_dense_matmul)r   r   rà   Z	planes_inr5  r6  r7  Zinput_bphwcr<  r=  r>  r€   Z
planes_outr8  r9  Zksize_pr:  r;  Zprc_indices_numZoutput_indices_numZ
output_idxZ
idx_matrixZidx_mapZsp_shapeZsp_mat_fullZsp_matr?  r@  ZjacrA  r   r   r    Ú_ExtractVolumePatchesGrad/  sn   ÿþþÿþþüÿ
ÿÿþüÿrI  Z	ScatterNdc                 C   s    | j d }t ||¡}d |d gS rƒ   ©r:   r   Ú	gather_nd©r   r   rS   Úupdates_gradr   r   r    Ú_ScatterNdGradn  ó   

rN  ZTensorScatterUpdatec                 C   sF   | j d }t ||¡}t t |¡|tj| j d |jd¡}|d |gS )Nr)   r>   r'   )r:   r   rK  Ztensor_scatter_updateræ   ri   r(   ©r   r   rS   rM  Ztensor_gradr   r   r    Ú_TensorScatterUpdateGradu  s   

þ
rQ  ZTensorScatterAddc                 C   s*   | j d }t ||¡}t |¡}|d |gS r»   ©r:   r   rK  ræ   rP  r   r   r    Ú_TensorScatterAddGrad  s   


rS  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   r>   rg   N)
r:   rh   r   rV   rÁ   r(   r   rK  rê   r*   )r   r   rS   r;   ÚyÚoutputZx_indicatorsZy_outputZy_indicatorsZys_indicatorsZ
indicatorsr  Zy_gradr   r   r    Ú_TensorScatterMinOrMaxGrad‡  s   



ÿ
rV  ZTensorScatterMaxc                 C   r   )z!Gradient for TensorScatterMax op.©rV  r   r   r   r    Ú_TensorScatterMaxGradš  ó   
rX  ZTensorScatterMinc                 C   r   )z!Gradient for TensorScatterMin op.rW  r   r   r   r    Ú_TensorScatterMinGrad   rY  rZ  ZTensorScatterSubc                 C   s,   | j d }t ||¡}t |¡}|d | gS r»   rR  rP  r   r   r    Ú_TensorScatterSubGrad¦  s   

r[  ZScatterNdNonAliasingAddc                 C   s    | j d }t ||¡}|d |gS r»   rJ  rL  r   r   r    Ú_ScatterNdNonAliasingAddGrad®  rO  r\  Z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)   rg   r'   Tr}   )r:   r   r.   r6   r   r7   r(   r   r*   r	   rE   r   ZTensorShaper   Ztry_evaluate_constantr˜   r   rJ   r¢   r   r~   r   r   rj   )r   r   Zinput_valueZbroadcast_shapeZshape_dtypeZinput_value_shapeZbroadcast_shape_staticr€   r   Zupdates_grad_reshapedrM  r   r   r    Ú_BroadcastToGradµ  s,   

ÿÿÿÿr]  N)dÚ__doc__Ztensorflow.compiler.tf2xla.opsr   Ztensorflow.pythonr   Ztensorflow.python.eagerr   Ztensorflow.python.frameworkr   r   r   rO   r	   r
   r   r   r   Ztensorflow.python.opsr   r   r   r   r   r   r   r   r   ZRegisterGradientr!   r&   rb   rd   re   ZNotDifferentiablerl   ru   rw   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   r&  r(  r,  r.  r/  r0  r1  rB  rI  rN  rQ  rS  rV  rX  rZ  r[  r\  r]  r   r   r   r    Ú<module>   sZ  

 '
	



"

"


	









#
'







Q














	






















.
>

	




