
    ,VhE3                        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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mZ d d
lmZ  ej8                  d       	 d dlZdZ	 d dl$Z$dZ%	 d dl&Z&dZ'ee'e%gZ(g dZ)d eedZ*ejD                  jW                  de)      ejD                  jW                  de(      de,deddfd              Z-ejD                  jW                  de(      deddfd       Z.ejD                  jW                  de(      deddfd       Z/ejD                  jW                  de(      deddfd       Z0ejD                  jW                  de(      deddfd       Z1ejD                  jW                  de)      ejD                  jW                  de(      de,deddfd              Z2ejD                  jW                  de(      deddfd       Z3ejD                  jW                  de(      deddfd        Z4ejD                  jW                  d!g d"      ejD                  jW                  de(      d!e5deddfd#              Z6ejD                  jW                  d!g d$      ejD                  jW                  de(      d!e5deddfd%              Z7d& Z8ejD                  jW                  de(      deddfd'       Z9ejD                  jW                  d!g d"      ejD                  jW                  de(      d!e5deddfd(              Z:d*d)Z;y# e $ r3  ejB                  dejD                  jG                  d      g      ZY w xY w# e $ r3  ejB                  dejD                  jG                  d      g      Z%Y w xY w# e $ r3  ejB                  dejD                  jG                  d      g      Z'Y Dw xY w)+    N)Counter)Any)contractcontract_expressioncontract_path
get_symbolshared_intermediates)to_cupyto_torch)_einsum)parse_einsum_input)count_cached_opscurrently_sharingget_sharing_cache)build_views)BackendTypenumpyzNumPy not installed.)reason)markscupyzCuPy not installed.torchzPyTorch not installed.)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    M/home/dcms/DCMS/lib/python3.12/site-packages/opt_einsum/tests/test_sharing.py<lambda>r   4   s    q     )r   r   r   eqbackendreturnc                     t        |       }|D cg c]  }|j                   }}t        | g| } ||d|i}t               5   ||d|i}d d d        |k(  j	                         sJ y c c}w # 1 sw Y   $xY w)Nr    )r   shaper   r	   all)r   r    viewsvshapesexprexpectedactuals           r   test_sharing_valuer+   :   s     OE$%!agg%F%r+F+DU,G,H		 /u.g./ h##%%% &/ /s   A*	A//A8c                    d}t        |      }t        |gd |D         }t        d       t        d       t               5 } ||d| i t	        |      }d d d        t        d       t        d       t               5 } ||d| i  ||d| i t	        |      }d d d        t        d       t        d d       t        d	 d       ||k(  sJ y # 1 sw Y   ~xY w# 1 sw Y   FxY w)
N
ab,bc,cd->c              3   4   K   | ]  }|j                     y wr   r#   .0r&   s     r   	<genexpr>z(test_complete_sharing.<locals>.<genexpr>L        $<QWW$<   (----------------------------------------Without sharing:r    With sharing:Without sharing:  expressionsWith sharing: r   r   printr	   r   r    r   r%   r(   cacher)   r*   s          r   test_complete_sharingr?   H   s    	BOEr=$<e$<=D	(O	
		 +5e%W%#E*+ 
(O	/		 )5e%W%e%W%!%()
 
