o
    2h$                     @   sp  d dl Z d dlZd dl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d Zdd Zdd Zdd Zd|ddZdd Zdd Zd}ddZd d! Zd~d#d$Zd%d& Zd'd( Zdd*d+Zd,d- Zdd/d0Zdd1d2Zdd4d5Zd6d7 Z d|d8d9Z!d:d; Z"dd<d=Z#dd>d?Z$dd@dAZ%dBdC Z&dDdE Z'		F	ddGdHZ(		F	ddIdJZ)dKdL Z*	M	F		MddNdOZ+	M	F		MddPdQZ,	M	F		MddRdSZ-	M	F			MddTdUZ.ddWdXZ/ddYdZZ0d[d\ Z1dd]d^Z2dd_d`Z3ddadbZ4ddcddZ5dedf Z6dgdh Z7	iddjdkZ8ddldmZ9	n	o	M	.	 ddpdqZ:drds Z;dtdu Z<dvdw Z=dxdy Z>				V		ddzd{Z?dS )    N)backend)#compute_conv_transpose_output_shape)cast)convert_to_tensorc                 C      t j| S N)tfnnrelux r   Z/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/nn.pyr
         r
   c                 C   r   r   )r   r	   relu6r   r   r   r   r      r   r   c                 C   s   | }t j| }||_|S r   )r   r	   sigmoid_keras_logits)r   logitsoutputr   r   r   r      s   r   c                 C   sH   t | } t| dktjd| jdt| dktjd| jdd| d  S )N        dtype         ?      ?)r   r   whereconstantr   r   r   r   r   sparse_sigmoid   s   $r   c                 C   r   r   )r   r	   tanhr   r   r   r   r   &   r   r   c                 C   s   | t j|  S r   )r   mathr   r   r   r   r   tanh_shrink*      r!   c                 C   r   r   )r   r    softplusr   r   r   r   r#   .   r   r#   c                 C   r   r   )r   r	   softsignr   r   r   r   r$   2   r   r$   r   c                 C   s0   t | |k| | t | | k | | t | S r   )r   r   
zeros_liker   	thresholdr   r   r   soft_shrink6   s
   r(   c                 C   s6   t | dkt | t | dk dt | d d | S )Nr   r   g      ?   )r   r   r%   powr   r   r   r   sparse_plus>   s
    r+   c                 C   r   r   )r   r	   silur   r   r   r   r,   F   r   r,      c                 C   s6   t | } t || jd}| tt| |  }|d S )Nr   r)   )r   r   r   sqrtsquare)r   byr   r   r   
squareplusJ   s   r2   c                 C   r   r   )r   r    log_sigmoidr   r   r   r   r3   Q   r   r3   皙?c                 C   s   t jj| |dS )N)alpha)r   r	   
leaky_relu)r   negative_sloper   r   r   r6   U   r"   r6   c                 C   s,   t | } t| td| j td| j S )Ng      @g      @)r   r   r   r   r   r   r   r   r   hard_sigmoidY   s   $r8   c                 C   s   | t |  S r   )r8   r   r   r   r   	hard_silu^   r   r9   r   c                 C   s.   t j| }|dkr|S t | dk||| S )Nr   r   )r   r	   elur   )r   r5   resr   r   r   r:   b   s   r:   c                 C   r   r   )r   r	   selur   r   r   r   r<   j   r   r<   Tc                 C   s   t | } tjj| |dS )N)approximate)r   r   r	   gelu)r   r=   r   r   r   r>   n   s   r>   c                 C   s(   t | d|t jt | d|   S )Nr   )r   maximumr    expm1minimum)r   r5   r   r   r   celus   s   rB   r   c                 C   sJ   | j | d dkrtd| j  d| tj| d|d\}}|t| S )Nr)   r   z4axis size must be divisible by 2. Received: x.shape=z with axis=)num_or_size_splitsaxis)shape
ValueErrorr   splitr   )r   rD   x1x2r   r   r   gluy   s   rJ   c                 C   s   t j| dddS )Ng      r   )clip_value_minclip_value_max)r   clip_by_valuer   r   r   r   	hard_tanh   r"   rN   c                 C   s   t t | |k| t | S r   )r   r   absr%   r&   r   r   r   hard_shrink   s   rP   c                 C   s   t | |k| |S r   )r   r   )r   r'   default_valuer   r   r   r'         r'   c                 C   sX   | }|d u rt | dg}t jj|dd}t |t | }nt jj| |d}||_|S Nr   rD   )r   reshaper	   softmaxrE   r   )r   rD   r   r   r   r   r   rV      s   rV   c                 C   sH   |d u rt | dg}t jj|dd}t |t | S t jj| |dS rS   )r   rU   r	   log_softmaxrE   )r   rD   r   r   r   r   rW      s
   rW   c                 C   s   t | }tj|d|d}tj||d}tjdt|| d |jd}dgt|j }d||< t||}||d |  dk}t	||d}tj
