
    Opfo1                     l   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m	Z	m
Z
mZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZ 	 d dlZdZn7# e$ r/  ej        dej                            d	
          g          ZY nw xY w	 d dlZdZ n7# e$ r/  ej        dej                            d
          g          Z Y nw xY wde egZ!g dZ"d eedZ#ej        $                    de"          ej        $                    de!          d                         Z%ej        $                    de!          d             Z&ej        $                    de!          d             Z'ej        $                    de!          d             Z(ej        $                    de!          d             Z)ej        $                    de"          ej        $                    de!          d                         Z*ej        $                    de!          d             Z+ej        $                    de!          d             Z,ej        $                    dg d          ej        $                    de!          d                         Z-ej        $                    dg d          ej        $                    de!          d                          Z.d! Z/ej        $                    de!          d"             Z0ej        $                    dg d          ej        $                    de!          d#                         Z1d$ Z2dS )%    N)Counter)contractcontract_expressioncontract_path
get_symbolhelpersshared_intermediates)to_cupyto_torch)_einsum)parse_einsum_input)count_cached_opscurrently_sharingget_sharing_cachecupyzCuPy not installed.)reason)markstorchzPyTorch not installed.numpy)z	ab,bc->cazabc,bcd,deazabc,def->fedcbazabc,bcd,df->fazijk,ikjzi,j->ijz	ijk,k->ijz	AB,BC->CAc                     | S N )xs    ]/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/opt_einsum/tests/test_sharing.py<lambda>r   '   s    q     )r   r   r   eqbackendc                     t          j        |           }d |D             }t          | g|R  } ||d|i}t                      5   ||d|i}d d d            n# 1 swxY w Y   ||k                                    sJ d S )Nc                     g | ]	}|j         
S r   shape.0vs     r   
<listcomp>z&test_sharing_value.<locals>.<listcomp>1       %%%!ag%%%r   r   )r   build_viewsr   r	   all)r   r   viewsshapesexprexpectedactuals          r   test_sharing_valuer/   -   s     ##E%%u%%%Fr+F+++DtU,G,,H			 / /u.g../ / / / / / / / / / / / / / / h##%%%%%%%s   	AA Ac                    d}t          j        |          }t          |gd |D             R  }t          d           t          d           t	                      5 } ||d| i t          |          }d d d            n# 1 swxY w Y   t          d           t          d           t	                      5 } ||d| i  ||d| i t          |          }d d d            n# 1 swxY w Y   t          d           t          d                    |                     t          d                    |                     ||k    sJ d S )	N
ab,bc,cd->c              3   $   K   | ]}|j         V  d S r   r!   r#   s     r   	<genexpr>z(test_complete_sharing.<locals>.<genexpr>?   $      $<$<QW$<$<$<$<$<$<r   (----------------------------------------Without sharing:r   With sharing:Without sharing: {} expressionsWith sharing: {} expressionsr   r(   r   printr	   r   formatr   r   r*   r,   cacher-   r.   s          r   test_complete_sharingr?   ;   s   	B##Er=$<$<e$<$<$<===D	(OOO	
			 +5e%W%%%#E**+ + + + + + + + + + + + + + + 
(OOO	/			 )5e%W%%%e%W%%%!%(() ) ) ) ) ) ) ) ) ) ) ) ) ) )
 
(OOO	
+
2
28
<
<===	
(
/
/
7
7888Xs$   A>>BB5 C!!C%(C%c                    d}t          j        |          }t          |gd |D             R  }t          d           t          d           t	                      5 } ||d| i t          |          }d d d            n# 1 swxY w Y   t          d           t          d           t	                      5 } ||d| i d d d            n# 1 swxY w Y   t	          |          5   ||d| i t          |          }d d d            n# 1 swxY w Y   t          d           t          d                    |                     t          d                    |                     ||k    sJ d S )	Nr1   c              3   $   K   | ]}|j         V  d S r   r!   r#   s     r   r3   z,test_sharing_reused_cache.<locals>.<genexpr>X   r4   r   r5   r6   r   r7   r8   r9   r:   r=   s          r   test_sharing_reused_cacherB   T   sF   	B##Er=$<$<e$<$<$<===D	(OOO	
			 +5e%W%%%#E**+ + + + + + + + + + + + + + + 