(O	hZ|
45	N6(,
/0X+ +) )s   C=CCC'c                    d}t        |      }t        |gd |D         }t        d       t        d       t               5 } ||d| i t	        |      }d d d        t        d       t        d       t               5 } ||d| i d d d        t              5   ||d| i t	        |      }d d d        t        d       t        d d       t        d	 d       ||k(  sJ y # 1 sw Y   xY w# 1 sw Y   mxY w# 1 sw Y   RxY w)
Nr-   c              3   4   K   | ]  }|j                     y wr   r/   r0   s     r   r2   z,test_sharing_reused_cache.<locals>.<genexpr>e   r3   r4   r5   r6   r    r7   r8   r9   r:   r;   r=   s          r   test_sharing_reused_cacherB   a   s   	BOEr=$<e$<=D	(O	
		 +5e%W%#E*+ 
(O	/		 &5e%W%&	e	$ )e%W%!%() 
(O	hZ|
45	N6(,
/0X+ +& &) )s$   C&=	C2C>&C/2C;>Dc                 z   d}t        |      }t        |gd |D         }t        d       t        d       t               5 } ||d| i t	        |      }|j                  t	        |             d d d        t        d       t        d       t               5 } ||d| i t	        |      }d d d        t               5 } ||d| i j                  t	        |             d d d        t        d       t        d d       t        d	 d       ||k(  sJ y # 1 sw Y   xY w# 1 sw Y   {xY w# 1 sw Y   RxY w)
Nr-   c              3   4   K   | ]  }|j                     y wr   r/   r0   s     r   r2   z1test_no_sharing_separate_cache.<locals>.<genexpr>   r3   r4   r5   r6   r    r7   r8   r9   r:   )r   r   r<   r	   r   update)	r    r   r%   r(   r>   r)   cache1r*   cache2s	            r   test_no_sharing_separate_cacherH   {   s8   	BOEr=$<e$<=D	(O	
		 15e%W%#E*(/01
 
(O	/		 *6e%W%!&)* 
	 06e%W%&v./0 
(O	hZ|
45	N6(,
/0X#1 1* *0 0s$   .DD%=#D1D"%D.1D:c                      g dt        d         }|D cg c]  }|j                   c}t        j                          fd fd} |        ||       y c c}w )N)ab,bc,cd->aab,bc,cd->bab,bc,cd->crL   r   c                 L   t               5   t        d   g | di} t        d   g | di} t        d|j                  |j                        ||      }|d<   |d<   ~~dv sJ dv sJ 	 d d d        dvsJ d       dvsJ d       S # 1 sw Y   !xY w)	Nr   r       za,b->r    wr   zcache leakager	   r   r#   )r%   rP   r   resultr    eqsrefsr'   s       r   method1z%test_sharing_nesting.<locals>.method1   s    !# 	4#CF4V4eMWMA4#CF4V4eMWMAC(!''177CAqRYZFDIDI1$;;$;;	 $//$//	 	s   A-BB#c                 L   t               5   t        d   g | di} t        d   g | di}|d<   |d<    t        d|j                  |j                        ||      }| |       z   }~~dv sJ dv sJ 	 d d d        dvsJ dvsJ y # 1 sw Y   xY w)NrN   r       yzzc,d->rO   rQ   )	r%   rX   rY   rR   r    rS   rU   rT   r'   s	       r   method2z%test_sharing_nesting.<locals>.method2   s    !# 		4#CF4V4eMWMA4#CF4V4eMWMADIDIC(!''177CAqRYZFgen,F1$;;$;;		 $$		 		s   A8BB#)r   r#   weakrefWeakValueDictionary)r    r%   r&   rZ   rS   rU   rT   r'   s   `   @@@@r   test_sharing_nestingr]      s]    
FCAE$%!agg%F++-D  ENENA &s   A(c                    t        fdt        |       D              }t        | gt        |      z         \  }}}|j	                  d      }t        d       t        d       t               5 }t        | g|di t        |      }d d d        t        d       t        d       t               5 }t        j                  t        ||            D ]V  }	|	D 
cg c]  }
|
d   	 }}
|	D 
cg c]  }
|
d   	 }}
d	j                  dj                  |      |      }t        |g|di X t        |      }d d d        t        d       t        d
 d       t        d d       ||k(  sJ y # 1 sw Y   xY wc c}
w c c}
w # 1 sw Y   PxY w)Nc              3   :   K   | ]  }t           |        y wr   )
to_backend)r1   r   r    s     r   r2   z4test_sharing_modulo_commutativity.<locals>.<genexpr>   s     @1
7#A&@s   ,r5   r6   r    r7   r      z{}->{}r8   r9   r:   )tupler   r   listsplitr<   r	   r   r   	itertoolspermutationszipformatjoin)r   r    opsinputsoutput_inputs_listr>   r)   permutedppermuted_inputspermuted_opspermuted_eqr*   s    `             r   !test_sharing_modulo_commutativityru      s    @B@
@C*B4$s)+;<FFA,,s#K	(O	
		 +5*S*'*#E*+ 
(O	/		 )5!..s;/DE 	AH-56qt6O6*23QAaD3L3"//#((?*CVLKK@,@@		A
 "%() 
(O	hZ|
45	N6(,
/0X#+ + 73) )s6   ,E,/'FE8"F(E=4?F,E58
FFc                    d}t        |      \  }}}d|z  dz
  }t        ||j                  |j                  |j                        }t        d       t        d       t	               }t               5 } |||||        |j                  t        |             d d d        t               5 } |||||        |j                  t        |             d d d        t        d       t        d       t               5 } |||||         |||||        t        |      }	d d d        t        d       t        d| d	       t        d
	 d	       |d   |	d   kD  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   XxY w)Nz
