
    &Vfi                        d dl Z d dlmc 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 Zd Zd Zd Zd Zd Zd Zd Zd=dZd Zd Zd>dZd Z d?dZ!d@dZ"d@dZ#	 dAd!Z$	 dAd"Z%d# Z&d$ Z'd% Z(	 	 	 dBd'Z)	 	 	 dBd(Z*	 	 	 	 dCd)Z+	 	 	 	 dCd*Z,	 	 	 	 dCd+Z-	 	 	 	 	 dDd,Z.dEd/Z/dEd0Z0dFd1Z1dFd2Z2dGd3Z3dHd4Z4	 dId6Z5	 dJd7Z6	 	 dKd8Z7	 	 	 	 	 dLd;Z8d< Z9dS )M    N)backend)tree)-compute_conv_transpose_padding_args_for_torch)cast)convert_to_tensor)
get_device)expand_dims)maximum)where)standardize_tuplec                 H    t          |           } t          j        |           S N)r   tnnreluxs    W/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/backend/torch/nn.pyr   r          !A8A;;    c                 H    t          |           } t          j        |           S r   )r   r   relu6r   s    r   r   r      s    !A9Q<<r   c                 H    t          |           } t          j        |           S r   )r   r   sigmoidr   s    r   r   r      s    !A;q>>r   c                 H    t          |           } t          j        |           S r   )r   r   tanhr   s    r   r   r   !   r   r   c                 H    t          |           } t          j        |           S r   )r   r   softplusr   s    r   r   r   &       !A<??r   c                 H    t          |           } t          j        |           S r   )r   r   softsignr   s    r   r    r    +   r   r   c                 H    t          |           } t          j        |           S r   )r   r   silur   s    r   r"   r"   0   r   r   c                 H    t          |           } t          j        |           S r   )r   r   
logsigmoidr   s    r   log_sigmoidr%   5   s    !A>!r   皙?c                 L    t          |           } t          j        | |          S )N)negative_slope)r   r   
leaky_relu)r   r(   s     r   r)   r)   :   s$    !A>!N;;;;r   c                 H    t          |           } t          j        |           S r   )r   r   hardsigmoidr   s    r   hard_sigmoidr,   ?   s    !A?1r   c                 H    t          |           } t          j        |           S r   )r   r   	hardswishr   s    r   	hard_silur/   D   s    !A=r         ?c                 J    t          |           } t          j        | |          S r   )r   r   elu)r   alphas     r   r2   r2   I   s!    !A71er   c                 H    t          |           } t          j        |           S r   )r   r   selur   s    r   r5   r5   N   r   r   Tc                 x    t          |           } |rt          j        | d          S t          j        |           S )Nr   )approximate)r   r   gelu)r   r7   s     r   r8   r8   S   s:    !A /xv....8A;;r   c                    t          |           } t          j        | j                  }t	                      dk    r-t          j        | j                  dk    rt          | d          } |Gt          j        | dg          }t          j	        |d          }t          j        || j
                  }nt          j	        | |          }t          ||          S Ncpufloat16float32r9   dim)r   r   standardize_dtypedtyper   r   torchreshaper   softmaxshaper   axisrB   outputs       r   rE   rE   [   s    !A%ag..E 	%ag..);;I| q2$''V,,,vqw//QD)))r   c                    t          |           } t          j        | j                  }t	                      dk    r-t          j        | j                  dk    rt          | d          } |Gt          j        | dg          }t          j	        |d          }t          j        || j
                  }nt          j	        | |          }t          ||          S r;   )r   r   rA   rB   r   r   rC   rD   r   log_softmaxrF   rG   s       r   rK   rK   o   s    !A%ag..E 	%ag..);;I| q2$''R000vqw//---r      c                 F    ||dz
  z  | dz
  |z  z
  }|dz  }|dz   dz  }||fS )z+Compute padding length along one dimension.rL       )input_lengthkernel_lengthstridedilation_ratetotal_padding_lengthleft_paddingright_paddings          r   _compute_padding_lengthrW      sK    
 	*+|a/?6.II  (1,L)A-!3M-((r   c                    | j         dd         }t          |          }d}t          |          D ]q}|dk    r&t          ||         ||         ||                   }	d}
n=t	          ||d          }t          ||         ||         ||         ||                   }	d}
|	f|z   }rt          d |D                       r| d	 |D             fS t          d
 |D                       }t          j        | ||
          dfS )aZ  Apply same padding to the input tensor.

    This function will evaluate if the padding value is compatible with torch
    functions. To avoid calling `pad()` as much as possible, which may cause
    performance or memory issues, when compatible, it does not apply the padding
    to the tensor, but returns the input tensor and the padding value to pass to
    the torch functions. If not compatible, it returns the padded tensor and 0
    as the padding value.

    Returns:
        tensor: A padded tensor or the inputs.
        padding: The padding value, ready to pass to the torch functions.
    rN   NrO   pooling	replicaterS   constantc                      g | ]\  }}||k    S rO   rO   ).0leftrights      r   
