o
    2h7                     @   s<  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lm	Z	 d dlm
Z
 d dlmZ d	d
 Zd;ddZd;ddZd<ddZdd Zd;ddZd=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(d)Z	d?d+d,Z		*	d@d-d.Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!dAd7d8Z"d9d: Z#dS )B    N)config)standardize_dtype)dtypes)cast)convert_to_tensor)
get_device)padc                 C   s   t t j| jdd  t d }||j| j t j	}|p't
t |}t |dk||}t ||k ||}|d ft| jdd   }|dkr[t j|dt itd  }n	t j|dt i}|d||  |}|d ddf }|| jS )	N   )devicer   amaxr
   Inf.)torchprodtensorshaper   longrepeat_interleaveviewtypeint64lenuniquewheretupleonesfloatzerosscatter_reducedtype)datasegment_idsreduction_methodnum_segmentsnum_repeatsr   result r&   W/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/torch/math.py_segment_reduction_fn   s0   
r(   Fc                 C      t | } t |}t| |d|S )Nsumr   r(   r    r!   r#   sortedr&   r&   r'   segment_sum7      r.   c                 C   r)   )Nr   r+   r,   r&   r&   r'   segment_max=   r/   r0   Tc                 C   s   t | } tj| ||dS )N)r-   )r   r   topk)xkr-   r&   r&   r'   top_kC   s   r4   c                 C   sZ   t | tj} | d d d f } t |}t||j}tj|| dd}||k}tj|ddS )Nr   dim)axis)r   r   r   r   r4   valuestake_along_dimany)targetspredictionsr3   topk_valuestargets_valuesmaskr&   r&   r'   in_top_kH   s   r@   c                 C   s4   t | } |d u rtt|  n|}tj| ||dS )N)r6   keepdim)r   r   ranger6   r   	logsumexp)r2   r7   keepdimsr&   r&   r'   rC   R   s   rC   reducedc                 C   s6   t | } |dvrtd| t | } tjj| |dS )N>   rE   completez]`mode` argument value not supported. Expected one of {'reduced', 'complete'}. Received: mode=)mode)r   
ValueErrorr   linalgqr)r2   rG   r&   r&   r'   rJ   X   s   rJ   c                 C   s   t | } tj| d||dS )Nr   )	dimensionsizestep)r   r   unfold_copy)r2   sequence_lengthsequence_strider&   r&   r'   extract_sequencesd   s   rQ   c           
      C   s~  t | } | j^ }}}||krtd| d| ||| k r,td| d| d| t|}t| |||f} ||d  | }d|d |  }|| }tjj	| d|| ddddf} t| ||||f} t