ab,bc,de->g       @g      ?r5   r6   rO   r7   r8   r9   r:   einsum)r   r   r#   r<   r   r	   rE   r   )
r    r   r   rX   z1z2r(   num_exprs_nosharingr>   num_exprs_sharings
             r   test_partial_sharingr|      su   	B2HAq"	rCBr177AGGRXX>D	(O	
&y		 <5Q2w'""#3E#:;< 
	 <5Q2w'""#3E#:;< 
(O	/		 45Q2w'Q2w',U34
 
(O	12,
?@	N,-\
:;x(+<X+FFFF#< << <4 4s$   0'E)'E'8$E3E$'E03E<c           
      ^   d}d}|D cg c]	  }| d|  }}d}ddh}t        |      D cg c]'  \  }}||v rt        j                  j                  | n|) }	}}t        j                  j                  |d    }
|D cg c]  } t	        |g| |	d   |
|	d          }}t               5  |D cg c]  } t	        |g|	d|i|
       }}d d d        t        ||      D ]&  \  }}}t        j                  ||      rJ d	|         y c c}w c c}}w c c}w c c}w # 1 sw Y   UxY w)
Nzij,jk,klijkl->))rN   rW   )rW      )r      r   rN   rb   	constantsz	error at )	enumeratenprandomrandr   r	   rh   allclose)r    rl   outputsrm   	equationsr'   r   ishprk   varr   r)   r*   dimexpected_dim
actual_dims                    r   test_sharing_with_constantsr      sY   FG5<=6F82fX&=I=#FAIIRSYIZ
[vq#1	>299>>3s:
[C
[
))..&)
$CPYZ"0#B00Qc!fEZHZ		 _T]^bD%bD3D)DSI^^_ *-Wh)G H%\:{{<4G	#6GG4H > \ [ __ _s.   D,D?!D,D#1DD#D##D,size)rW   r   r   c                 j   t        |       D cg c]"  }t        j                  j                  dd      $ }}|D cg c]  }|j                   }}dj                  d t        | dz         D              }t        |       D cg c]
  }|||dz     }}dj                  |      }	t               5  t        |	       t        | dz         D ]<  }||   }
|	 d|
 }t        |g| }t        |d          t        |g| } ||d|i > t        d       d d d        y c c}w c c}w c c}w # 1 sw Y   y xY w)	NrN    c              3   2   K   | ]  }t        |        y wr   r   r1   r   s     r   r2   ztest_chain.<locals>.<genexpr>       >z!}>   rb   ra   r   r    r5   
ranger   r   r   r#   rj   r	   r<   r   r   r   r    rn   xsr   r'   alphabetr   namesrl   targetr   	path_infor(   s                 r   
test_chainr     s.    ).d	41"))..A
	4B	4!"!agg"F"ww>eD1Ho>>H*/+6QXa!a% 6E6XXe_F		 	ftax 	'Aa[F82fX&B%b.2.I)A,&r3F3D"&g&	' 	h	 	 
5"6	 	   'DDD$-A$D))D2)rW   r   r   
   c                 j   t        |       D cg c]"  }t        j                  j                  dd      $ }}|D cg c]  }|j                   }}dj                  d t        | dz         D              }t        |       D cg c]
  }|||dz     }}dj                  |      }	t               5  t        |	       t        |       D ]?  }|||dz    }
|	 d|
 }t        |g| }t        |d          t        |g| } ||d|i A t        d       d d d        y c c}w c c}w c c}w # 1 sw Y   y xY w)	NrN   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r2   ztest_chain_2.<locals>.<genexpr>&  r   r   rb   ra   r   r    r5   r   r   s                 r   test_chain_2r   !  s1    ).d	41"))..A
	4B	4!"!agg"F"ww>eD1Ho>>H*/+6QXa!a% 6E6XXe_F		 	ft 	'Aa!a%(F82fX&B%b.2.I)A,&r3F3D"&g&	' 	h	 	 
5"6	 	r   c                 .    t        |       }|d   |d   z   S )Nrw   	tensordot)r   )r>   countss     r   _compute_costr   6  s!    e$F(f[111r   c                    t        t        dd            }g }|D ]  }t        |      D cg c]"  }t        j                  j	                  dd      $ }}dj                  d t        |dz         D              }t        |      D cg c]
  }|||dz     }}dj                  |      }	t               5 }
t        |      D ],  }|||dz    }|	 d| }t        |gd |D         } ||d	| i . |j                  t        |
             d d d         t        d
