o
    2hN                     @   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 Zdd Zdd Zdd ZdS )z%Shared utilities related to backprop.    )flags)	types_pb2)dtypes)indexed_slices)ops)tensor)tensor_util)	array_ops)handle_data_util)math_opsc                    sz   | j }|jtjkr;t| tjr| j}nt	| }|dur;|j
r;|jr;|jd j   tjkr;t fdd|jD r; S |S )zEExtract either `tensor.dtype` or the unanimous sub-type of a variant.Nr   c                 3   s    | ]}|j  kV  qd S N)dtype).0shape_and_type
first_type `/var/www/html/chatgem/venv/lib/python3.10/site-packages/tensorflow/python/eager/backprop_util.py	<genexpr>/   s    z#_DTypeFromTensor.<locals>.<genexpr>)r   
base_dtyper   variant
isinstancer   EagerTensor_handle_datar
   get_resource_handle_datais_setr   r   
DT_INVALIDall)r   r   handle_datar   r   r   _DTypeFromTensor   s$   

r   c                 C   s|   t | r
t| }n| }t|}tjtjtjtjtj	tj
tjtjg}t j r9|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_dtypesr   r   r   IsTrainable5   s   



r4   c                 C   s\   t | tjsJ t | jtjr| S t | jtjsJ t| j}t|jt| j	|j	|j
S r   )r   r   IndexedSlicesvalues
tensor_libTensorFlattenNestedIndexedSlicesr	   gatherindicesdense_shape)gradgr   r   r   r9   E   s   
r9   c                 C   s   t | dk rdS t | dkr| d S dd | D } tdd | D r't| S t| } dd | D } ttjd	d | D dd
tjdd | D dd
| d j	}|S )z1Aggregates gradients containing `IndexedSlices`s.   Nr   c                 S   s   g | ]}|d ur|qS r   r   r   r>   r   r   r   
<listcomp>V   s    z3AggregateIndexedSlicesGradients.<locals>.<listcomp>c                 s   s    | ]	}t |tjV  qd S r   )r   r7   r8   r@   r   r   r   r   Y   s    z2AggregateIndexedSlicesGradients.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   )r9   r   xr   r   r   rA   a   s    c                 S      g | ]}|j qS r   )r6   rB   r   r   r   rA   d       )axisc                 S   rD   r   )r;   rB   r   r   r   rA   e   rE   )
lenanyr   add_n_as_indexed_slices_listr   r5   r	   concatr<   )gradsconcat_gradr   r   r   AggregateIndexedSlicesGradientsP   s   

rN   N)__doc__tensorflow.core.configr   tensorflow.core.frameworkr   tensorflow.python.frameworkr   r   r   r   r7   r   tensorflow.python.opsr	   r
   r   r   r4   r9   rN   r   r   r   r   <module>   s   