
    'i4                     L   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dl	Z	d dl
Z	d dlmZ d dlmZmZmZ d dlmZmZ dZej*                  j-                         Zd Zd	 Zd
 Z edd      Z ej8                  g d      Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%g  edd       edd      Z&e&D  cg c]  } | jN                  dk7  s|  c} Z&ejP                  jS                  de&      d        Z*ejP                  jS                  de&      d        Z+d Z,d Z-d Z.dZ/d Z0yc c} w )     N)testmod)Path)AbstractBackend)_optimize_transformationparse_shape	rearrange)collect_test_backendsis_backend_testedzAlex Rogozhnikovc                      t        t        j                  dt        t                     t        t        j                  dt        t                     y )NT)np)raise_on_error
extraglobs)r   einopslayersdictr        Q/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/tests/test_other.pytest_doctests_examplesr      s*    FMM$42;GFMM$42;Gr   c                     ddl m}  t         |              }g }g }t        j                         }|r7|j                         }||j	                         z  }|j                  |       |r7|D ]4  }|j                  |vr	  |        |j                  |j                         6 t        |      dk(  sJ |       t        |      dk(  sJ d|d       y# t        $ r'}|j                  |j                  |f       Y d}~d}~ww xY w)z
    This test will fail if some of backends are not installed or can't be imported
    Other tests will just work and only test installed backends.
       )parse_backends_to_testNr   z%did not instantiate backends_to_test=z, they won't be tested) r   setr   __subclasses__popappendframework_nameremove	Exceptionlen)r   backends_to_testerrorsbackend_subclassesbackendsbackendbackend_typees           r   test_backends_installedr)      s   
 )134F--/H
,,.G**,,!!'* 
 + <&&.>>	<N##L$?$?@< v;!#V# A%g)O>N=PPf'gg%  	<MM<66:;;	<s   ="C	D C;;D c                  2   t        d       t        d      D  cg c]  } dg| z  
 }} |t        d      D  cg c]  } dg| z  
 c} z  }|g dgz  }|g dgz  }|D ]  }t        d      D ]  }t        |      } t        j	                  d	d
|      j                  dg      }|d d  }t        j	                  d	| dz         }t        t        j                  |       d |       }t        j                  | |z
        }t        j	                  d	dd      }	t        ||||	      x\  }
}}}}t        j                  |	|      sJ |j                  |      j                  |      j                  |      j                  dg      }|j                  |
      j                  |      j                  |      j                  dg      }t        j                  ||      sJ t        | }t        ||      D ]  \  }}t        j                  ||      rJ    y c c} w c c} w )NzTesting optimizations            )r,   r.         )r,   r.   r/   r0         r/   r   i   )sizer   i   iM  )axis)printranger!   rngintegersreshapetuplepermutationr   r   array_equalsum	transposezip)n_dimensionsshapesshape_attemptx
init_shape	n_reducedreduced_axesaxes_reorderingfinal_shapeinit_shape2reduced_axes2axes_reordering2final_shape2combination2result1result2combination3abs                       r   #test_optimize_transformations_numpyrU   8   s   	
!"5:2Y?\qcL ?F?
eAh?ls\!??F
|nF
#$$F ,a 	,Hu:LQE2::B4@AqJQq(89I !>z	!JKL!oolY.FGO,,q$S,9KXpL/;Y FK(8, >>+|<<<ii
+//\/BLL_]eegifjkGii,00m0DNNO_`hhjlimnG>>'7333 4\BLL,7 ,1~~a+++,)	,, @?s
   HHFsymbolicr   
         (   c                     t         D ]  } t        d| j                         t        t        d      }t        | j                  t              d      }||cxk(  rt        dddd      k(  sJ  J |t        dddd      cxk7  r|k7  r~J  J  y )	NzShape parsing for a b c drY   rZ   r[   r\   )rS   rT   cdr   )_IMPERATIVE_BACKENDSr6   r   r   x_np