t||j|d	d
}	tj
||d	d
d |	 }
t||
 d}|S )N
DESCENDING)	directionrD   rT   r   r   r   r   r   TrD   keepdims)r   r   sortcumsumrangerE   r   lenrU   r   
reduce_sumr   r?   )r   rD   r   logits_sortedlogits_cumsumrr_shapesupportlogits_cumsum_safektaur   r   r   r   	sparsemax   s    ri   c                 C   sh   t | jd }|dkrt| d} | S |dkrt| d} | S |dkr+t| d} | S td| j d)	Nr)   r   r   r)   r   )r   r)      r   rk   )r   r)   rk   r-   r   zePooling inputs's shape must be 3, 4 or 5, corresponding to 1D, 2D and 3D inputs. But received shape: .)r_   rE   r   	transposerF   )inputsnum_spatial_dimsr   r   r   _transpose_spatial_inputs   s   
rp   c                 C   sV   t | jd }|dkrt| d} | S |dkrt| d} | S |dkr)t| d} | S )Nr)   r   rj   )r   rk   r   r)   rk   )r   r-   r   r)   rk   )r_   rE   r   rm   )outputsro   r   r   r   _transpose_spatial_outputs   s   rr   validc                 C   j   t |}|d u r|n|}| }tdt| j}|dkr!t| } tj	| ||||}|dkr3t
|}|S Nchannels_lastchannels_first)r   standardize_data_formatupper_convert_data_formatr_   rE   rp   r   r	   max_poolrr   rn   	pool_sizestridespaddingdata_formattf_data_formatrq   r   r   r   r{          
r{   c                 C   rt   ru   )r   rx   ry   rz   r_   rE   rp   r   r	   avg_poolrr   r|   r   r   r   average_pool   r   r   c                 C   s   | dkr|dkr
dS |dkrdS |dkrdS t d| d	| d
kr<|dkr(dS |dkr.dS |dkr4dS t d| d	t d|  d)Nrv   rk   NWCr-   NHWC   NDHWCzInput rank not supported: z. Expected values are [3, 4, 5]rw   NCWNCHWNCDHWzInvalid data_format: z9. Expected values are ["channels_first", "channels_last"])rF   )r   ndimr   r   r   rz     s.   


rz   r   c           	         s   fdd t jdd fdd}dko!tjdk}td	kr1jd
 }njd }|p>|jd k}|rD| S   S )Nc                     s,   t  tj} tjj | dS )Nr   	dilations)rz   r_   rE   r   r	   convolutionry   )r   )r   dilation_ratern   kernelr   r~   r   r   _conv7  s   zconv.<locals>._convT)jit_compilec                      s     S r   r   r   )r   r   r   	_conv_xlaD  s   zconv.<locals>._conv_xlarw   r   rv   r   r   )r   functionr_   rE   r   rx   )	rn   r   r~   r   r   r   r   	needs_xlachannelsr   )r   r   r   rn   r   r   r~   r   conv/  s   


r   c           
      C   s4  t |}t| jd }|dkrtd| j dt|d}| }t|t	r,|f| }t|t	r6|f| }|dkr{|dkrId|d  d }d}nd|d  }d}t
| |} t
j|d	d
}|d u rdd nd| }t
jj| |||||d}	t
|	|gS |dkrd| d }d}nd| }d}t
jj| |||||dS )Nr)   z<`inputs` rank must be 3 (1D conv) or 4 (2D conv). Received: rl   r-   r   rv   r   r   r   r   rT   r   )r   rx   r_   rE   rF   r   rz   ry   
isinstanceintr   expand_dimsr	   depthwise_conv2dsqueeze)
rn   r   r~   r   r   r   ro   r   spatial_start_dimrq   r   r   r   depthwise_convW  sZ   





