o
    gim                     @   s  d dl Z d dlZd dlmZ d dlZd dlZd dlmZ d dlZe j	
dr.d dlZdd Ze j	
dr<d dlZdd	 Ze j	
d
rSd dlZdejd< d dlZdd Ze j	
dr]dd Ze j	
drqd dlmZ d dlZdd Ze j	
drd dlZdd Ze j	
drd dlmZ dd Ze j	
dre j	
drd dlZd dlmZ d dlZdd Ze j	
drd dlZd dlmZ d dl m!Z" dd  Z#dS dS )!    N)partial)assert_allcloseeinopsc               	   C   s  dd l } tjdd d}tjjddd}t| d|t	j
|d	d
d| t| d	|t	j
|d	d
d| t| d|t	j
|dd
d| t| d|t	j
|dd
d| t| jd|ddt	j
|ddddd| t| jd|dddt	j
|ddddd| tjjddd}t| d||t	||d| tjjddd}t| d||t	||d| tjjddd}tjjddd}tt	||gdd | d||| d S )Nr   c                 S      | S N xr   r   T/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/test/test_compare_libs.py<lambda>       z%test_compare_einops.<locals>.<lambda>to_numpy)      r      sizefloat32
b [s...] czb ... c -> b cmean)	reductionzb ([s])... czb h w c -> b 1 1 czb (s [ds])... c   )dszb (h h2) (w w2) c -> b h w csum)r   h2w2)r   r   )r       z... [c1], [c1] c2 -> ... c2z... c1, c1 c2 -> ... c2)r   r   @   zb [s...] c, [s...] s2 -> b s2 czb h w c, h w s2 -> b s2 cr   r   r      )r   r   r   za b *z!a b c d, a b e -> a b ((c d) + e))einxtypesSimpleNamespacenprandomuniformastyper   r   r   reducer   doteinsumpackid)r!   setupr	   wyr   r   r
   test_compare_einops   sh   



r0   torchc                  C   s  dd l } tjdd d}tddd}tdd}tt|d|| d	||| ttj	||dd
| d	||| tddd}tdd}tt|d|| d||| ttj	||dd
| d||| tddd}tdd}tt|d|| d||| ttj	||dd
| d||| tddd}tdd}tt
|d|| d||| tddd}tdd}tt
|d|| d||| tddd}tdd}tt
|d|| d||| td}tdd}tt||| d||| td}tdtj|jtjd tj}t||d |d |d f | d||| td}tj|g dd d
\}}}| jd!|dd"d#\}}	}
t||| t||	| t||
| d S )$Nr   c                 S   s   |     S r   )detachcpunumpyr   r   r   r
   r   Q   s    z$test_compare_torch.<locals>.<lambda>r   r   r   r   )   r   r   z[_] ..., i ... -> i ...)dim)r   r5   r      za [_] ..., a i ... -> a i ...r   r   r5   r   z#a b [_] ..., a b i ... -> a b i ...r5   [_] ..., i -> i ...a [_] ..., i -> a i ...a b [_] ..., i -> a b i ...)r5      r   z[_], ... -> ...r   r   r   r5   r   dtype.r   .r7   .r   [a...], b... [3] -> b...r   r5   )r   r       $a (b1 + b2 + b3) -> a b1, a b2, a b3r    b1b2)r!   r"   r#   r1   randrandintr   gatherget_attake_along_dimindex_selecttaketensorshaper   toint64splitr,   )r!   r-   r	   coordsindicesx1x2x3x1ex2ex3er   r   r
   test_compare_torchN   s   


$
ra   
tensorflowtrueTF_FORCE_GPU_ALLOW_GROWTHc                  C   sp  dd l } tjdd d}tjd}tjjddtjd}ttj||dd	| 	d
||| tjd}tjjddtjd}ttj||dd	| 	d||| tjd}tjjddtjd}ttj||dd	| 	d||| tjd}tjjddtjd}ttj||ddd| 	d||| tjd}tjjddtjd}ttj||ddd| 	d||| tjd}t
tjjdtjdt
t|tj tj}tt||| 	d||| t||d |d |d f | 	d||| tjd}t
tjjdtjdt
t|tj tj}tt||| 	d||| tjd}t
tjjdtjdt
t|tj tj}tt||| 	d||| tjd}t
tjjdtjdt
t|dd  tj tj}ttj||dd| 	d ||| tjd}t
tjjd!tjdt
t|dd  tj tj}ttj||dd| 	d"||| d S )#Nr   c                 S   s   |   S r   )r4   r   r   r   r
   r      s    z)test_compare_tensorflow.<locals>.<lambda>r   r>   r9   r   )maxvalrA   axisr:   r   r7   r;   r   r   r<   )r   r5   )
