
    BVhN                         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 Zd Zd Zd Zy)z%Shared utilities related to backprop.    )flags)	types_pb2)dtypes)indexed_slices)ops)tensor)tensor_util)	array_ops)handle_data_util)math_opsc                    | j                   }|j                  t        j                  k(  rt	        | t
        j                        r| j                  }nt        j                  |       }|d|j                  rX|j                  rL|j                  d   j                   t        j                  k7  r t        fd|j                  D              rS |S )zEExtract either `tensor.dtype` or the unanimous sub-type of a variant.r   c              3   <   K   | ]  }|j                   k(    y wN)dtype).0shape_and_type
first_types     U/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/eager/backprop_util.py	<genexpr>z#_DTypeFromTensor.<locals>.<genexpr>/   s&      D$ !&&*4 Ds   )r   
base_dtyper   variant
isinstancer   EagerTensor_handle_datar   get_resource_handle_datais_setr   r   
DT_INVALIDall)r   r   handle_datar   s      @r   _DTypeFromTensorr       s    
,,%
' &#//*''k$==fEk&&--a066j 	,,
, D(3(B(BD D	,    c                    t        j                  |       rt        |       }n| }t        j                  |      }t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  g}t        j                         j                  j!                         r\|j#                  t        j$                  t        j&                  t        j(                  t        j*                  t        j,                  g       |j.                  |v S )zDDetermines whether a tensor or dtype supports infinitesimal changes.)r	   
is_tf_typer    r   as_dtypefloat16float32float64	complex64
complex128resourcer   bfloat16r   config enable_quantized_dtypes_trainingvalueextendqint8qint16qint32quint8quint16r   )tensor_or_dtyper   trainable_dtypess      r   IsTrainabler7   5   s    O,_-EE
//%
 %nnfnnfnn&&(9(96??nnfoo7 \\^44::<V\\6==&--#]]FNN< =			-	--r!   c                    t        | t        j                        sJ t        | j                  t        j
                        r| S t        | j                  t        j                        sJ t        | j                        }t        j                  |j                  t        j                  | j                  |j                        |j                        S r   )r   r   IndexedSlicesvalues
tensor_libTensorFlattenNestedIndexedSlicesr
   gatherindicesdense_shape)gradgs     r   r=   r=   E   s    	D.66	77	7Z../Kdkk>#?#?@@@"4;;/A''	)""4<<;Q]]L Lr!   c           	      :   t        |       dk  ryt        |       dk(  r| d   S | D cg c]  }||	 } }t        d | D              rt        j                  |       S t        j                  |       } | D cg c]  }t        |       } }t        j                  t        j                  | D cg c]  }|j                   c}d      t        j                  | D cg c]  }|j                   c}d      | d   j                        }|S c c}w c c}w c c}w c c}w )z1Aggregates gradients containing `IndexedSlices`s.   Nr   c              3   P   K   | ]  }t        |t        j                           y wr   )r   r;   r<   )r   rB   s     r   r   z2AggregateIndexedSlicesGradients.<locals>.<genexpr>Y   s     9aAz((	)9s   $&)axis)lenanyr   add_n_as_indexed_slices_listr=   r   r9   r
   concatr:   r?   r@   )gradsrB   xconcat_grads       r   AggregateIndexedSlicesGradientsrO   P   s    Z!^Z1_8O
-q}1
-%
- 	9599>>%  
 
*
*5
1%27
8Q%a(
8%
8,,%0Q0q951a		1:Ah+
 
% . 9 11s   D	D	5D+DDN)__doc__tensorflow.core.configr   tensorflow.core.frameworkr   tensorflow.python.frameworkr   r   r   r   r;   r	   tensorflow.python.opsr
   r   r   r    r7   r=   rO    r!   r   <module>rV      s=    , ( / . 6 + < 3 + 2 *0. Lr!   