t        |              t        dt        |              t        ||      D ]  \  }}t        | d|         y c c}w c c}w # 1 sw Y   \xY w)Nrb      rN   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r2   z&test_chain_2_growth.<locals>.<genexpr>A  s     BQ:a=Br   ra   r   c              3   4   K   | ]  }|j                     y wr   r/   r1   r   s     r   r2   z&test_chain_2_growth.<locals>.<genexpr>I  s     0EQ0Er4   r    zsizes = zcosts = 	)rd   r   r   r   r   rj   r	   r   appendr   r<   reprrh   )r    sizescostsr   rn   r   r   r   r   rl   r>   r   r   r(   costs                  r   test_chain_2_growthr   ;  s~   q"EE /,1$K8qbiinnQ"8877B%q/BB.3Dk:!a!e$::%!# 	/u4[ +!!a!e,xr&**2F0E"0EFb*'*	+
 LLu-.	/ 	// 
HT%[M
"#	HT%[M
"#%' !
db ! 9:	/ 	/s   'E"E'0AE,,E6	c           	         t        |       D cg c]"  }t        j                  j                  dd      $ }}dj	                  d t        | dz         D              }t        |       D cg c]
  }|||dz     }}dj	                  |      }d}t        | dz         D ]S  }t               5 }	||   }
| d|
 }t        |gt        d |D               } ||d	|i |t        |	      z  }d d d        U t               5 }	t        |       t        | dz         D ]T  }||   }
| d|
 }t        |g| }t        |d          t        |g|D cg c]  }|j                   c} } ||d	|i V t        |	      }d d d        t        d
       t        d| d       t        d d       ||kD  sJ y c c}w c c}w # 1 sw Y   )xY wc c}w # 1 sw Y   VxY w)NrN   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r2   z%test_chain_sharing.<locals>.<genexpr>W  r   r   rb   ra   r   r   c              3   4   K   | ]  }|j                     y wr   r/   r   s     r   r2   z%test_chain_sharing.<locals>.<genexpr>`  s     1Fa!''1Fr4   r    r5   r8   r9   r:   )r   r   r   r   rj   r	   r   rc   r   r<   r   r#   )r   r    rn   r   r   r   r   rl   rz   r>   r   r   r(   r   r   r{   s                   r   test_chain_sharingr   S  s    ).d	41"))..A
	4B	4ww>eD1Ho>>H*/+6QXa!a% 6E6XXe_F4!8_ 8!# 	8ua[F82fX&B&rGE1F21F,FGD"&g&=#77	8 	88 
	 	15ftax 	'Aa[F82fX&B%b.2.I)A,&rBb,AQWW,ABD"&g&	' *%0	1 
(O	12,
?@	N,-\
:;!22229 
56
	8 	8 -B	1 	1s6   'F/(F4'?F9:AGGG9G	GGc                     ddl m}  d } |       } | d      }t        d      D cg c]  }|j                  |       }}t	               rJ |D cg c]  }|j                          c}|gdz  k(  sJ |j                          y c c}w c c}w )Nr   )
ThreadPoolc                      t        d      \  } }}t               5  t        d| ||       t        d| ||       t        t	                     cd d d        S # 1 sw Y   y xY w)Nzab,bc,cdrJ   rK   )r   r	   r   lenr   )r   rX   rY   s      r   fnz&test_multithreaded_sharing.<locals>.fnx  sU    j)1a!# 	,]Aq!,]Aq!,(*+		, 	, 	,s   /AA      )multiprocessing.poolr   r   apply_asyncr   getclose)r   r   r)   poolrn   fsfs          r   test_multithreaded_sharingr   u  s    /, tHa=D(-b		21$

2
	2B	2 """ AEEG XJO333JJL 
3 s   BB	)r!   N)<rf   r[   collectionsr   typingr   pytest
opt_einsumr   r   r   r   r	   opt_einsum.backendsr
   r   opt_einsum.contractr   opt_einsum.parserr   opt_einsum.sharingr   r   r   opt_einsum.testingr   opt_einsum.typingr   importorskipr   r   numpy_if_foundImportErrorparammarkskipr   cupy_if_foundr   torch_if_foundbackendsr   r`   parametrizestrr+   r?   rB   rH   r]   ru   r|   r   intr   r   r   r   r   r   r   r   r   <module>r      sX        e e 1 ' 0 U U * )   G dNaMfN NM:
	 
 y)H-	&3 	& 	& 	& . *	& H-; 4  .0 H-{ t  .2 H-K D  .6 H-#+ #$ # .#L y)H-#    . *6 H-G+ G$ G .G: H-H H H .H$ +H-S ; 4  . ,& /H-s [ T  . 0&2
 H-! ! ! .!. +H-3S 3; 34 3 . ,3@
  d!V\\'&++2B2BJ`2B2a1bcNd  a FLL0@0@H]0@0^/_`Ma  f!V\\'&++2B2BJb2B2c1deNfs6   $L +M
 2N 4MM
4NN4N=<N=