o
    7?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)Z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   ^/home/www/facesmatcher.com/pyenv/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(   


r9   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>r/   r0   r   r1   r2   r3   r4   r7   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>r/   r0   r   r1   r2   r3   )r   r#   r   r5   r   r   updater6   )	r   r   r%   r'   r8   r(   Zcache1r)   Z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->cr?   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%   rB   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 )Nr@   r      yzzc,d->rA   rC   )r%   rI   rJ   rD   r   rE   rG   rF   r&   r   r   method2   s   
z%test_sharing_nesting.<locals>.method2)r   r#   weakrefWeakValueDictionary)r   r%   rL   r   rK   r   test_sharing_nesting   s   rO   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   rA   r   r   r!          z5test_sharing_modulo_commutativity.<locals>.<listcomp>,r/   r0   r   r1   c                 S      g | ]}|d  qS )r   r   r   pr   r   r   r!          c                 S   rT   )   r   rU   r   r   r   r!      rW   {}->{}r2   r3   )r   r#   r   splitr5   r   r   r   	itertoolspermutationszipr6   join)r   r   opsinputsoutput_r8   r(   ZpermutedZpermuted_inputsZpermuted_opsZpermuted_eqr)   r   rA   r   !test_sharing_modulo_commutativity   s0   



rc   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      ?r/   r0   rA   r1   r2   r3   einsum)
r   r#   r   r   r5   r   r   r;   r   r6   )
r   r   r   rI   Zz1Zz2r'   num_exprs_nosharingr8   num_exprs_sharingr   r   r   test_partial_sharing   s4   
rg   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,klZijklc                    s   g | ]}d   |qS )rY   )r6   )r   ra   )r`   r   r   r!      rR   z/test_sharing_with_constants.<locals>.<listcomp>))r@   rH   )rH      )rh      r   r@   c                    s(   g | ]\}}| v rt jj| n|qS r   nprandomrand)r   iZshp	constantsr   r   r!      s   ( rX   c                    s,   g | ]}t |gR   d   d qS )r   r@   r   r   r   )r_   r&   varr   r   r!      s   , c                    s&   g | ]}t |gR d  iqS ro   rq   rr   )rp   r_   rs   r   r   r!      s   & zerror at {})	enumeraterk   rl   rm   r   r]   Zallcloser6   )r   Zoutputs	equationsr(   r)   dimZexpected_dimZ
actual_dimr   )rp   r`   r_   r&   rs   r   test_sharing_with_constants   s   rw   size)rH   rh   ri   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 r@   rj   r   rb   r   r   r   r!         ztest_chain.<locals>.<listcomp>c                 S   r   r   r   rQ   r   r   r   r!     r"    c                 s       | ]}t |V  qd S r   r   r   rn   r   r   r   r-         ztest_chain.<locals>.<genexpr>rX   c                       g | ]
} ||d   qS rz   r   r   alphabetr   r   r!         rS   rY   r   r/   ranger^   r   r5   r6   r   r   rx   r   xsr&   namesr`   rn   targetr   	path_infor'   r   r   r   
test_chain   s    

"r   )rH   rh   ri   
   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   ry   rz   rj   r{   r   r   r   r!     r|   z test_chain_2.<locals>.<listcomp>c                 S   r   r   r   rQ   r   r   r   r!     r"   r}   c                 s   r~   r   r   r   r   r   r   r-     r   ztest_chain_2.<locals>.<genexpr>rX   c                    r   rz   r   r   r   r   r   r!     r   rS   r@   rY   r   r/   r   r   r   r   r   test_chain_2  s    

"r   c                 C   s   t | }|d |d  S )Nrd   Z	tensordot)r   )r8   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 )NrX      c                 S   ry   rz   rj   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   rz   r   r   r   r   r   r!   6  r   rS   r@   rY   c                 s   r,   r   r   rQ   r   r   r   r-   =  r.   r   z
sizes = {}z
costs = {}z{}	{})listr   r^   r   r6   r   appendr   r5   reprr]   )r   sizesZcostsrx   r   r   r`   r8   rn   r   r   r'   Z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   ry   rz   rj   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>rX   c                    r   rz   r   r   r   r   r   r!   L  r   rS   r   rY   c                 s   r,   r   r   rQ   r   r   r   r-   T  r.   r   c                 s   r,   r   r   rQ   r   r   r   r-   _  r.   r/   r2   r3   )r   r^   r   r6   r   r   r5   r   )rx   r   r   r   r`   re   rn   r8   r   r   r'   r   rf   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=   r>   )r   r#   r   r   lenr   )XYZr   r   r   fnl  s   $z&test_multithreaded_sharing.<locals>.fn   c                    s   g | ]}  qS r   )Z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  rW   )Zmultiprocessing.poolr   r   r   close)r   r(   fsr   r   r   test_multithreaded_sharingi  s   	
r   )3r[   rM   collectionsr   r   rk   ZpytestZ
opt_einsumr   r   r   r   r   r   Zopt_einsum.backendsr	   r
   Zopt_einsum.contractr   Zopt_einsum.parserr   Zopt_einsum.sharingr   r   r   r   Zcupy_if_foundImportErrorparammarkskipr   Ztorch_if_foundbackendsru   rP   Zparametrizer*   r9   r:   r<   rO   rc   rg   rw   r   r   r   r   r   r   r   r   r   r   <module>   sv     




&


 