<listcomp>z'_apply_same_padding.<locals>.<listcomp>   s     555kdEDEM555r   c                     g | ]\  }}|S rO   rO   )r]   r^   _s      r   r`   z'_apply_same_padding.<locals>.<listcomp>   s    444q444r   c              3   $   K   | ]}|D ]}|V  d S r   rO   )r]   left_and_rightvalues      r   	<genexpr>z&_apply_same_padding.<locals>.<genexpr>   sG          05      r   )padmoder   )	rF   lenrangerW   r   alltupler   rg   )inputskernel_sizestridesoperation_typerS   spatial_shapenum_spatial_dimspaddingipadding_sizerh   flattened_paddings               r   _apply_same_paddingrw      sR     L$M=))G#$$ , ,Y&&2a +a.'!* L DD-/ M 3a +a.'!*mA>N L D/G+
55W55566 544G44444  $+     760t<<<a??r   c                     | j         dz
  }|dk    rt          j        | d          } nP|dk    rt          j        | d          } n4|dk    rt          j        | d          } nt          d| j         d          | S )	NrN   rL   r   rN   rL   )r      rL   rN   rz   )r      rL   rN   rz   z^Inputs must have ndim=3, 4 or 5, corresponding to 1D, 2D and 3D inputs. Received input shape: .)ndimrC   permute
ValueErrorrF   )rm   rr   s     r   _transpose_spatial_inputsr      s    {Q 1vy11	Q		v|44	Q		v775%+\5 5 5
 
 	

 Mr   c                     t          | j                  dz
  }|dk    rt          j        | d          } n7|dk    rt          j        | d          } n|dk    rt          j        | d          } | S )NrN   rL   ry   )r   rN   rz   rL   rz   )r   rN   rz   r{   rL   ri   rF   rC   r~   )outputsrr   s     r   _transpose_spatial_outputsr      st    7=))A-1-33	Q		-66	Q		-99Nr   c                     t          | j                  dz
  }|dk    rt          j        | d          } n7|dk    rt          j        | d          } n|dk    rt          j        | d          } | S )NrN   rL   )rN   rL   r   )rz   rN   r   rL   rz   )r{   rz   r   rL   rN   r   )kernelrr   s     r   _transpose_conv_kernelr      sv     6<((1,1vy11	Q		v|44	Q		v77Mr   validc                    t          |           } | j        dz
  }t          ||d          }||}nt          ||d          }t          j        |          }|dk    rt          |           } |dk    rt          | ||d          \  } }nd}t                      }|d	k    r!t          j	        | j
        | j        d
          } |dk    rt          j        | |||          }nV|dk    rt          j        | |||          }n7|dk    rt          j        | |||          }nt!          d| j
         d          |                    |          }|dk    rt%          |          }|S )NrN   	pool_sizero   channels_lastsamerY   )rp   r   metar<   )sizerB   devicerL   )rn   rR   rs   rz   lInputs to pooling op must have ndim=3, 4 or 5, corresponding to 1D, 2D and 3D inputs. Received input shape: r|   )r   r}   r   r   standardize_data_formatr   rw   r   rC   emptyrF   rB   r   
max_pool1d
max_pool2d
max_pool3dr   tor   )rm   r   ro   rs   data_formatrr   r   r   s           r   max_poolr      s    v&&F{Q!)-={KKI#G-=yII1+>>Ko%%*622& .Iwy
 
 
 \\F V\%
 
 
 1.	'7
 
 
 
Q		.	'7
 
 
 
Q		.	'7
 
 
 5%+\5 5 5
 
 	
 jj  Go%%,W55Nr   c                 h   t          |           } | j        dz
  }t          ||d          }||}nt          ||d          }t          j        |          }|dk    rt          |           } d}|dk    r| j        dd          }t          |          }g }g }t          |          D ]Y}	t          ||	         ||	         ||	                   }
|
                    |