from_numpyr   r&   parsed1parsed2s      r   test_parse_shape_imperativerg   ]   s    ' A"G$:$:;dI.g006	B'ATB"b%AAAAAA$bB"5@@@@@@Ar   c                      t         D ]I  } t        t        d      }t        | j                  t              d      }||cxk(  rt	               k(  rFJ  J  y )Nz_ _ _ _ra   r   rb   rc   r   rd   s      r   test_underscorerj   f   sO    ' ,dI.g006	B'+TV+++++,r   c                      t         D ]K  } t        t        d      }t        | j                  t              d      }||cxk(  rt	        d      k(  rHJ  J  y )Nz_ _ _ hellor\   )hellori   rd   s      r   test_underscore_onerm   m   sQ    ' 4dM2g006F'3T^333334r   c                      t         D ]L  } t        t        d      }t        | j                  t              d      }||cxk(  rt	        dd      k(  rIJ  J  y )Nz_ _ a1 a1a111ar[   r\   )a1a1a111ari   rd   s      r   test_underscore_severalrq   t   sV    ' =d$45g0068HI'<TR%<<<<<<=r   c                  X   t        j                  t        j                        5  t	        t
        d       d d d        t        D ]M  } t        j                  t        j                        5  t	        | j                  t
              d       d d d        O y # 1 sw Y   `xY w# 1 sw Y   fxY w)Nza a b b)pytestraisesr   EinopsErrorr   rb   ra   rc   r&   s    r   test_repeatingrw   {   s    	v))	* %D)$% ( =]]6--. 	=**40)<	= 	==% %	= 	=s   B) B B B)	c                  (   t         D ]  } ddgdt               fdgdt        d      fddgdt        d      fg ddt        d      fg ddt        d	      fdgd
t        d      fddgd
t        d      fg dd
t        d      fg dd
t        d      fg ddt        dd	      fdd	gdt        dd	      ffD ]R  \  }}}t        j                  |      }t	        ||      }t	        | j                  |      |      }||cxk(  r|k(  rOJ  J   y )NrY   rZ   ...... arS   rY   rZ   r[   r[   rX   r\   a ... a ... brS   rT   ra   r   r   onesr   rc   r&   rC   patternexpectedrE   re   rf   s          r   test_ellipsisr      s&   ' 2"Xudf%T7D2J'"Xwr
+7D2J/wr
3T7D2J'"Xwr
+7D2J/wr
3z4"+;<"Xz4"#34)
 	2$E7H A!!W-G!'"4"4Q"7AGg111111!	22r   c                  (   t         D ]  } g ddt        d      fg ddt        d      fg ddt        d      ffD ]R  \  }}}t        j                  |      }t	        ||      }t	        | j                  |      |      }||cxk(  r|k(  rOJ  J   y )	Nr   r,   r.      z1 2 3 ar   r{   )rY   r   r,   za 1 2rY   za () 2r   r   s          r   test_parse_with_anonymous_axesr      s    ' 	29dQi0$*-4":.)
 	2$E7H
 A!!W-G!'"4"4Q"7AGg111111	2	2r   c                  &   t         D ]|  } g ddfg ddfg ddfg ddfg ddfg ddffD ]W  \  }}t        j                  t              5  t	        j
                  |      }t        | j                  |      |       d d d        Y ~ y # 1 sw Y   fxY w)Nr   za b cz2 a b cza b c ()z	a b c d eza b c d e ...)ra   rs   rt   RuntimeErrorr   r   r   rc   )r&   rC   r   rE   s       r   test_failuresr      s    ' < 7#9%:&;'?+:&
 
	<NE7 |, <GGENG..q17;< <
	<<< <s   	1BBTztensorflow.kerasr&   c           
      f   g dg dg dfD ]"  }t        d| j                  d|       | j                  |      }t        |d      }i }|j	                         D ]D  \  }}t        |t              r|n)| j                  ||t        j                  g d      fg      ||<   F t        |       t        |dfi t        |d      d	d
i}| j                  ||t        j                  g d      fg      }t        |j                         |j                  dk(  sJ t        j                  |d      r#J  y )NrX   )rY   rZ   NNNNNNz-special shape parsing backend.framework_name=z input_shape=r^   z*a b (c1 c2) (d1 d2) -> (a b d1) c1 (c2 d2)za b c1 _d2r,   )i  r[   r,   r   )r6   r   create_symbolr   items
isinstanceinteval_symbolr   zerosr   rC   allclose)	r&   input_shapeinput_symbolshape_placeholder	out_shapenamesymbolresult_placeholderresults	            r   test_parse_shape_symbolicr      sE    	  &
 	>w'='=&?~OP,,[9'i@	-335 	LD& fc* ((<JZA[2\1]^ dO	 	i&F
JUVbdnJo
tu
 $$%7<RbIc:d9effll||8888{{61%%%/&r   c                    ddgd d gdt               fdgd gdt        d      fddgd d gdt        d      fg dg ddt        d      fg d	g d
dt        d      fdgd gdt        d      fddgd d gdt        d      fg dg ddt        d      fg d	g d
dt        d      fg d	g d
dt        dd      fddgd d gdt        dd      ffD ]  \  }}}}| j                  |      }t        ||      }i }|j                         D ]F  \  }}	t	        |	t
              r|	||<   | j                  |	|t        j                  |      fg      ||<   H ||k(  rJ  y )NrY   rZ   ry   rz   r{   r|   )NNNr[   rX   r   r\   r}   r~   r   z	 a ... b )	r   r   r   r   r   r   r   r   r   )