(OOO	/			 &5e%W%%%& & & & & & & & & & & & & & &	e	$	$ ) )e%W%%%!%(() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
(OOO	
+
2
28
<
<===	
(
/
/
7
7888Xs6   A>>BB5	C

CC$DDDc                 f   d}t          j        |          }t          |gd |D             R  }t          d           t          d           t	                      5 } ||d| i t          |          }|                    t          |                     d d d            n# 1 swxY w Y   t          d           t          d           t	                      5 } ||d| i t          |          }d d d            n# 1 swxY w Y   t	                      5 } ||d| i |                    t          |                     d d d            n# 1 swxY w Y   t          d           t          d                    |                     t          d                    |                     ||k    sJ d S )	Nr1   c              3   $   K   | ]}|j         V  d S r   r!   r#   s     r   r3   z1test_no_sharing_separate_cache.<locals>.<genexpr>r   r4   r   r5   r6   r   r7   r8   r9   )r   r(   r   r;   r	   r   updater<   )	r   r   r*   r,   r>   r-   cache1r.   cache2s	            r   test_no_sharing_separate_cacherH   n   sy   	B##Er=$<$<e$<$<$<===D	(OOO	
			 15e%W%%%#E**(//0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 
(OOO	/			 *6e%W%%%!&))* * * * * * * * * * * * * * * 
		 06e%W%%%&v..///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
(OOO	
+
2
28
<
<===	
(
/
/
7
7888Xs6   :B  B$'B$C;;C?C?+EEEc                      g dt          j        d                   }d |D             t          j                     fd fd} |            ||           d S )N)ab,bc,cd->aab,bc,cd->bab,bc,cd->crL   r   c                     g | ]	}|j         
S r   r!   r#   s     r   r&   z(test_sharing_nesting.<locals>.<listcomp>   r'   r   c                 p   t                      5   t          d         gR  | di} t          d         gR  | di} t          d|j        |j                  ||          }|d<   |d<   ~~dv sJ dv sJ 	 d d d            n# 1 swxY w Y   dvs
J d            dvs
J d            |S )	Nr   r      za,b->r   wr   zcache leakager	   r   r"   )r*   rQ   r   resultr   eqsrefsr+   s       r   method1z%test_sharing_nesting.<locals>.method1   s>   !## 	 	4#CF4V444eMWMMA4#CF4V444eMWMMAC(!'17CCAqRYZZZFDIDI1$;;;;$;;;;;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 $$s   A2BBBc                 l   t                      5   t          d         gR  | di} t          d         gR  | di}|d<   |d<    t          d|j        |j                  ||          }| |           z   }~~dv sJ dv sJ 	 d d d            n# 1 swxY w Y   dvsJ dvsJ d S )NrO   r      yzzc,d->rP   rR   )	r*   rY   rZ   rS   r   rT   rV   rU   r+   s	       r   method2z%test_sharing_nesting.<locals>.method2   sC   !## 		 		4#CF4V444eMWMMA4#CF4V444eMWMMADIDIC(!'17CCAqRYZZZFggenn,F1$;;;;$;;;;;		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 $$s   B BB!$B!)r   r(   weakrefWeakValueDictionary)r   r*   r[   rT   rV   rU   r+   s   `  @@@@r   test_sharing_nestingr^      s    
F
F
FCA''E%%u%%%F&((D                GENNNGENNNNNr   c                    t          j        |           }fd|D             }t          | g|z             \  }}}|                    d          }t	          d           t	          d           t                      5 }t          | g|R di t          |          }d d d            n# 1 swxY w Y   t	          d           t	          d           t                      5 }t          j	        t          ||                    D ]S}d |D             }	d |D             }
d	                    d                    |	          |          }t          |g|
R di Tt          |          }d d d            n# 1 swxY w Y   t	          d           t	          d
                    |                     t	          d                    |                     ||k    sJ d S )Nc                 :    g | ]}t                   |          S r   )