d                    |
d         |
d         k    rddg|z   }Zt          |          dk    rt          j        | |          } |dk    rt          j        | |||d	          }nX|dk    rt          j        | |||d	          }n8|d
k    rt          j        | |||d	          }nt!          d| j         d          |dk    rt#          |          }|S )NrN   r   ro   r   r   r   rL   F)rn   rR   rs   count_include_padrz   r   r|   )r   r}   r   r   r   r   rF   ri   rj   rW   appendr   rg   
avg_pool1d
avg_pool2d
avg_pool3dr   r   )rm   r   ro   rs   r   rr   padding_valuerq   uneven_paddingrt   ru   r   s               r   average_poolr   %  s0    v&&F{Q!)-={KKI#G-=yII1+>>Ko%%*622M&QRR(}--'(( 	9 	9A2a )A,
 L   a111A,q/11 #$Q.!8~""WV^44F1.!!#
 
 
 
Q		.!!#
 
 
 
Q		.!!#
 
 
 5%+\5 5 5
 
 	

 o%%,W55Nr   c                 @   t          |           } t          |          }| j        dz
  }t          ||d          }t          j        |          }|dk    rt          |           } t          |          }|dk    rOt          d t          j	        |          D                       r$t          | |j        dd          |d|          \  } }| j        d         }|j        d         }||z  d	k    rt          d
| j         d|j                   ||z  }	|dk    rt          j        | ||||	|          }
nZ|dk    rt          j        | ||||	|          }
n9|dk    rt          j        | ||||	|          }
nt          d| j         d          |dk    rt#          |
          }
|
S )NrN   ro   r   r   c              3   "   K   | ]
}|d k    V  dS )rL   NrO   )r]   ds     r   rf   zconv.<locals>.<genexpr>  s&       G GAa G G G G G Gr   conv)rp   rS   rL   r   zaThe number of input channels must be evenly divisible by kernel.shape[1]. Received: inputs.shape=z, kernel.shape=)rR   dilationgroupsrs   rz   zrInputs to conv operation should have ndim=3, 4, or 5,corresponding to 1D, 2D and 3D inputs. Received input shape: r|   )r   r}   r   r   r   r   r   anyr   flattenrw   rF   r   r   conv1dconv2dconv3dr   )rm   r   ro   rs   r   rS   rr   channelskernel_in_channelsr   r   s              r   r   r   q  s1    v&&Fv&&F{Q)99EEG1+>>Ko%%*622#F++F&S G Gg1F1F G G GGG .L!'
 
 
 |AHa$$q((+7=|+ +"L+ +
 
 	

 ++F1*"
 
 
 
Q		*"
 
 
 
Q		*"
 
 
 &l& & &
 
 	
 o%%,W55Nr   c                     t          |          }t          j        ||j        d d         d|j        d         |j        d         z  fz             }t	          | |||||          S )NrL   r9   )r   rC   rD   rF   r   )rm   r   ro   rs   r   rS   s         r   depthwise_convr     si     v&&F]SbS!QR(86<;K(K$LL F +}MMMr   c                 T    t          | |||||          }t          ||dd||          S )NrL   r   )ro   rs   r   rS   )r   r   )rm   depthwise_kernelpointwise_kernelro   rs   r   rS   depthwise_conv_outputs           r   separable_convr     sQ     +  #   r   c                    t          |           } t          |          }| j        dz
  }t          ||d          }t          j        |          }t          | j        |j        ||||          \  }}	|dk    rt          |           } t          |          }|j        dd          }
t          |t                    r|gt          |
          z  }|dk    rt          j        | ||||	|          }nZ|dk    rt          j        | ||||	|          }n9|dk    rt          j        | ||||	|          }nt!          d| j         d	          |dk    rt#          |          }|S )
NrN   ro   )input_shapekernel_shapero   rs   output_paddingrS   r   rL   )rR   rs   r   r   rz   z|Inputs to conv transpose operation should have ndim=3, 4, or 5,corresponding to 1D, 2D and 3D inputs. Received input shape: r|   )r   r}   r   r   r   r   rF   r   r   
isinstanceintri   r   conv_transpose1dconv_transpose2dconv_transpose3dr   r   )rm   r   ro   rs   r   r   rS   rr   torch_paddingtorch_output_paddingkernel_spatial_shaper   s               r   conv_transposer     s    v&&Fv&&F{Q)99EEG1+>>K 	6L\%#	 	 	 o%%*622#F++F!<+-%% D&#.B*C*CC1&!/"
 
 
 
Q		&!/"
 
 
 