r   c              	   C   s<  t |}t| jd }|dkrtd| dt|d}| }t|tr+|f| }t|tr5|f| }|dkr|dkrHd|d  d }d}	nd|d  }d}	t	
| |	} t	j
|d	d
}t	j
|d	d
}|d u rjd nd| }t	jj| ||||||d}
t	|
|	gS |dkrd| d }nd| }t	jj| ||||||dS )Nr)   z>`num_spatial_dims` must be 1 or 2. Received: num_spatial_dims=rl   r-   r   rv   r   r   r   rT   r   )r   rx   r_   rE   rF   rz   ry   r   r   r   r   r	   separable_conv2dr   )rn   depthwise_kernelpointwise_kernelr~   r   r   r   ro   r   r   rq   r   r   r   separable_conv  s\   
	




	r   c              	   C   s   t |}t|t| j}|jd d }|jd }	t| j}
t| }t|
D ]\}}|d u r5|| |
|< q't|
||	|||||}tj	j
| |||| ||dS )Nr   )r   r   r   )r   rx   rz   r_   rE   listr   	enumerater   r	   conv_transposery   )rn   r   r~   r   output_paddingr   r   r   kernel_sizefiltersinput_shapesymbolic_shapeieoutput_shaper   r   r   r     s:   
	


r   Fc           
         s"  t | dd} |d u rd}nt|}|r||dk r!|t| j d }t| j t|  f}tj	t
|d|d}dd | jD }tj|dd	i}||t| d  fd
d|D }dd |D }tj|dd}t| j}||| t|||S |dkrdnd\}}	tj| |||	||dS )Nint64r   float32r   r   c                 S   s   g | ]}t |qS r   )r   r^   ).0dimr   r   r   
<listcomp>  s    zone_hot.<locals>.<listcomp>indexingijc                    s   g | ]
}t | d fqS r   )r   rU   r   avalues_countr   r   r     s    c                 S   s   g | ]	}t |t jqS r   )r   r   r   r   r   r   r   r     s    rT   bool)TF)NN)on_value	off_valuerD   r   )r   r   standardize_dtyper_   rE   r    prodr   rU   r   greater_equalmeshgridinsertr?   concatr   SparseTensorone_hot)
r   num_classesrD   r   sparsevaluesindicesrE   r   r   r   r   r   r     s8   

r   c                 C   s   t | jdkr	dnd}t|dkrE|r6t| ||ddd}tjj||dd}|j}t||}|	| |S t| |||d}tj
||d	S |rYt| |||dd}tjj||ddS t| |||d}tj||d	S )
Nr   r   r   int8T)rD   r   r   )rD   output_is_sparse)rD   r   rT   )r_   rE   r   r   r   r   r   
reduce_maxr   	set_shape
reduce_any)r   r   rD   r   r   reduction_axisrq   outputs_shaper   r   r   	multi_hot   s0   


r   c                 C   s   | }|}t | d}|r| j}d}t | do%t| tjjtjf o%| jj|ko(| }|r=t	| jj
dks5J | jj
d }d}|rQ|sC|rQtjd| d| dd	d
 ||fS )zCRetrieves logits tensor from maybe-softmax or maybe-sigmoid tensor.r   Topr   r   z"`zK` received `from_logits=True`, but the `output` argument was produced by a zB activation and thus does not represent logits. Was this intended?r)   )
stacklevel)hasattrr   r   r   __internal__EagerTensorVariabler   typer_   rn   warningswarn)r   from_logitsop_typefn_nameoutput_from_logits_has_keras_logitsfrom_expected_op_typer   r   r   _get_logitsB  s2   


