
    Pi4                     0   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                                        Zd Zd	 Zd
 Z edd          Z ej        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&d e&D             Z&ej'        (                    de&          d             Z)ej'        (                    de&          d             Z*d Z+d Z,d Z-dZ.d Z/dS )     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                               d S )NT)np)raise_on_error
extraglobs)r   einopslayersdictr        k/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/einops/tests/test_other.pytest_doctests_examplesr      sF    FM$42;;;GGGGFM$42;;;GGGGGGr   c                  @   ddl m}  t           |                       }g }g }t          j                    }|rB|                                }||                                z  }|                    |           |B|D ]d}|j        |vr	  |             |                    |j                   2# t          $ r&}|                    |j        |f           Y d}~]d}~ww xY wt          |          dk    s
J |            t          |          dk    sJ d|d            dS )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)      sy   
 )(((((113344F-//H
 +,,..G**,,,!!'***  +
 + < <&.>>>	<LNNN##L$?@@@@ 	< 	< 	<MM<6:;;;;;;;;	<v;;!V  A%%%'g>N'g'g'g%%%%%s   $B--
C7CCc                     t          d           d t          d          D             } | d t          d          D             z  } | g dgz  } | g dgz  } | D ]}t          d          D ]}t          |          }t                              d	d
|                              dg          }|d d          }t                              d	|dz             }t          t                              |          d |                   }t                              ||z
            }t                              d	dd          }	t          ||||	          x\  }
}}}}t          j
        |	|          sJ |                    |                              |                              |                              dg          }|                    |
                              |                              |                              dg          }t          j
        ||          sJ t          | }t          ||          D ]\  }}t          j
        ||          sJ d S )NzTesting optimizationsc                     g | ]}d g|z  	S )   r   .0n_dimensionss     r   