Q		&!/"
 
 
 &l& & &
 
 	

 o%%,W55Nr   r>   Fc                    |rt          d          t          | t          j                  } t	          j        t          | d          |          }t          t          | d          dk    |d          }t          ||          }|	                                }|dk    rb||k    r\t          t          |                    }d||<   t          |dz   |          D ]}||xx         dz  cc<   |                    |          }|S )N2Unsupported value `sparse=True` with torch backendrB   r   r9   rH   rL   )r   r   rC   longr   one_hotr
   r   r	   r@   listrj   r~   )	r   num_classesrH   rB   sparserI   dimsnew_axes_orderaxs	            r   r   r   /  s    OMNNN 	!5:...A [A44F;qr***a/;;FvU333F::<<DrzzddlleDkk**!tq$'' 	$ 	$B2!#//Mr   c                     |rt          d          t          |           } t          | j                  dk    rdnd}t	          j        t          t          | d          |||          |          }|S )Nr   rL   r   int32)rH   rB   r?   )r   r   ri   rF   rC   amaxr   r   )r   r   rH   rB   r   reduction_axisr   s          r   	multi_hotr   H  s     OMNNN!Aag,,**QQNjQ  +DFFF  G Nr   c                 B   t          |           } t          |          }| j        |j        k    rt          d| j         d|j                   t          | j                  dk     rt          d| j         d|j                   |rt	          j        ||          }ni|t          j        ||d          z  }t          j        |t          j
                    dt          j
                    z
            }t          j        |          }t          j        | |z  |           S )	NQArguments `target` and `output` must have the same shape. Received: target.shape=, output.shape=rL   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=r?   Tr@   keepdimr0   )r   rF   r   ri   r   rK   rC   sumclipr   epsilonlogtargetrI   from_logitsrH   log_probs        r   categorical_crossentropyr   T  sE   v&&Fv&&F|v|##H"LH H9?H H
 
 	

 6<1H"LH H9?H H
 
 	
  %?6t444%)FdCCCCFGO$5$5sW_=N=N7NOO9V$$Ifx'T22222r   c                 6   t          | t          j                  } t          |          }t          | j                  t          |j                  k    r'| j        d         dk    rt          j        | d          } t          |j                  dk     rt          d|j                   | j        |j        d d         k    rt          d| j         d|j                   |rt          j        ||          }ni|t          j	        ||d	          z  }t          j
        |t          j                    d
t          j                    z
            }t          j        |          }t          | |j        |         |          } t          j	        | |z  |           S )Nr   r9   rL   r?   zBArgument `output` must be at least rank 1. Received: output.shape=zcArguments `target` and `output` must have the same shape up until the last dimension: target.shape=r   Tr   r0   r   )r   rC   r   ri   rF   squeezer   r   rK   r   r   r   r   r   r   r   s        r   sparse_categorical_crossentropyr   n  s   vUZ888Fv&&F
6<C----&,r2Ba2G2Gv2...
6<1+"L+ +
 
 	

 |v|CRC(((H"LH H9?H H
 
 	

  %?6t444%)FdCCCCFGO$5$5sW_=N=N7NOO9V$$VV\$/d;;;FIfx'T22222r   c                 r   t          |           } t          |          }| j        |j        k    rt          d| j         d|j                   |rt          j        || d          S t          j        |t          j                    dt          j                    z
            }t          j	        || d          S )Nr   r   none)	reductionr0   )
r   rF   r   r    binary_cross_entropy_with_logitsrC   r   r   r   binary_cross_entropy)r   rI   r   s      r   binary_crossentropyr     s    v&&Fv&&F|v|##H"LH H9?H H
 
 	
  J3Ff
 
 
 	
 FGO$5$5sW_=N=N7NOO'&IIIIr   c                 V   |rt          d          t          |           } d}t          j        | j                  }|dk    rd}t          | d          } t          j        | |d          }t          j        t          j        |           |d          t          j        |          z
  }|s*t          j	        ||          }t          j	        ||          }|rt          j
        |t          j        t          j                  j        t          j        t          j                  j                  }t          j
        |t          j        t          j                  j        t          j        t          j                  j                  }t          ||          }t          ||          }||fS )Nz9Argument synchronized=True is not supported with PyTorch.Fr=   Tr>   r   )NotImplementedErrorr   r   rA   rB   r   rC   meansquarer   r   finfor=   minmax)r   axeskeepdimssynchronized	need_cast	ori_dtyper   variances           r   momentsr     s    
!G
 
 	
 	!A I)!'22II	I:aT4000D zQT4  TH  1}T4((=400 -zK&&*K&&*
 

 :K&&*K&&*
 

 D)$$),,>r   MbP?c                    t          |           } t          |          }t          |          }dgt          | j                  z  }|j        d         ||<   t          j        ||          }t          j        ||          }|%t          |          }t          j        ||          }nt          j        |          }|%t          |          }t          j        ||          }nt          j        |          }|                     |                              |	                    |          
                                                    |                                        |          S )NrL   r   )r   ri   rF   rC   rD   
