o
    i eo1                     @   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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 zd dlZdZW n eyb   ejdejjd	d
gdZY nw zd dlZdZ W n ey   ejdejjdd
gdZ Y nw de egZ!g dZ"dd eedZ#ej$de"ej$de!dd Z%ej$de!dd Z&ej$de!dd Z'ej$de!dd Z(ej$de!dd Z)ej$de"ej$de!dd  Z*ej$de!d!d" Z+ej$de!d#d$ Z,ej$d%g d&ej$de!d'd( Z-ej$d%g d)ej$de!d*d+ Z.d,d- Z/ej$de!d.d/ Z0ej$d%g d&ej$de!d0d1 Z1d2d3 Z2dS )4    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                 C   s   | S N )xr   r   L/var/www/myenv/lib/python3.10/site-packages/opt_einsum/tests/test_sharing.py<lambda>'   s    r   )r   r   r   eqbackendc                 C   s~   t | }dd |D }t| g|R  }||d|i}t  ||d|i}W d    n1 s0w   Y  ||k s=J d S )Nc                 S      g | ]}|j qS r   shape.0vr   r   r   
<listcomp>1       z&test_sharing_value.<locals>.<listcomp>r   )r   build_viewsr   r   all)r   r   viewsshapesexprexpectedactualr   r   r   test_sharing_value-   s   
r+   c                 C   s  d}t |}t|gdd |D R  }td td t }||d| i t|}W d    n1 s5w   Y  td td t }||d| i ||d| i t|}W d    n1 sbw   Y  td td| td	| ||ksJ d S )
N
ab,bc,cd->c                 s       | ]}|j V  qd S r   r   r   r   r   r   	<genexpr>?       z(test_complete_sharing.<locals>.<genexpr>(----------------------------------------Without sharing:r   With sharing:Without sharing: {} expressionsWith sharing: {} expressionsr   r$   r   printr   r   formatr   r   r&   r(   cacher)   r*   r   r   r   test_complete_sharing;   s(   


r:   c                 C   s*  d}t |}t|gdd |D R  }td td t }||d| i t|}W d    n1 s5w   Y  td td t }||d| i W d    n1 sWw   Y  t| ||d| i t|}W d    n1 svw   Y  td td| td	| ||ksJ d S )
Nr,   c                 s   r-   r   r   r   r   r   r   r.   X   r/   z,test_sharing_reused_cache.<locals>.<genexpr>r0   r1   r   r2   r3   r4   r5   r8   r   r   r   test_sharing_reused_cacheT   s,   



r;   c           	      C   sD  d}t |}t|gdd |D R  }td td t }||d| i t|}|t| W d    n1 s<w   Y  td td t }||d| i t|}W d    n1 sbw   Y  t }||d| i |t| W d    n1 sw   Y  td td| td	| ||ksJ d S )
Nr,   c                 s   r-   r   r   r   r   r   r   r.   r   r/   z1test_no_sharing_separate_cache.<locals>.<genexpr>r0   r1   r   r2   r3   r4   )r   r$   r   r6   r   r   updater7   )	r   r   r&   r(   r9   r)   cache1r*   cache2r   r   r   test_no_sharing_separate_cachen   s0   