to_backend)r$   r   r   s     r   r&   z5test_sharing_modulo_commutativity.<locals>.<listcomp>   s&    
/
/
/a:gq!!
/
/
/r   ,r5   r6   r   r7   c                     g | ]
}|d          S )r   r   r$   ps     r   r&   z5test_sharing_modulo_commutativity.<locals>.<listcomp>   s    666qt666r   c                     g | ]
}|d          S )   r   rd   s     r   r&   z5test_sharing_modulo_commutativity.<locals>.<listcomp>   s    333QAaD333r   {}->{}r8   r9   )r   r(   r   splitr;   r	   r   r   	itertoolspermutationszipr<   join)r   r   opsinputsoutput_r>   r-   permutedpermuted_inputspermuted_opspermuted_eqr.   s    `           r   !test_sharing_modulo_commutativityrv      sl    
b
!
!C
/
/
/
/3
/
/
/C*B4#:66FFA\\#F	(OOO	
			 +5*S***'***#E**+ + + + + + + + + + + + + + + 
(OOO	/			 )5!.s63/?/?@@ 	A 	AH66X666O33(333L"//#((?*C*CVLLKK@,@@@@@@@!%(() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
(OOO	
+
2
28
<
<===	
(
/
/
7
7888Xs%   < B((B,/B,BE11E58E5c                    d}t          j        |          \  }}}d|z  dz
  }t          ||j        |j        |j                  }t	          d           t	          d           t                      }t                      5 } |||||            |                    t          |                     d d d            n# 1 swxY w Y   t                      5 } |||||            |                    t          |                     d d d            n# 1 swxY w Y   t	          d           t	          d           t                      5 } |||||             |||||            t          |          }	d d d            n# 1 swxY w Y   t	          d           t	          d	                    |                     t	          d		                    |	                     |d
         |	d
         k    sJ d S )Nz
ab,bc,de->g       @g      ?r5   r6   rP   r7   r8   r9   einsum)
r   r(   r   r"   r;   r   r	   rE   r   r<   )
r   r   r   rY   z1z2r,   num_exprs_nosharingr>   num_exprs_sharings
             r   test_partial_sharingr}      s   	B"2&&HAq"	rCBr17AGRX>>D	(OOO	
!))			 <5Q2w''''""#3E#:#:;;;< < < < < < < < < < < < < < < 
		 <5Q2w''''""#3E#:#:;;;< < < < < < < < < < < < < < < 
(OOO	/			 45Q2w''''Q2w'''',U334 4 4 4 4 4 4 4 4 4 4 4 4 4 4
 
(OOO	
+
2
23F
G
GHHH	
(
/
/0A
B
BCCCx(+<X+FFFFFFFs6   >2B<<C C 2DDD
.FFFc                   	
 d	d}	fd|D             }dddhfdt                    D             
t          j        j        d          
fd	|D             }t	                      5  
fd
|D             }d d d            n# 1 swxY w Y   t          |||          D ]8\  }}}t          j        ||          sJ d                    |                      9d S )Nzij,jk,klijklc                 <    g | ]}d                      |          S )rh   )r<   )r$   rp   ro   s     r   r&   z/test_sharing_with_constants.<locals>.<listcomp>   s'    GGGV00GGGr   ))rO   rX   )rX      )r      r   rO   c                 H    g | ]\  }}|v rt          j        j        | n|S r   nprandomrand)r$   ishp	constantss      r   r&   z/test_sharing_with_constants.<locals>.<listcomp>   s3    
[
[
[vq#1	>>29>3s
[
[
[r   rg   c                 X    g | ]&} t          |gR  d          d                   'S )r   rO   r   )r$   r   rn   r+   vars     r   r&   z/test_sharing_with_constants.<locals>.<listcomp>   sA    ZZZ"0#B0000Qc!fEEZZZr   c                 B    g | ]} t          |gR d i          S )r   r   )r$   r   r   rn   r   s     r   r&   z/test_sharing_with_constants.<locals>.<listcomp>   s=    ^^^bD%bD3DDD)DDSII^^^r   zerror at {})	enumerater   r   r   r	   rl   allcloser<   )r   outputs	equationsr-   r.   dimexpected_dim
actual_dimr   ro   rn   r+   r   s           @@@@@r   test_sharing_with_constantsr      s   FGGGGGwGGGI#FAI
[
[
[
[SYIZIZ
[
[
[C
).&)
$CZZZZZZPYZZZH			 _ _^^^^^^T]^^^_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ *-Wh)G)G P P%\:{<44OOm6J6J36O6OOOOOP Ps   0BBBsize)rX   r   r   c                 n   d t          |           D             }d |D             }d                    d t          | dz             D                       fdt          |           D             }d                    |          }t                      5  t          |           t          | dz             D ]W}|         }d                    ||          }t          |g|R  }	t          |	d                    t          |g|R  }
 |
|d	|i Xt          d
           d d d            d S # 1 swxY w Y   d S )Nc                 N    g | ]"}t           j                            d d           #S rO   r   r$   rq   s     r   r&   ztest_chain.<locals>.<listcomp>  (    	4	4	41")..A

	4	4	4r   c                     g | ]	}|j         
S r   r!   r$   r   s     r   r&   ztest_chain.<locals>.<listcomp>      """!ag"""r    c              3   4   K   | ]}t          |          V  d S r   r   r$   r   s     r   r3   ztest_chain.<locals>.<genexpr>  (      >>z!}}>>>>>>r   rg   c                 *    g | ]}||d z            S r   r   r$   r   alphabets     r   r&   ztest_chain.<locals>.<listcomp>  &    4441XaAg444r   rb   rh   r   r5   rangerm   r	   r;   r<   r   r   r   r   xsr+   namesro   r   targetr   	path_infor,   r   s              @r   
test_chainr      s    
5	4d	4	4	4B""r"""Fww>>eD1Hoo>>>>>H4444d444EXXe__F			 	 	ftax 	' 	'Aa[F00B%b.2...I)A,&r3F333DD"&g&&&&h	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B	D**D.1D.)rX   r   r   
   c                 r   d t          |           D             }d |D             }d                    d t          | dz             D                       fdt          |           D             }d                    |          }t                      5  t          |           t          |           D ]\}||dz            }d	                    ||          }t          |g|R  }	t          |	d                    t          |g|R  }
 |
|d
|i ]t          d           d d d            d S # 1 swxY w Y   d S )Nc                 N    g | ]"}t           j                            d d           #S r   r   r   s     r   r&   z test_chain_2.<locals>.<listcomp>  r   r   c                     g | ]	}|j         
S r   r!   r   s     r   r&   z test_chain_2.<locals>.<listcomp>  r   r   r   c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r3   ztest_chain_2.<locals>.<genexpr>  r   r   rg   c                 *    g | ]}||d z            S r   r   r   s     r   r&   z test_chain_2.<locals>.<listcomp>  r   r   rb   rO   rh   r   r5   r   r   s              @r   test_chain_2r     s    
5	4d	4	4	4B""r"""Fww>>eD1Hoo>>>>>H4444d444EXXe__F			 	 	ft 	' 	'AaAg&F00B%b.2...I)A,&r3F333DD"&g&&&&h	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   BD,,D03D0c                 B    t          |           }|d         |d         z   S )Nrx   	tensordot)r   )r>   countss     r   _compute_costr   *  s$    e$$F(f[111r   c                    t          t          dd                    }g }|D ]}d t          |          D             }d                    d t          |dz             D                       fdt          |          D             }d                    |          }t                      5 }t          |          D ]D}||dz            }	d	                    ||	          }
t          |
gd
 |D             R  } ||d| i E|                    t          |                     d d d            n# 1 swxY w Y   t          d                    t          |                               t          d                    t          |                               t          ||          D ](\  }}t          d                    ||                     )d S )Nrg      c                 N    g | ]"}t           j                            d d           #S r   r   r   s     r   r&   z'test_chain_2_growth.<locals>.<listcomp>4  s(    888qbinnQ""888r   r   c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r3   z&test_chain_2_growth.<locals>.<genexpr>5  s(      BBQ:a==BBBBBBr   c                 *    g | ]}||d z            S r   r   r   s     r   r&   z'test_chain_2_growth.<locals>.<listcomp>6  s&    888q!AE'"888r   rb   rO   rh   c              3   $   K   | ]}|j         V  d S r   r!   r   s     r   r3   z&test_chain_2_growth.<locals>.<genexpr>=  s$      0E0EQ0E0E0E0E0E0Er   r   z
sizes = {}z
costs = {}z{}	{})listr   rm   r	   r<   r   appendr   r;   reprrl   )r   sizescostsr   r   r   ro   r>   r   r   r   r,   costr   s                @r   test_chain_2_growthr   /  s   q"EE / /88E$KK88877BB%q//BBBBB8888E$KK888%!## 	/u4[[ + +!!AE'*__VV44*2F0E0E"0E0E0EFFFb*'****LLu--...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 
,

d5kk
*
*+++	,

d5kk
*
*+++%'' + +
dhoodD))****+ +s   ,A7D//D3	6D3	c                 6   d t          |           D             }d                    d t          | dz             D                       fdt          |           D             }d                    |          }d}t          | dz             D ]w}t                      5 }|         }d                    ||          }	t	          |	gd	 |D             R  }
 |
|d
|i |t          |          z  }d d d            n# 1 swxY w Y   xt                      5 }t          |           t          | dz             D ]a}|         }d                    ||          }	t          |	g|R  }t          |d                    t	          |	gd |D             R  }
 |
|d
|i bt          |          }d d d            n# 1 swxY w Y   t          d           t          d                    |                     t          d                    |                     ||k    sJ d S )Nc                 N    g | ]"}t           j                            d d           #S r   r   r   s     r   r&   z&test_chain_sharing.<locals>.<listcomp>J  r   r   r   c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r3   z%test_chain_sharing.<locals>.<genexpr>K  r   r   rg   c                 *    g | ]}||d z            S r   r   r   s     r   r&   z&test_chain_sharing.<locals>.<listcomp>L  r   r   rb   r   rh   c              3   $   K   | ]}|j         V  d S r   r!   r   s     r   r3   z%test_chain_sharing.<locals>.<genexpr>T  $      ,A,AQW,A,A,A,A,A,Ar   r   c              3   $   K   | ]}|j         V  d S r   r!   r   s     r   r3   z%test_chain_sharing.<locals>.<genexpr>_  r   r   r5   r8   r9   )r   rm   r	   r<   r   r   r;   r   )r   r   r   r   ro   r{   r   r>   r   r   r,   r   r|   r   s                @r   test_chain_sharingr   G  s    
5	4d	4	4	4Bww>>eD1Hoo>>>>>H4444d444EXXe__F4!8__ 8 8!## 	8ua[F00B&rB,A,Ab,A,A,ABBBDD"&g&&&=#7#77	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 
		 	15ftax 	' 	'Aa[F00B%b.2...I)A,&rB,A,Ab,A,A,ABBBDD"&g&&&&)%00	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 
(OOO	
+
2
23F
G
GHHH	
(
/
/0A
B
BCCC!2222222s&   AC::C>	C>	BF33F7:F7c                      ddl m}  d              } | d          fdt          d          D             }t                      rJ d |D             |gdz  k    sJ                                  d S )Nr   )
ThreadPoolc                      t          j        d          \  } }}t                      5  t          d| ||           t          d| ||           t	          t                                cd d d            S # 1 swxY w Y   d S )Nzab,bc,cdrJ   rK   )r   r(   r	   r   lenr   )XYZs      r   fnz&test_multithreaded_sharing.<locals>.fnl  s    %j111a!## 	, 	,]Aq!,,,]Aq!,,,(**++		, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   ?A33A7:A7   c                 :    g | ]}                               S r   )apply_async)r$   rq   r   pools     r   r&   z.test_multithreaded_sharing.<locals>.<listcomp>w  s'    	2	2	21$

2

	2	2	2r      c                 6    g | ]}|                                 S r   )get)r$   fs     r   r&   z.test_multithreaded_sharing.<locals>.<listcomp>y  s        AEEGG   r   )multiprocessing.poolr   r   r   close)r   r-   fsr   r   s      @@r   test_multithreaded_sharingr   i  s    //////, , , rttH:a==D	2	2	2	2	2b			2	2	2B """""  R   XJO3333JJLLLLLr   )3rj   r\   collectionsr   r   r   pytest
opt_einsumr   r   r   r   r   r	   opt_einsum.backendsr
   r   opt_einsum.contractr   opt_einsum.parserr   opt_einsum.sharingr   r   r   r   cupy_if_foundImportErrorparammarkskipr   torch_if_foundbackendsr   ra   parametrizer/   r?   rB   rH   r^   rv   r}   r   r   r   r   r   r   r   r   r   r   <module>r      s                   p p p p p p p p p p p p p p p p 1 1 1 1 1 1 1 1 ' ' ' ' ' ' 0 0 0 0 0 0 W W W W W W W W W WaKKKMM a a a FL0@0@H]0@0^0^/_```MMMafLLLNN f f f!V\'&+2B2BJb2B2c2c1deeeNNNf ^]3
 
 
	 [ 
 y))H--	& 	& .- *)	& H--  .-0 H--  .-2 H--  .-6 H--# # .-#L y))H--  .- *)8 H--G G .-G: H--P P .-P$ ++H--  .- ,+& //H--  .- 0/&2 2 2
 H--+ + .-+. ++H--3 3 .- ,+3@    s$   A 1B BB 1C ?C 