r&   static_shaperC   r   r   r   r   r   r   r   s
             r   "test_parse_shape_symbolic_ellipsisr      s    bD$</
vwr
+
bD$<$*5	)7D2J?	3WdRjI
vwr
+
bD$<$*5	)7D2J?	3WdRjI	3ZbAQR
bD$<dR2.>?3 %.eWh ,,U3'g>	-335 	hLD&&#&"(	$")"5"5fbhhWcNd?e>f"g	$		h
 H$$$+%r   c                     t        dd      } | t        dd      z  } | D ]_  }dD ]X  }d|v }t        j                  g d|      }|j                  |      }|j	                  |      |k(  rFJ |||j
                  f        a y )NFrV   T)int32int64float32float64float)r.   r   r/   )dtype)r	   r   r   rc   is_float_typer   )r%   r&   r   is_floatinputs        r   test_is_float_typer      s    $eEBH%uTBBH [= 	[E%'HHHYe4E&&u-E((/8;ZeWekk=ZZ;		[[r   c                     t        d      st        j                          ddl} ddlm} ddlmmmm	m
 ddlm}  |         G fdd|j                        } |       }| j                  |d	
      }dD ]p  }| j                  ||dz   |dz   g      }dD ]O  } |||      }	 ||j!                         |      j#                         }
| j$                  j'                  |	|
dd       Q r y)a7  
    Test ensures that allow_ops_in_compiled_graph allows compiling in a single graph
    Additionally we ensure that after compilation cache works properly
     (by changing shapes and patterns)
    We additionally check that pack/unpack still can be handled
     despite variable number of inputs/outputs
    torchr   Nnn)einsumpackreducerepeatunpack)allow_ops_in_compiled_graphc                   6     e Zd Zd fdZdfd	Z xZS )Ctest_torch_compile_for_functions.<locals>.TorchModuleWithOperationsc                 "    t         |           y )N)super__init__)self	__class__s    r   r   zLtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.__init__  s    Gr   c                 `   |j                   \  }}}fd} | |d            } | |d      d      } |gdt              z   z   |d            \  }}	 t        | |d            |	d      }