r?   c                    sf   g dt d }dd |D t  fdd fdd}| || d S )	N)ab,bc,cd->aab,bc,cd->bab,bc,cd->crB   r   c                 S   r   r   r   r   r   r   r   r"      r#   z(test_sharing_nesting.<locals>.<listcomp>c                    s   t  I td gR  | d i}td gR  | d i}td|j|j|| d}|d< |d< ~~dv s?J dv sEJ W d    n1 sOw   Y  dvs\J ddvsdJ d|S )	Nr   r      za,b->r   wr   zcache leakager   r   r   )r&   rE   r   result)r   eqsrefsr'   r   r   method1   s   	z%test_sharing_nesting.<locals>.method1c                    s   t  O td gR  | d i}td gR  | d i}|d< |d< td|j|j|| d}||  }~~dv sEJ dv sKJ W d    n1 sUw   Y  dvs`J dvsfJ d S )NrC   r      yzzc,d->rD   rF   )r&   rL   rM   rG   r   rH   rJ   rI   r'   r   r   method2   s   
z%test_sharing_nesting.<locals>.method2)r   r$   weakrefWeakValueDictionary)r   r&   rO   r   rN   r   test_sharing_nesting   s   rR   c                    sZ  t | } fdd|D }t| g| \}}}|d}td td t }t| g|R d i t|}W d    n1 sBw   Y  td td t 9}t	t
||D ]$}dd |D }	d	d |D }
d
d|	|}t|g|
R d i q[t|}W d    n1 sw   Y  td td| td| ||ksJ d S )Nc                    s   g | ]}t   |qS r   )
to_backendr    r   rD   r   r   r"          z5test_sharing_modulo_commutativity.<locals>.<listcomp>,r0   r1   r   r2   c                 S      g | ]}|d  qS )r   r   r    pr   r   r   r"          c                 S   rW   )   r   rX   r   r   r   r"      rZ   {}->{}r3   r4   )r   r$   r   splitr6   r   r   r   	itertoolspermutationszipr7   join)r   r   opsinputsoutput_r9   r)   permutedpermuted_inputspermuted_opspermuted_eqr*   r   rD   r   !test_sharing_modulo_commutativity   s0   



rj   c           
      C   sl  d}t |\}}}d| d }t||j|j|j}td td t }t }||||| d |t| W d    n1 sBw   Y  t }||||| d |t| W d    n1 sdw   Y  td td t }||||| d ||||| d t|}	W d    n1 sw   Y  td td	| td		|	 |d
 |	d
 ksJ d S )Nz
ab,bc,de->g       @g      ?r0   r1   rD   r2   r3   r4   einsum)
r   r$   r   r   r6   r   r   r<   r   r7   )
r   r   r   rL   z1z2r(   num_exprs_nosharingr9   num_exprs_sharingr   r   r   test_partial_sharing   s4   
rp   c                    s   dd}fdd|D }dddh  fddt D tjjd	  fd
d|D }t   fdd|D }W d    n1 sJw   Y  t|||D ]\}}}t||sgJ d|qUd S )Nzij,jk,klijklc                    s   g | ]}d   |qS )r\   )r7   )r    rd   )rc   r   r   r"      rU   z/test_sharing_with_constants.<locals>.<listcomp>))rC   rK   )rK      )rr      r   rC   c                    s(   g | ]\}}| v rt jj| n|qS r   nprandomrand)r    ishp	constantsr   r   r"      s   ( r[   c                    s,   g | ]}t |gR   d   d qS )r   rC   r   r    r   )rb   r'   varr   r   r"      s   , c                    s&   g | ]}t |gR d  iqS rz   r|   r}   )r{   rb   r~   r   r   r"      s   & zerror at {})	enumerateru   rv   rw   r   r`   allcloser7   )r   outputs	equationsr)   r*   dimexpected_dim
actual_dimr   )r{   rc   rb   r'   r~   r   test_sharing_with_constants   s   r   size)rK   rr   rs   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t A t| t | d D ])} | }d
||}t|g|R  }	t|	d  t|g|R  }
|
|d|i q<td W d    d S 1 suw   Y  d S )Nc                 S      g | ]	}t jd d qS rC   rt   r    re   r   r   r   r"         ztest_chain.<locals>.<listcomp>c                 S   r   r   r   rT   r   r   r   r"     r#    c                 s       | ]}t |V  qd S r   r   r    rx   r   r   r   r.         ztest_chain.<locals>.<genexpr>r[   c                       g | ]
} ||d   qS r   r   r   alphabetr   r   r"         rV   r\   r   r0   rangera   r   r6   r7   r   r   r   r   xsr'   namesrc   rx   targetr   	path_infor(   r   r   r   
test_chain   s    