batch_dimsrg   za [_] ..., a i -> a i ...r8   za b [_] ..., a b i -> a b i ...r   r@   rE   rB   rC   rD   r?   )r5   r5   r   r   r   )rh   za [...], a [2] -> a)r   r5   r   za [...], a b [2] -> a b)r!   r"   r#   tfr%   r&   int32r   rO   rP   castr   rU   	gather_nd)r!   r-   r	   rY   r   r   r
   test_compare_tensorflow   s   0
0
0
88ro   r4   c                  C   s	  dd l } tjdd d}tjjdd}tjjdd}tt||| d||| tjjd	d}tjjd	d}tt||| d
||| tjjdd}tjjdd}tt||| d||| tjjdd}tjjdd}tt||| d||| tjjdd}tjjdd}tt||| d||| tjjd	d}tjjd	d}tt||| d
||| tjjdd}tjjdd}tt||| d||| tjjdd}tjjdd}ttj	||dd| d||| tjjdd}tjjdd}ttj	||dgdgfd| d||| ttj	||dd| d||| tjjdd}tjjdd}ttj	||dd| d||| tjjd	d}tjjd	d}tt
||| d||| tjjdd}tjjdd}tt
||| d||| tjjdd}tjjdd}tt||| d||| tjjd	d}tjjdd}tt||| d ||| tjjdd}tjjd!d}tt||| d"||| tjjdd}ttj|dd#| d$|| tjjdd}ttj|dd#| d%|| tjjdd}tt|| d%|| tjjdd}tt|| d$|| tjjdd}tjjdd}ttj||gd&d#| d'||| tjjdd}tjjdd}ttj||gd&d#| d(||| tjjd)d}tjjd*d}t| d+||tj|t|d d d d d f |jd d, |j gd&d#| t| d-||tj|t|d d d d d f |jd |jd |jd |jd, fgdd#| tjjd	d}tjjdd}ttj||d.d/| d0||| ttj||d1d/| d2||| tjjdd}tjjdd}ttd3||| d||| ttd4|| d%|| ttd5||| d6||| tjjd7d}ttd8|| d9|| tjjd!d}tjjd*dd d d f t|jd d d d d f  d:}t||d d df |d d df f | d;||| td<}t|| d=d>| t|| jd?d>d<d@| tjjdAd}tjjdBd}t|d d tjd d tjf |d d d d tjd d f  | dC||| tjjd)d}tt|dD| dE|| tjjdFd}tjjd	d}t|tjd d tjtjf |jd |jd |jd |jd, f}tj||gdd#}t|| d-||| tjjdd}tjjdd}t| dG||t|d d tjd d f |d d d d tjf  d& d&| tjjdHd}t| dI|t|tjd d tjf d<| t!"t# t|d< W d    n	1 sw   Y  tjjdJd}tj$|dKdLgd&d#\}	}
}| jdM|dKdNdO\}}}t|	|| t|
|| t||| tjjdPd}ttj%|dddQ| dR|| d S )SNr   c                 S   r   r   r   r   r   r   r
   r     r   z$test_compare_numpy.<locals>.<lambda>r   r   r   r   )r   r   za [b], [b] c -> a c)r   z[a], [a] ->)r=   r   r   )r=   r   r   z... a [b], ... [b] c -> ... a cri   z... [b], [b] -> ...)r    r    r   r   )r    r    r   r   z#x... [b], y... [b] c -> x... y... cr7   )axesr   r   r   )r    r   rG   r   za b [c], d [c] e -> a b d e)r   r7   rj   )r   r7   z[a] b, c [a] -> b czx... [a], y... [a] -> x... y...r   r   za b, a b -> a bza, b -> a b)r   r    za..., b... -> (a b)...rf   z[a] bza [b]rH   z..., ... -> ... (1 + 1)z... a, ... b -> ... (a + b)r   )rG   zb h w c1, c2 -> b h w (c1 + c2)r   zb c1 h w, c2 -> b (c1 + c2) h wij)indexingzx, y -> x y, x yxyzx, y -> y x, y xz	ab,bc->aczab->az