| d} tjj	| ddd|ddddf} | jd d }	t| |d	f} | d d d ||	 | f } t| |||	| f} tj| dd
d d d |f } t| t|d S )NzQ`sequence_stride` must equal or less than x.shape[-1]. Received: sequence_stride=z, x.shape[-1]=zb`sequence_stride` must equal or greater than x.shape[-1] / x.shape[-2]. Received: sequence_stride=z, x.shape[-2]=r	   r   )r      r	      rR   r   r5   )r   )r   r   rH   mathr   r   reshapenn
functionalr   permuter*   r   )
r2   rP   batch_shapenum_sequencesrO   flat_batchsizeoutput_sizenstep_per_segmentpadded_segment_lenshrinkedr&   r&   r'   _overlap_sequencesk   sR   
 r`   c                 C   s   t | ttfrt| dkrtd|  | \}}t|}t|}|j|jkr2td|j d|j t|r<t|sDtd|  dt	||}|S )NrR   zLInput `x` should be a tuple of two tensors - real and imaginary.Received: x=zInput `x` should be a tuple of two tensors - real and imaginary.Both the real and imaginary parts should have the same shape. Received: x[0].shape = z, x[1].shape = zBAt least one tensor in input `x` is not of type float.Received: x=.)

isinstancer   listr   rH   r   r   r   is_floating_pointcomplex)r2   realimagcomplex_inputr&   r&   r'   _get_complex_tensor_from_tuple   s2   ri   c                 C   s    t | }tj|}|j|jfS N)ri   r   fftrf   rg   r2   rh   complex_outputr&   r&   r'   rk         rk   c                 C       t | }tj|}|j|jfS rj   )ri   r   rk   fft2rf   rg   rl   r&   r&   r'   rp      rn   rp   c                 C   ro   rj   )ri   r   rk   ifft2rf   rg   rl   r&   r&   r'   rq      rn   rq   c                 C   s(   t | } tjj| |ddd}|j|jfS Nr   backward)nr6   norm)r   r   rk   rfftrf   rg   )r2   
fft_lengthrm   r&   r&   r'   rv      s   rv   c                 C   s   t | }tjj||dddS rr   )ri   r   rk   irfft)r2   rw   rh   r&   r&   r'   rx      s   rx   hannc              	   C   s  t | jdvrtd| j ||k rtd| d| t|tr-|dvr-td| t| } |d urtt|trV|dkrJtj|d| jt	 d	}ntj
|d| jt	 d	}nt|| jd
}t|jdksk|jd |krstd|j ntj|f| jt	 d}d}| j^ }}	t| jdkrd}t|}
t| |
|	f} tj| |||||dd} |r| jdd  \}}t| g |||R } t| dd} | j| jfS )N>   float32float64zJInvalid input type. Expected `float32` or `float64`. Received: input type=zT`fft_length` must equal or larger than `sequence_length`. Received: sequence_length=z, fft_length=>   ry   hammingz]If a string is passed to `window`, it must be one of `"hann"`, `"hamming"`. Received: window=ry   Tperiodicr   r
   r   r	   r   PThe shape of `window` must be equal to [sequence_length].Received: window shape=)r   r
   FrR   )n_fft
hop_length
win_lengthwindowcenterreturn_complex)r   r   	TypeErrorrH   rb   strr   r   hann_windowr   hamming_windowr   r   r   rT   r   rU   stftswapaxesrf   rg   )r2   rO   rP   rw   r   r   winneed_unpackrY   samplesr[   fft_unique_binsrZ   r&   r&   r'   r      s   


	r   c              
   C   s  t | }|jj}d }	|d urIt|tr-|dkr"tj|d|t d}	ntj|d|t d}	nt	||d}	t
|	jdksA|	jd |krItd|	j ||kr|du r|	d urd}
|j^ }}}t
|jd	krud}
t|}t||||f}t|d
d}tj|||||	||dd} |
r| jd }t| g ||R } | S t| |} ||| jd
 d   }|	d ur|| d }|| | }t|	||ggd}	|| | }t|	}| |  }t|d|| | fg}t|||g}tj|ddd}t||dg}t||| g}t|	|d | }	t| |	} t| |} |du r!dn|d }|d ur/|| }n|du r:|d  }n|}| d||f S )Nry   Tr}   r   r	   r   r   FrS   r   )r   r   r   r   r   lengthr   rR   constantr   )rD   .)ri   rf   r   rb   r   r   r   r   r   r   r   r   rH   rT   r   rU   r   istftrx   r   squarer*   tiledividemultiplyr`   )r2   rO   rP   rw   r   r   r   rh   r   r   r   rY   rZ   r   r[   r   expected_output_lenl_padr_pad_sequence_lengthdenomoverlapsstartendr&   r&   r'   r     s   	











r   c                 C      t | } t| S rj   )r   r   rsqrtr2   r&   r&   r'   r        
r   c                 C   r   rj   )r   r   erfr   r&   r&   r'   r     r   r   c                 C   r   rj   )r   r   erfinvr   r&   r&   r'   r     r   r   c                 C   s   t | } t |}tj| |S rj   )r   r   rI   solve)abr&   r&   r'   r     r/   r   c                 C   sL   t | } t| jdkrt }nt| jt}t| |} t	j
j| |||dS )Nr   )ordr6   rA   )r   r   r   r   floatxr   result_typer   r   r   rI   ru   )r2   r   r7   rD   r   r&   r&   r'   ru     s   

ru   c                 C   r   rj   )r   r   logdetr   r&   r&   r'   r     r   r   )NF)T)rE   rj   )ry   T)Nry   T)NNF)$rT   r   keras.src.backendr   r   keras.src.backend.commonr   keras.src.backend.torch.corer   r   r   keras.src.backend.torch.numpyr   r(   r.   r0   r4   r@   rC   rJ   rQ   r`   ri   rk   rp   rq   rv   rx   r   r   r   r   r   r   ru   r   r&   r&   r&   r'   <module>   sH    
)




2


M
c