zeros_like	ones_likesubtractmul_addrsqrt_muladd_)r   r   r   rH   offsetscaler   rF   s           r   batch_normalizationr    s/    	!AT""D **HC#ag,,E*Q-E$K=u%%D}Xu--H"6**vu--!$''!%((eU++)) 	


4	hll7##**,,0077	8	8	fr   c                 ^   t          |           } t          |          }t          |          }t          |          }t          j        |j        d          }t	          ||          }t          j        |dd          }t          j        |d          }t          j	        || |||d          }|S )Nr>   rL   r   r9   r?   r   )blankr   )
r   r   result_typerB   r   rC   	transposer   rK   ctc_loss)r   rI   target_lengthoutput_length
mask_indexrB   logitslosss           r   r  r    s     v&&Fv&&F%m44M%m44M i88E&%  F_VQ**F_V,,,F<  D Kr   c                    t          |           } t          |d          }| j        \  }}}||dz
  }t          j        | d          }t	          |d          }t          j        | d          d         }t          j        ||j                  d d d f         }	|	|d d d f         k    }	t          j        |	||          }t          j        |	d|          }|rI|d d dd f         |d d d df         k    }
t          j
        |
d	          }
t          j        |
||          }||k    }t          j        t          j        ||j                  d
          }t          j        ||df          }t          j        |||          }t          j        |d
          }t          j        ||d
          }t          j        |d|          }t          j        |d          d d d f          }t          j        |d
          }||fS )Nr   r   rL   r9   r   r   )r   g        )rL   r   r   r   r?   )r   rF   rC   argmaxr   r   aranger   r   r   rg   	unsqueezetileargsorttake_along_dimr   )rm   sequence_lengthmerge_repeatedr  
batch_size
max_lengthr   indicesscoresseqlen_maskrepeatinvalid_maskorders                r   _ctc_greedy_decoder"    s    v&&F'wGGGO*0,'J
K 1_
l6+++G7G$$GYvB'''*F,z'.AAA$'JKD!99Kk+z7;;G[c622F ;ABB7111crc6?2..+fj':: j(LOZ777Q  E Juz1o..EKj%88EM%R(((E"7Er:::G k,G44GiQ'''400Fog1---GF?r   greedyd   c                     t          |           } t          j        | j        d          }t	          | |          } |dk    rt          | |||          S |dk    rt          d          t          d| d          )Nr>   r#  )r  r  beam_searchzKTorch backend doesn't yet support the beam search strategy for CTCdecoding.zInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)r   r   r	  rB   r   r"  r   r   )rm   r  strategy
beam_width	top_pathsr  r  rB   s           r   
ctc_decoder*  5  s     v&&Fi88E&%  F8!)!	
 
 
 	
 
]	"	"!
 
 	

 * * * *
 
 	
r   c                 `   | j         |j         k    r t          d| j          d|j          d          t          |           t          |          }} t          || j                  }t	          j        | |z
  dz            }dt	          j        |          z  dt	          j        |          z  z
  }|S )NzInput shapes z and z" must match for PSNR calculation. r   rN      
   )rF   r   r   rB   rC   r   log10)x1x2max_valmsepsnrs        r   r3  r3  U  s    	x28+BH + +28 + + +
 
 	
 	"" 	B  rx888G
*b2g!^
$
$CG$$$rEK,<,<'<<DKr   )r&   )r0   )T)r9   )rL   )Nr   N)rL   r   NrL   )rL   r   NNrL   )r9   r>   F)Fr9   )F)FF)NNr   )r   )TN)r#  r$  rL   TN):rC   torch.nn.functionalnn
functionalr   	keras.srcr   r   &keras.src.backend.common.backend_utilsr   keras.src.backend.torch.corer   r   r   keras.src.backend.torch.numpyr	   r
   r   #keras.src.utils.argument_validationr   r   r   r   r   r   r    r"   r%   r)   r,   r/   r2   r5   r8   rE   rK   rW   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r*  r3  rO   r   r   <module>r<     sE    ! ! ! ! ! ! ! ! !                  . - - - - - : : : : : : 3 3 3 3 3 3 5 5 5 5 5 5 1 1 1 1 1 1 / / / / / / A A A A A A  
  
  
  
  
  
  
  
< < < <
  
  
   
  
      (   * 89	) 	) 	) 	) AB*@ *@ *@ *@Z  &	 	 	
 
 
  : : : :@ I I I I^ I I I I^ N N N N&    < E E E EP   2	 	 	 	3 3 3 343 3 3 3:J J J J** * * *\ ?C   F    @ 	* * * *` 
 
 
 
@    r   