"r   )rK   rr   rs   
   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t C t| t | D ]-} ||d
  }d||}t|g|R  }	t|	d  t|g|R  }
|
|d|i q:td W d    d S 1 sww   Y  d S )Nc                 S   r   r   rt   r   r   r   r   r"     r   z test_chain_2.<locals>.<listcomp>c                 S   r   r   r   rT   r   r   r   r"     r#   r   c                 s   r   r   r   r   r   r   r   r.     r   ztest_chain_2.<locals>.<genexpr>r[   c                    r   r   r   r   r   r   r   r"     r   rV   rC   r\   r   r0   r   r   r   r   r   test_chain_2  s    

"r   c                 C   s   t | }|d |d  S )Nrk   	tensordot)r   )r9   countsr   r   r   _compute_cost*  s   r   c              	      s<  t tdd}g }|D ]l}dd t|D }ddd t|d D   fddt|D }d	|}t 8}t|D ]$} ||d
  }	d||	}
t|
gdd |D R  }||d| i q<|t| W d    n1 srw   Y  qtdt	| tdt	| t
||D ]\}}td|| qd S )Nr[      c                 S   r   r   rt   r   r   r   r   r"   4  r   z'test_chain_2_growth.<locals>.<listcomp>r   c                 s   r   r   r   r   r   r   r   r.   5  r   z&test_chain_2_growth.<locals>.<genexpr>c                    r   r   r   r   r   r   r   r"   6  r   rV   rC   r\   c                 s   r-   r   r   rT   r   r   r   r.   =  r/   r   z
sizes = {}z
costs = {}z{}	{})listr   ra   r   r7   r   appendr   r6   reprr`   )r   sizescostsr   r   r   rc   r9   rx   r   r   r(   costr   r   r   test_chain_2_growth/  s*   
r   c              	      s  dd t | D }ddd t | d D   fddt | D }d|}d	}t | d D ]9}t ,} | }d
||}	t|	gdd |D R  }
|
|d|i |t|7 }W d    n1 scw   Y  q/t E}t| t | d D ].} | }d
||}	t|	g|R  }t|d  t|	gdd |D R  }
|
|d|i qwt|}W d    n1 sw   Y  td td| td| ||ksJ d S )Nc                 S   r   r   rt   r   r   r   r   r"   J  r   z&test_chain_sharing.<locals>.<listcomp>r   c                 s   r   r   r   r   r   r   r   r.   K  r   z%test_chain_sharing.<locals>.<genexpr>r[   c                    r   r   r   r   r   r   r   r"   L  r   rV   r   r\   c                 s   r-   r   r   rT   r   r   r   r.   T  r/   r   c                 s   r-   r   r   rT   r   r   r   r.   _  r/   r0   r3   r4   )r   ra   r   r7   r   r   r6   r   )r   r   r   r   rc   rn   rx   r9   r   r   r(   r   ro   r   r   r   test_chain_sharingG  s:   

r   c                     sl   ddl m}  dd    }| d fddtdD }t r"J d	d |D |gd ks0J   d S )
Nr   )
ThreadPoolc                  S   s`   t d\} }}t  td| || td| || tt W  d    S 1 s)w   Y  d S )Nzab,bc,cdr@   rA   )r   r$   r   r   lenr   )XYZr   r   r   fnl  s   $z&test_multithreaded_sharing.<locals>.fn   c                    s   g | ]}  qS r   )apply_asyncr   r   poolr   r   r"   w  s    z.test_multithreaded_sharing.<locals>.<listcomp>   c                 S   s   g | ]}|  qS r   )get)r    fr   r   r   r"   y  rZ   )multiprocessing.poolr   r   r   close)r   r)   fsr   r   r   test_multithreaded_sharingi  s   	
r   )3r^   rP   collectionsr   r   ru   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   rS   parametrizer+   r:   r;   r?   rR   rj   rp   r   r   r   r   r   r   r   r   r   r   r   <module>   sv     




&


 