r   c                 C   s  t | } t |}t| jdk rtd| j d|j t| jt|jkr3td| j d|j t| j|jD ]\}}|durV|durV||krVtd| j d|j q:t||dd\}}|rkt jj| ||d	S |t j	||d
d }t 
|t dt  }t 	| t j| | S )a  Categorical crossentropy between an output tensor and a target tensor.

    Args:
        target: A tensor of the same shape as `output`.
        output: A tensor resulting from a softmax
            (unless `from_logits` is `True`, in which
            case `output` is expected to be the logits).
        from_logits: Boolean, whether `output` is the
            result of a softmax, or is a tensor of logits.
        axis: Int specifying the channels axis. `axis=-1` corresponds to data
            format `channels_last`, and `axis=1` corresponds to data format
            `channels_first`.

    Returns:
        Output tensor.

    Example:

    >>> a = tf.constant([1., 0., 0., 0., 1., 0., 0., 0., 1.], shape=[3,3])
    >>> print(a)
    tf.Tensor(
      [[1. 0. 0.]
       [0. 1. 0.]
       [0. 0. 1.]], shape=(3, 3), dtype=float32)
    >>> b = tf.constant([.9, .05, .05, .05, .89, .06, .05, .01, .94],
    ...                 shape=[3, 3])
    >>> print(b)
    tf.Tensor(
      [[0.9  0.05 0.05]
       [0.05 0.89 0.06]
       [0.05 0.01 0.94]], shape=(3, 3), dtype=float32)
    >>> loss = categorical_crossentropy(a, b)
    >>> print(np.around(loss, 5))
    [0.10536 0.11653 0.06188]
    >>> loss = categorical_crossentropy(a, a)
    >>> print(np.around(loss, 5))
    [0. 0. 0.]
    r   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=, output.shape=WArguments `target` and `output` must have the same rank (ndim). Received: target.shape=NQArguments `target` and `output` must have the same shape. Received: target.shape=Softmaxcategorical_crossentropy)labelsr   rD   Tr[   r   )r   r   r_   rE   rF   zipr   r	   !softmax_cross_entropy_with_logitsr`   rM   r   epsilonr    log)targetr   r   rD   e1e2r   r   r   r   e  sP   
'
r   c                 C   sl  |dkr|t |jd krtd| t||dd\}}t| } tj| dd} t|}t | jt |jkrF| jd dkrFtj| dd} t |jdk rUtd	|j t | jt |jd
d krotd| j d|j t| j|jd
d D ]\}}|d
ur|d
ur||krtd| j d|j qz|st	|t
 dt
  }tj|}tjj| |d}|S )aN  Categorical crossentropy with integer targets.

    Args:
        target: An integer tensor.
        output: A tensor resulting from a softmax
            (unless `from_logits` is True, in which
            case `output` is expected to be the logits).
        from_logits: Boolean, whether `output` is the
            result of a softmax, or is a tensor of logits.
        axis: Int specifying the channels axis. `axis=-1` corresponds to data
            format `channels_last`, and `axis=1` corresponds to data format
            `channels_first`.

    Returns:
        Output tensor.
    r   r   z4Only axis=-1 is currently supported. Received: axis=r   sparse_categorical_crossentropyr   r   rT   zBArgument `output` must be at least rank 1. Received: output.shape=NzRArgument `output` must have rank (ndim) `target.ndim - 1`. Received: target.shape=r   zcArguments `target` and `output` must have the same shape up until the last dimension: target.shape=r   r   )r_   rE   rF   r   r   r   r   r   r   rM   r   r   r    r   r	   (sparse_softmax_cross_entropy_with_logits)r   r   r   rD   r   r   resultr   r   r   r     sZ   

"r   c                 C   s   t | } t |}t| jt|jkr td| j d|j t| j|jD ]\}}|durC|durC||krCtd| j d|j q't||dd\}}|rWt jj| |dS t 	|t
 dt
  }| t j| }|d	|  t jd	|  7 }| S )
ap  Binary crossentropy between an output tensor and a target tensor.

    Args:
        target: A tensor with the same shape as `output`.
        output: A tensor.
        from_logits: Whether `output` is expected to be a logits tensor.
            By default, we consider that `output`
            encodes a probability distribution.

    Returns:
        A tensor.
    r   r   Nr   Sigmoidbinary_crossentropyr   r   r   )r   r   r_   rE   rF   r   r   r	   !sigmoid_cross_entropy_with_logitsrM   r   r   r    r   )r   r   r   r   r   bcer   r   r   r     sB   

r   c                 C   s   d}t | j}|dv rd}t| d} |rt| ||\}}nt| ||\}}|rHt|tjj	tjj
}t|tjj	tjj
}t||}t||}||fS )NF)float16bfloat16Tr   )r   r   r   r   _compute_moments_sync_compute_momentsr   rM   r   minmax)r   axesr[   synchronized	need_cast	ori_dtypemeanvariancer   r   r   moments'  s   


r  c                 C   s   t j }|st| ||S t j| dd}t j| |dd}t jt | |dd}t j||dd}|t jjj	|}|t jjj	|}|t jjj	|}	t j
||	}
t j
||	}t |t |
 d}|sqt |
|}
t ||}|
|fS )Ncount)nameTrZ   r   )r   
distributeget_replica_contextr   	ones_liker`   r/   
all_reduceReduceOpSUMr    divide_no_nanr?   r   )r   r  r[   replica_ctxlocal_count	local_sumlocal_squared_sumy_sumy_squared_sum	count_sumr  y_squared_meanr  r   r   r   r   >  s&   

r   c                 C   s   t jj| ||dS )Nr   )r   r	   r  )r   r  r[   r   r   r   r   ^  rR   r   MbP?c                 C   s~   |dkr3dgt | j }|jd ||< t||}t||}|d ur)t||}|d ur3t||}tjj| |||||dS )Nr   r   r   )r   r  r  offsetscalevariance_epsilon)r_   rE   r   rU   r	   batch_normalization)r   r  r  rD   r  r  r   rE   r   r   r   r  b  s"   r  c                 C   sl   t | } t |}tj| dd} t|jd}|dkrdn|}t||}tjj| ||||dd}t||S )Nint32r   r   float64F)r   r   label_lengthlogit_lengthblank_indexlogits_time_major)r   r   r   r   result_typer   r	   ctc_loss)r   r   target_lengthoutput_length
mask_indexresult_dtypecompute_dtypelossr   r   r   r%  y  s   r%  greedyd   c                 C   s  t | } t| }|d |d }}	t| d} t| jd}
t| |
} t |dd}|dkr<tjj	| |||d\}}nC|d	krw|d urj| d
d |f }| d
||d f }| d
|d d f }tj
|||gdd} tjj| |||d\}}ntd| dg }|D ]}t|j|j||	f}|tjj|dd qtj|dd}t|d}|d	kr|d ur|dk r||d  }t||k|d |}||fS )Nr   r   )r   r   r)   r   r  r   r,  )rn   sequence_lengthmerge_repeatedr"  beam_search.r   rT   )rn   r.  
beam_width	top_pathszInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)sp_inputrQ   )r   r   rE   rm   r   r$  r   r   r	   ctc_greedy_decoderr   ctc_beam_search_decoderrF   r   r   r   appendr   to_densestackr   )rn   sequence_lengthsstrategyr1  r2  r/  r(  r   num_samples	num_stepsr   decodedscoresinputs_beforeinputs_maskinputs_afterdecoded_densestr   r   r   
ctc_decode  sX   	


rD  c                 C   sp   ddl m} | j|jkrtd| j d|j dt||jd}tt| | }d|| d||  }|S )	Nr   )log10zInput shapes z and z" must match for PSNR calculation. r      
   )	"keras.src.backend.tensorflow.numpyrE  rE   rF   r   r   r   reduce_meanr/   )rH   rI   max_valrE  msepsnrr   r   r   rL    s   rL  c                 C   s,   t | } | dkrdnd}tj|d | dS )Nr   g    @g̓$Ggffffffr   )r   r   r   r   )r   valr   r   r   _get_large_negative  s   