ab,bc->abcza b, b c -> a b c)r   r   zaa->aza a -> arl   z[x y], a [2] -> a)r   r   r    z-> 3 4 5g        z-> a...)a)r   r   )r   r   r    za c, a b d -> a b c d)r   r7   r   r   za b c d -> c b d a)r   r   r   r   zb [x], b [x] -> b)r   z
c -> 3 c 5rF   r   	   rI   r    rJ   )r   r   r   )axis1axis2za b b -> a b)&r!   r"   r#   r$   r%   r&   r   matmulr)   	tensordotinnermultiplyouterkronflipfliplrflipudstackr,   concatenatebroadcast_torU   meshgridr*   r   asarrayr'   rP   zerosnewaxisadd	transposesqueezepytestraises	ExceptionrX   diagonal)r!   r-   r	   r/   imgvecrY   
vec_as_imgoutr[   r\   r]   r^   r_   r`   r   r   r
   test_compare_numpy  s  















8H



@"

8

B>

r   jaxc                     s*  dd l } tjdd d}| jtjj}| jtjj}| jtjj	}t
tjjdd}t
tjjdd}ttj|||d||| t
tjjdd}t
tjjd	d}ttj|||d
||| ttj|||d||| t
tjjdd}t
tjjdd}|d||jdksJ |d|jdksJ |d|\}}|jdksJ |jdksJ t
tjjddd}d-dd}	| jj|	dd}
|
d|j|jksJ |
d|j|jksJ |
d|j|jksJ |
d|ddj|jksJ t
tjjddd}tjdd   fd!d}| d"||j|jks)J | d#||j|jks7J | d$||j|jksEJ t
tjjd%dd}t
tjjd&dd}d'd( }| j|}|d)||jd*ksuJ t
tjjd+dd}| jtjjd|jd,ksJ d S ).Nr   c                 S   s
   t | S r   )r$   r   r   r   r   r
   r   Z  s   
 z"test_compare_jax.<locals>.<lambda>r   )
   r   r   r   r   zi [n n], [n] -> i [n])r   r   r   zi [n n], i [n m] -> i [n m]zi [n n], i [n] m -> i [n] m)r   r   zi [n n], j [n] -> [n] (i j))r   d   zi [n n] -> i)r   zi [n n] -> i [n], [n n] i)r   r   r   )r   r=   r=      r   h㈵>c                 S   s,   t | }t | }| | tj||  S r   )jnpr   varr   laxrsqrt)r	   epsilonr   r   r   r   r
   	normalize  s   

z#test_compare_jax.<locals>.normalizez
... -> ...)	signaturez... [c]z[...] cr   zb [s...] (g [c])r   )gg?c                    s   t jd  | d   S )Ng      ?)r   r%   	bernoullirU   dropout_ratekeyr   r
   r     s    z..., ...zb ... c, b czb ..., brp   rs   c                 S   s   t | d t | S )Nr   )r   r   r   )r	   r/   r   r   r
   myfunc  s   z test_compare_jax.<locals>.myfuncza [b], c [b] -> c [b] a)r   r   r   r   )r   r    )r   )r!   r"   r#   r   adapt_with_vmapr   linalgsolvedeteigr   r$   r%   r&   r   rU   r'   PRNGKeyr~   adapt_numpylike_reducenorm)r!   r-   einsolveeindeteineigAr	   valsvecsr   einnormalizedropout_factorr/   r   	einmyfuncr   r   r
   test_compare_jaxW  sh   



&r   scipyc                  C   sX   dd l } tjdd d}tjjdd}tjjdd}ttj	||| 
d||| d S )	Nr   c                 S   r   r   r   r   r   r   r
   r     r   z$test_compare_scipy.<locals>.<lambda>r   rp   r   )r    r   za c, b c -> (a b) c)r!   r"   r#   r$   r%   r&   r   r   r   
khatri_raor~   )r!   r-   r	   r/   r   r   r
   test_compare_scipy  s   r   eindexc            
   
   C   sd  dd l } tjdd d}tjjdd}tt|d| d|| tt|d	| d
|| tt	|d| 	d|| t
t t|d W d    n1 sSw   Y  | d| tjjdd}tjjddd t|jd d d d d d d f  d}tt||d| d||| | d|}t
t t||d W d    n1 sw   Y  | d|| tjjdd}tjjddd t|jd d d d d d d f  d}tt||d| d||| | d||d  t
t t||d d W d    n	1 sw   Y  tjjdd}tjjddd d d f t|jdd  d d d f  d}tt||d!| d"||| t
t t||d# W d    n	1 shw   Y  d$}d%}tjjd&d}	tjjd&dd t||gd d d d d f  d}ttj|	|d'||d(| jd)ttj|	jd*||	||d(| d S )+Nr   c                 S   r   r   r   r   r   r   r
   r     r   z%test_compare_eindex.<locals>.<lambda>r   r   r   za b c d -> [d] c a bza b c [d] -> [1] c a bza b c d -> [c, d] a bza b [c d] -> [2] a bza b c d -> [a, c, d] bz[a] b [c d] -> [3] bza b c d -> c [d] a bza b c [d] -> c [1] a b)rG   r   r    )N.r   rl   za b c d, [a, b] e c d -> e c dz[a b] c d, [2] e c d -> e c dzi e c d -> e i c dza b c d, e [a, b] c d -> e c dz[a b] c d, e [2] c d -> e c d)r7   r   r    r7   za c d, [a] e c d -> e c dz[a] c d, [1] e c d -> e c dz[a] c d, e c d -> e c dza c d, e c d -> e c d)   r   r   r    )r   r   zb h w c, [h, w] b -> b czb [h w] c, [2] b -> b czb h w c, b [h, w] -> b cr    rG   rr   za b c, [d, e] a b c -> d e b c)dez[d e] b c, [2] a b c, a b cr@   )r!   r"   r#   r$   r%   r&   r   EXargminargmaxr   r   r   r   rU   r'   rO   rP   r,   scatteradd_atr   r   rA   )
r!   r-   r	   rY   coords2r   idxr   r   updatesr   r   r
   test_compare_eindex  s   





<<@6 r   c                     s  dd l  tjdd d} ttjjddd}ttjjddd}ttjjddd}d fd	d
}fdd} fdd} j	
|}|ffdd	}t|||||||||  t|||||||||  t|jd t|jd }	}
ttjjd|	jd |
jd fdd} d|	|
} d||tj }|	d d tjf |
tjd d f k}t|tjd d d d tjf |tj }t|||  ttj|	jd |
jd ftd}t|||  t|||  d S )Nr   c                 S   r   r   r   r   r   r   r
   r     r   z1test_compare_multiheadattention.<locals>.<lambda>r   )r   r=   r   r   r   r   c                    s@    j d| |d} d|t| jd   }  d||S )Nz#b q (h [c]), b k (h [c]) -> b q k hhz	b q [k] hrH   z#b q [k] h, b [k] (h c) -> b q (h c)r)   softmaxr   sqrtrU   qkvr   r!   headsr   r
   attn_einx_full  s    z7test_compare_multiheadattention.<locals>.attn_einx_fullc                    sx   t j| d d} t j|d d}t j|d d}td| |t| jd  }tjj|dd}td||}t |d	S )
Nzb q (h c) -> b q h cr   zb k (h c) -> b k h czbqhc,bkhc->bqkhrH   rf   zbqkh,bkhc->bqhczb q h c -> b q (h c))	r   	rearranger   r*   r   rU   r   nnr   )r   r   r   r   outputr   r   r
   attn_einops  s   z4test_compare_multiheadattention.<locals>.attn_einopsc                    s8     d| |} d|t| jd  }  d||S )Nz[c], k [c] -> kz[k]rH   z[k], [k] c -> cr   r   r!   r   r
   attn  s   z-test_compare_multiheadattention.<locals>.attnc                    s   |d| || dS )Nz8b q (h [c]), b [k] (h [c]), b [k] (h [c]) -> b q (h [c])r   r   )r   r   r   einattnr   r   r
   attn_einx_decomposed$  s   z=test_compare_multiheadattention.<locals>.attn_einx_decomposedr7   r   zq, k -> q kzq k, b q k h,r@   )r!   r"   r#   r   r   r$   r%   r&   r'   r   r   r   arangerU   greater_equalwhereinfr   trilonesbool)r-   r   r   r   r   r   r   r   r   qsksr   mask1A1mask2A2mask3r   r   r
   test_compare_multiheadattention  s>   	



".$*$r   flax)linenc                     sz   dd l  G  fdddtj} td}| dd}|dtjdi|}|d d	 j	d
ks0J |
||j	dks;J d S )Nr   c                       s,   e Zd ZU dZeed< ej fddZdS )z"test_compare_flax.<locals>.MyLayerr   c_outc                    s$    fdd}j d|| jd}|S )Nc                    s     dtjd| S )Nweightg{Gz?)paramr   initializersnormalr   selfr   r
   r   O  s    z=test_compare_flax.<locals>.MyLayer.__call__.<locals>.<lambda>z%... [c_in], [c_in] c_out -> ... c_outr   )r)   r   )r   r	   r   r   r   r
   __call__M  s   z+test_compare_flax.<locals>.MyLayer.__call__N)	__name__
__module____qualname__r   int__annotations__r   compactr   r   r   r   r
   MyLayerJ  s   
 r  )r   r   r   r   r   r   params*   r   )r   r   )r   r   r   r   )r!   r   Moduler   r   initr   r%   r   rU   apply)r  r	   modelr  r   r   r
   test_compare_flaxG  s   
	
r	  )$	importlibr"   	functoolsr   r4   r$   conftestr   r   util	find_specr   r0   r1   ra   osenvironrb   rk   ro   r   	jax.numpyr   r   r   scipy.linalgr   r   eindex.numpyr   r   r   r   r   r   r	  r   r   r   r
   <module>   sV    ?a
]  ALH=