|
d	   t        |
      z   }t        | |d
      |      } || |d            d	   }||z   S )Nc                     | j                         }dj                  |D cg c]  }|d   dvr|n|z    c}      S c c}w )N r4   acd)splitjoin)r   partspsuffixs      r   sufzXtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf  s@    xxRW XQae5&8a&j!H XYY Xs   =za b c -> a b c 4za b c d -> a b cminr,   za b * cza b d c -> (a b ) 1 c dzab one1 c *r   z(a b ) 1 c -> a b c)rT   za b c , a b c d -> d)rC   r!   r   )r   x_abcr   rS   rT   r_   r   x_abcdx_abdcpsx_arrayx1additionr   r   r   r   r   s     `          r   forwardzKtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward  s    kkGAq!Z E3'9#:;F63'9#:EBEugS[93y>JJFBYvs3L/MNPRTabGc'l*B2s#89Q?BeVS1G-HI!LH= r   )returnN)r   )__name__
__module____qualname__r   r   __classcell__)r   r   r   r   r   r   s   @r   TorchModuleWithOperationsr     s    		! 	!r   r   T	fullgraph)rY   rZ   r\   r   r,   )r   suf1other_suffixgh㈵>)atolrtol)r
   rs   skipr   r   r   r   r   r   r   r   einops._torch_specificr   Modulecompileranddoubler   testingassert_close)r   r   r   r   originalcompiledr3   rE   r   rP   rQ   r   r   r   r   r   s              @@@@@r    test_torch_compile_for_functionsr     s     W%;;B!! !BII !, )*H}}X}6H OJJdQhq122 	OFq&)Gqxxz6288:GMM&&wd&N		OOr   c                  l   t        d      st        j                          ddl} ddlm} ddlm}m}m} |j                   |dd       |d	d
dddd       |ddd            }| j                  |d      }dD ]9  }| j                  ||g      } ||      }	 ||      }
| j                  |	|
      r9J  y)z
    Einops layers are in general very friendly towards tracing/compiling,
    but we still want to make sure we can compile them.
    r   r   Nr   )EinMix	RearrangeReducezb (t c) -> b t c   )r_   zb t c -> qkv b t coutz
qkv c coutzqkv coutr.      )weight_shape
bias_shapeqkvr_   coutzqkv b t cout -> b t qkvr   )r   Tr   )r       @   )r
   rs   r   r   r   einops.layers.torchr   r   r   
Sequentialr   r   r   )r   r   r   r   r   r   r   r3   rE   rP   rQ   s              r   test_torch_compile_for_layersr   4  s    
 W%==}}$+&\j^_celmn(%a8H }}X}6H 0JJd|$1+1+~~gw///	0r   aS  
import einops
import numpy as np
from concurrent.futures import ThreadPoolExecutor
import torch

def f():
    return einops.rearrange(np.ndarray((20, 150, 150)), "... i j -> ... j i")
with ThreadPoolExecutor(max_workers=2) as ex:
    fs = []
    for i in range(20):
        fs.append(ex.submit(f))
    for fut in fs:
        fut.result()
c                     t        d      st        j                          t        d      st        j                          t        j                         5 } t        |       j                  d      }|j                  t               t        j                  d|j                         j                         gd       d d d        y # 1 sw Y   y xY w)Nr   numpyztest.pypythonT)check)r
   rs   r   tempfileTemporaryDirectoryr   joinpath
write_textsrc
subprocessrunabsoluteas_posix)r`   testfiles     r   test_einops_threadingr  a  s    W%W%		$	$	& O!7##I.C ("3"3"5">">"@ANO O Os   A%CC
)1r  r   doctestr   pathlibr   r   r   rs   r   einops.layerseinops._backendsr   einops.einopsr   r   r   einops.testsr	   r
   
__author__randomdefault_rngr8   r   r)   rU   ra   r   rb   rg   rj   rm   rq   rw   r   r   r   _SYMBOLIC_BACKENDSr   markparametrizer   r   r   r   r   r   r  rv   s   0r   <module>r     sU           , J J A
iiHh<,@ -eEJ rxx !A,4==2*
2< D7D6  .@p'7CYCY]oCogp  $67& 8&6 $67% 8%2[0Of08"
OI qs   2D!D!