rN  c                 C   s   |d u r|s| S t j| dd}|d urt ||}|rIt | }|d |d }}t jt ||fddd}|d d d d d d f }t ||}t || t| j	}|S )Nr   r   r)   rk   r   r   )
r   r  logical_andrE   linalg	band_partonesr   rN  r   )r   mask	is_causalcombined_masklogits_shapeTSpadded_logitsr   r   r   _apply_masks  s   
rZ  c                 C   s   t | jd}tjd| |dd}t||}t|t||j}|d ur0t|t||j}t|||}	t |	jd}
ttj	j
t|	|
dd|j}tjd||ddS )Nr   zBTNH,BSNH->BNTSoptimal)optimizer   rT   zBNTS,BSNH->BTNH)r   r$  r   r   einsumr   multiplyaddrZ  r	   rV   )querykeyvaluebiasrS  rT  r  logits_dtyper   rY  probs_dtypeprobsr   r   r   _dot_product_attention_xla  s   rg  c	           
      C   s   |d u rd}|rt dt| } t|}t|}t| jdkr0t d| j d|j d|j dt|d }	|d u rFd	tt|	d
 n|}t| ||||||S )NFz7Flash attention is not supported in tensorflow backend.r-   zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=rl   r   r   r   )rF   r   r_   rE   r   r.   r   rg  )
r`  ra  rb  rc  rS  r  rT  flash_attentionattn_logits_soft_capHr   r   r   dot_product_attention  s0   "rk  )r   )r-   )r4   )r   )T)r   )Nrs   N)r   rs   Nr   )r   rs   NNr   )r   NF)Fr   )F)FF)NNr  )r   )r,  r-  r   Tr   )NNNFNN)@r    r   
tensorflowr   	keras.srcr   &keras.src.backend.common.backend_utilsr   !keras.src.backend.tensorflow.corer   r   r
   r   r   r   r   r!   r#   r$   r(   r+   r,   r2   r3   r6   r8   r9   r:   r<   r>   rB   rJ   rN   rP   r'   rV   rW   ri   rp   rr   r{   r   rz   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r%  rD  rL  rN  rZ  rg  rk  r   r   r   r   <module>   s    	














#
+
B
B

(
$"
#
S
?
0 


A