<listcomp>z7test_optimize_transformations_numpy.<locals>.<listcomp>:   s    ???\qcL ???r      c                     g | ]}d g|z  	S )   r   r-   s     r   r0   z7test_optimize_transformations_numpy.<locals>.<listcomp>;   s    ???ls\!???r      )r,   r3         )r,   r3   r5   r6         r5   r   i   )sizer   i   iM  )axis)printranger!   rngintegersreshapetuplepermutationr   r   array_equalsum	transposezip)shapesshape_attemptr/   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_numpyrZ   8   sq   	
!"""??U2YY???F
??eAhh????F
|||nF
###$$F , ,a 	, 	,Hu::LQE22::B4@@AqqqJQq(899I !>!>z	z!JKKL!oolY.FGGO,,q$S,99KXpL/;Y Y FK(8, >+|<<<<<ii
++//\/BBLL_]]eegifjkkGii,,00m0DDNNO_``hhjlimnnG>'733333 4\BLL,77 , ,1~a++++++,)	,, ,r   Fsymbolicr   
         (   c                  F   t           D ]} t          d| j                   t          t          d          }t          |                     t                    d          }||cxk    rt          dddd          k    sn J |t          dddd          cxk    r|k    sn J d S )	NzShape parsing for a b c dr^   r_   r`   ra   )rX   rY   cdr   )_IMPERATIVE_BACKENDSr<   r   r   x_np
from_numpyr   r&   parsed1parsed2s      r   test_parse_shape_imperativerl   ]   s    ' A A"G$:;;;dI..g0066	BB'AAAATB"b%A%A%AAAAAAA$bB"555@@@@@@@@@@@A Ar   c                      t           D ]\} t          t          d          }t          |                     t                    d          }||cxk    rt	                      k    sn J ]d S )Nz_ _ _ _rf   r   rg   rh   r   ri   s      r   test_underscorero   f   ss    ' , ,dI..g0066	BB'++++TVV+++++++, ,r   c                      t           D ]^} t          t          d          }t          |                     t                    d          }||cxk    rt	          d          k    sn J _d S )Nz_ _ _ hellora   )hellorn   ri   s      r   test_underscore_onerr   m   sw    ' 4 4dM22g0066FF'3333T^^^33333334 4r   c                      t           D ]_} t          t          d          }t          |                     t                    d          }||cxk    rt	          dd          k    sn J `d S )Nz_ _ a1 a1a111ar`   ra   )a1a1a111arn   ri   s      r   test_underscore_severalrv   t   s~    ' = =d$455g00668HII'<<<<TR%<%<%<<<<<<<<= =r   c                  l   t          j        t          j                  5  t	          t
          d           d d d            n# 1 swxY w Y   t          D ]`} t          j        t          j                  5  t	          |                     t
                    d           d d d            n# 1 swxY w Y   ad S )Nza a b b)pytestraisesr   EinopsErrorr   rg   rf   rh   )r&   s    r   test_repeatingr{   {   s   	v)	*	* % %D)$$$% % % % % % % % % % % % % % % ( = =]6-.. 	= 	=**400)<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	== =s#   AAA3)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 ]^\  }}}t          j        |          }t	          ||          }t	          |                     |          |          }||cxk    r|k    sn J _@d S )Nr^   r_   ...... arX   r^   r_   r`   r`   r]   ra   a ... a ... brX   rY   rf   r   r   onesr   rh   r&   rH   patternexpectedrJ   rj   rk   s          r   test_ellipsisr      s   ' 2 2"Xudff%T7D2JJJ'"Xwr


+\\7D2JJJ/wr


3T7D2JJJ'"Xwr


+\\7D2JJJ/wr


3z4"+;+;+;<"Xz4"#3#3#34)
 	2 	2$E7H A!!W--G!'"4"4Q"7"7AAGg11111111111!	22 2r   c                  T   t           D ]} g ddt          d          fg ddt          d          fg ddt          d          ffD ]^\  }}}t          j        |          }t	          ||          }t	          |                     |          |          }||cxk    r|k    sn J _d S )	Nr   r,   r3      z1 2 3 ar   r   )r^   r   r,   za 1 2r^   za () 2r   r   s          r   test_parse_with_anonymous_axesr      s    ' 	2 	2\\9dQiii0ZZ$***-ZZ4":::.)
 	2 	2$E7H
 A!!W--G!'"4"4Q"7"7AAGg11111111111	2	2 	2r   c                  6   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 ]m\  }}t          j        t                    5  t	          j        |          }t          |                     |          |           d d d            n# 1 swxY w Y   nd S )Nr   za b cz2 a b cza b c ()z	a b c d eza b c d e ...)rf   rx   ry   RuntimeErrorr   r   r   rh   )r&   rH   r   rJ   s       r   test_failuresr      s   ' < < \\7#\\9%\\:&\\;'\\?+\\:&
 
	< 
	<NE7 |,, < <GENNG..q117;;;< < < < < < < < < < < < < < <
	<< <s   8BBBTc                 (    g | ]}|j         d k    |S )ztensorflow.keras)r   )r.   r&   s     r   r0   r0      s&    ppp'7CY]oCoCogCoCoCor   r&   c           
         g dg dg dfD ]9}t          d| j        d|           |                     |          }t          |d          }i }|                                D ]L\  }}t          |t                    r|n,|                     ||t          j	        g d          fg          ||<   Mt          |           t          |dfi t          |d          d	d
i}|                     ||t          j	        g d          fg          }t          |j                   |j        dk    sJ t          j        |d          sJ ;d S )Nr]   )r^   r_   NNNNNNz-special shape parsing backend.framework_name=z input_shape=rc   z*a b (c1 c2) (d1 d2) -> (a b d1) c1 (c2 d2)za b c1 _d2r,   )i  r`   r,   r   )r<   r   create_symbolr   items
isinstanceinteval_symbolr   zerosr   rH   allclose)	r&   input_shapeinput_symbolshape_placeholder	out_shapenamesymbolresult_placeholderresults	            r   test_parse_shape_symbolicr      s    	    & &
 	Ow'=OOOOPPP,,[99'i@@	-3355 	 	LD& fc**_((<JZJZJZA[A[2\1]^^ dOO
 	i&F
 
JUVbdnJoJo
 
tu
 
 
 $$%7<RbRbRbIcIc:d9efffl|88888{61%%%%%%/& &r   c                 0   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 ]\  }}}}|                     |          }t          ||          }i }|                                D ]N\  }}	t	          |	t
                    r|	||<    |                     |	|t          j        |          fg          ||<   O||k    sJ d S )Nr^   r_   r}   r~   r   r   )NNNr`   r]   r   ra   r   r   r   z	 a ... b )	r   r   r   r   r   r   r   r   r   )
r&   static_shaperH   r   r   r   r   r   r   r   s
             r   "test_parse_shape_symbolic_ellipsisr      s    bD$</
vwr


+
bD$<$***5	)))7D2JJJ?			333WdRjjjI
vwr


+
bD$<$***5	)))7D2JJJ?			333WdRjjjI			333ZbAQAQAQR
bD$<dR2.>.>.>?3 % %.eWh ,,U33'g>>	-3355 	h 	hLD&&#&& h"(	$")"5"5fbhWcNdNd?e>f"g"g	$H$$$$$+% %r   c                     t          dd          } | t          dd          z  } | D ]c}dD ]^}d|v }t          j        g d|          }|                    |          }|                    |          |k    sJ |||j        f            _dd S )NFr[   T)int32int64float32float64float)r3   r   r5   )dtype)r	   r   r   rh   is_float_typer   )r%   r&   r   is_floatinputs        r   test_is_float_typer      s    $eEBBBH%uTBBBBH [ [= 	[ 	[E%'HHYYYe444E&&u--E((//8;;;eWek=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                  } |            }|                     |d	
          }dD ]}|                     ||dz   |dz   g          }dD ]\} |||          }	 ||                                |                                          }
| j                            |	|
dd           ]dS )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>.TorchModuleWithOperationsreturnNc                 H    t                                                       d S )N)super__init__)self	__class__s    r   r   zLtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.__init__  s    GGr   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                 n    |                                  }d                    fd|D                       S )N c                 2    g | ]}|d          dvr|n|z   S )r:   acdr   )r.   psuffixs     r   r0   zltest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf.<locals>.<listcomp>  s/     X X XQae5&8&8a&j X X Xr   )splitjoin)r   partsr   s     r   sufzXtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf  s8    xx X X X XRW X X XYYYr   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)rY   za b c , a b c d -> d)rH   r!   r   )r   x_abcr   rX   rY   rd   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#   kGAq!Z Z Z Z Z VE33'9#:#:;;FF633'9#:#:EBBEugS[[933y>>JJJFBfYvss3L/M/MNNPRTabbGc'll*B2ss#899Q???BveVSS1G-H-HII!LH= r   )r   N)r   )__name__
__module____qualname__r   r   __classcell__)r   r   r   r   r   r   s   @r   TorchModuleWithOperationsr     sp        	 	 	 	 	 		! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!r   r   T	fullgraph)r^   r_   ra   r   r,   )r   suf1other_suffixgh㈵>)atolrtol)r
   rx   skipr   r   r   r   r   r   r   r   einops._torch_specificr   Modulecompileranddoubler   testingassert_close)r   r   r   r   originalcompiledr9   rJ   r   rU   rV   r   r   r   r   r   s              @@@@@r    test_torch_compile_for_functionsr     s    W%% LLL;;;;;;;;;;;;;;BBBBBB!!!! ! ! ! ! ! ! ! ! ! !BI ! ! !, )(**H}}X}66H O OJJdQhq1222 	O 	OFhq&))Ghqxxzz62288::GM&&wd&NNNN		OO Or   c                     t          d          st          j                     ddl} ddlm} ddlm}m}m} |	                     |dd           |d	d
dddd           |ddd                    }| 
                    |d          }dD ]G}|                     ||g          } ||          }	 ||          }
|                     |	|
          sJ HdS )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   )rd   zb t c -> qkv b t coutz
qkv c coutzqkv coutr3      )weight_shape
bias_shapeqkvrd   coutzqkv b t cout -> b t qkvr   )r   Tr   )r       @   )r
   rx   r   r   r   einops.layers.torchr   r   r   
Sequentialr   r   r   )r   r   r   r   r   r   r   r9   rJ   rU   rV   s              r   test_torch_compile_for_layersr   4  s-   
 W%% LLL==========}}	$+++&\j^_celmnnn(%a888 H }}X}66H 0 0JJd|$$(1++(1++~~gw//////	0 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          |                               d          }|                    t                     t          j
        d|                                                                gd           d d d            d S # 1 swxY w Y   d S )Nr   numpyztest.pypythonT)check)r
   rx   r   tempfileTemporaryDirectoryr   joinpath
write_textsrc
subprocessrunabsoluteas_posix)re   testfiles     r   test_einops_threadingr  a  s   W%% W%% 		$	&	& O!77##I..C   ("3"3"5"5">">"@"@ANNNNO O O O O O O O O O O O O O O O O Os   A9CC"%C")0r  r  doctestr   pathlibr   r   r   rx   r   einops.layerseinops._backendsr   einops.einopsr   r   r   einops.testsr	   r
   
__author__randomdefault_rngr>   r   r)   rZ   rf   r   rg   rl   ro   rr   rv   r{   r   r   r   _SYMBOLIC_BACKENDSmarkparametrizer   r   r   r   r   r  r  r   r   r   <module>r     s                              , , , , , , J J J J J J J J J J A A A A A A A A
iH H Hh h h<, , ,@ -,eEJJJ rx   !!A A A, , ,4 4 4= = == = =2 2 2*
2 
2 
2< < < D777D666  qp-?ppp  $677& & 87&6 $677% % 87%2[ [ [0O 0O 0Of0 0 08"
O 
O 
O 
O 
Or   