B
    ²ô`o1  ã               @   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 yd dlZdZW n. ek
rÆ   ejdejjd	d
gdZY nX yd dlZdZ W n0 ek
r   ejdejjdd
gdZ Y nX de egZ!ddddddddg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,d-d.d/g¡ej $de!¡d0d1„ ƒƒZ-ej $d,d-d.d/d2g¡ej $de!¡d3d4„ ƒƒZ.d5d6„ Z/ej $de!¡d7d8„ ƒZ0ej $d,d-d.d/g¡ej $de!¡d9d:„ ƒƒZ1d;d<„ 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)ZmarksÚtorchzPyTorch not installed.Únumpyz	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/home/dcms/DCMS/lib/python3.7/site-packages/opt_einsum/tests/test_sharing.pyÚ<lambda>'   ó    r   )r   r   r   ÚeqÚbackendc          	   C   sh   t  | ¡}dd„ |D ƒ}t| f|žŽ }||d|iŽ}tƒ  ||d|iŽ}W d Q R X ||k ¡ sdt‚d S )Nc             S   s   g | ]
}|j ‘qS r   )Úshape)Ú.0Úvr   r   r   ú
<listcomp>1   s    z&test_sharing_value.<locals>.<listcomp>r   )r   Úbuild_viewsr   r   ÚallÚAssertionError)r   r   ÚviewsÚshapesÚexprÚexpectedÚactualr   r   r   Útest_sharing_value-   s    
r'   c          	   C   sØ   d}t  |¡}t|fdd„ |D ƒžŽ }tdƒ tdƒ tƒ }||d| iŽ t|ƒ}W d Q R X tdƒ tdƒ tƒ *}||d| iŽ ||d| iŽ t|ƒ}W d Q R X tdƒ td |¡ƒ td	 |¡ƒ ||ksÔt‚d S )
Nz
ab,bc,cd->c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   ú	<genexpr>?   s    z(test_complete_sharing.<locals>.<genexpr>z(----------------------------------------zWithout sharing:r   zWith sharing:zWithout sharing: {} expressionszWith sharing: {} expressions)r   r   r   Úprintr   r   Úformatr!   )r   r   r"   r$   Úcacher%   r&   r   r   r   Útest_complete_sharing;   s$    
r,   c          	   C   sì   d}t  |¡}t|fdd„ |D ƒžŽ }tdƒ tdƒ tƒ }||d| iŽ t|ƒ}W d Q R X tdƒ tdƒ tƒ }||d| iŽ W d Q R X t|ƒ ||d| iŽ t|ƒ}W d Q R X tdƒ td |¡ƒ td	 |¡ƒ ||ksèt‚d S )
Nz
ab,bc,cd->c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   r(   X   s    z,test_sharing_reused_cache.<locals>.<genexpr>z(----------------------------------------zWithout sharing:r   zWith sharing:zWithout sharing: {} expressionszWith sharing: {} expressions)r   r   r   r)   r   r   r*   r!   )r   r   r"   r$   r+   r%   r&   r   r   r   Útest_sharing_reused_cacheT   s&    

r-   c       	   	   C   s  d}t  |¡}t|fdd„ |D ƒžŽ }tdƒ tdƒ tƒ *}||d| iŽ t|ƒ}| t|ƒ¡ W d Q R X tdƒ tdƒ tƒ }||d| iŽ t|ƒ}W d Q R X tƒ "}||d| iŽ | t|ƒ¡ W d Q R X tdƒ td |¡ƒ td	 |¡ƒ ||kst‚d S )
Nz
ab,bc,cd->c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   r(   r   s    z1test_no_sharing_separate_cache.<locals>.<genexpr>z(----------------------------------------zWithout sharing:r   zWith sharing:zWithout sharing: {} expressionszWith sharing: {} expressions)	r   r   r   r)   r   r   Úupdater*   r!   )	r   r   r"   r$   r+   r%   Zcache1r&   Zcache2r   r   r   Útest_no_sharing_separate_cachen   s*    
r/   c                sj   ddddg‰t  ˆd ¡}dd„ |D ƒ‰t ¡ ‰‡ ‡‡‡fdd„‰‡ ‡‡‡‡fd	d
„}ˆ|ƒ ||ƒ d S )Nzab,bc,cd->azab,bc,cd->bzab,bc,cd->cr   c             S   s   g | ]
}|j ‘qS r   )r   )r   r   r   r   r   r   Ž   s    z(test_sharing_nesting.<locals>.<listcomp>c          	      s´   t ƒ „ tˆd fˆžŽ | dˆ iŽ}tˆd fˆžŽ | dˆ iŽ}td|j|jƒ||ˆ d}|ˆd< |ˆd< ~~dˆkszt‚dˆks†t‚W d Q R X dˆks tdƒ‚dˆks°tdƒ‚|S )	Nr   r   é   za,b->)r   Úwr   zcache leakage)r   r   r   r!   )r"   r1   r   Úresult)r   ÚeqsÚrefsr#   r   r   Úmethod1‘   s    z%test_sharing_nesting.<locals>.method1c          	      s¸   t ƒ  tˆd fˆžŽ | dˆ iŽ}tˆd fˆžŽ | dˆ iŽ}|ˆd< |ˆd< td|j|jƒ||ˆ d}|ˆ| ƒ }~~dˆks†t‚dˆks’t‚W d Q R X dˆks¨t‚dˆks´t‚d S )Nr0   r   é   ÚyÚzzc,d->)r   )r   r   r   r!   )r"   r7   r8   r2   )r   r3   r5   r4   r#   r   r   Úmethod2Ÿ   s    z%test_sharing_nesting.<locals>.method2)r   r   ÚweakrefÚWeakValueDictionary)r   r"   r9   r   )r   r3   r5   r4   r#   r   Útest_sharing_nestingŠ   s    r<   c          	      s4  t  | ¡}‡ fdd„|D ƒ}t| g| ƒ\}}}| d¡}tdƒ tdƒ tƒ "}t| f|ždˆ iŽ t|ƒ}W d Q R X tdƒ tdƒ tƒ j}xZt 	t
||ƒ¡D ]F}dd„ |D ƒ}	d	d„ |D ƒ}
d
 d |	¡|¡}t|f|
ždˆ iŽ q¢W t|ƒ}W d Q R X tdƒ td |¡ƒ td |¡ƒ ||ks0t‚d S )Nc                s   g | ]}t ˆ  |ƒ‘qS r   )Ú
to_backend)r   r   )r   r   r   r   µ   s    z5test_sharing_modulo_commutativity.<locals>.<listcomp>ú,z(----------------------------------------zWithout sharing:r   zWith sharing:c             S   s   g | ]}|d  ‘qS )r   r   )r   Úpr   r   r   r   Ã   s    c             S   s   g | ]}|d  ‘qS )é   r   )r   r?   r   r   r   r   Ä   s    z{}->{}zWithout sharing: {} expressionszWith sharing: {} expressions)r   r   r   Úsplitr)   r   r   r   Ú	itertoolsÚpermutationsÚzipr*   Újoinr!   )r   r   ÚopsÚinputsÚoutputÚ_r+   r%   ZpermutedZpermuted_inputsZpermuted_opsZpermuted_eqr&   r   )r   r   Ú!test_sharing_modulo_commutativity±   s,    

rJ   c       
   	   C   s2  d}t  |¡\}}}d| d }t||j|j|jƒ}tdƒ tdƒ tƒ }tƒ $}||||| d | t|ƒ¡ W d Q R X tƒ $}||||| d | t|ƒ¡ W d Q R X tdƒ tdƒ tƒ .}||||| d ||||| d t|ƒ}	W d Q R X tdƒ td 	|¡ƒ td	 	|	¡ƒ |d
 |	d
 ks.t
‚d S )Nz
ab,bc,de->g       @g      ð?z(----------------------------------------zWithout sharing:)r   zWith sharing:zWithout sharing: {} expressionszWith sharing: {} expressionsÚeinsum)r   r   r   r   r)   r   r   r.   r   r*   r!   )
r   r   r   r7   Zz1Zz2r$   Únum_exprs_nosharingr+   Únum_exprs_sharingr   r   r   Útest_partial_sharingÏ   s.    rN   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 Q R X x4t|||ƒD ]$\}}}t ||¡s˜td |¡ƒ‚q˜W d S )Nzij,jk,klZijklc                s   g | ]}d   ˆ |¡‘qS )z{}->{})r*   )r   rH   )rG   r   r   r   ñ   s    z/test_sharing_with_constants.<locals>.<listcomp>))r0   r6   )r6   é   )rO   é   r   r0   c                s(   g | ] \}}|ˆ kr t jj|Ž n|‘qS r   )ÚnpÚrandomÚrand)r   ÚiZshp)Ú	constantsr   r   r   ô   s    r@   c                s*   g | ]"}t |fˆžŽ ˆ d  ˆˆ d ƒ‘qS )r   r0   )r   )r   r   )rF   r#   Úvarr   r   r   ÷   s    c                s$   g | ]}t |fˆžd ˆ iŽˆƒ‘qS )rU   )r   )r   r   )rU   rF   rV   r   r   r   ú   s    zerror at {})	Ú	enumeraterQ   rR   rS   r   rD   Zallcloser!   r*   )r   ÚoutputsÚ	equationsr%   r&   ZdimZexpected_dimZ
actual_dimr   )rU   rG   rF   r#   rV   r   Útest_sharing_with_constantsí   s     rZ   Úsizer6   rO   rP   c          	      sâ   dd„ t | ƒD ƒ}dd„ |D ƒ}d dd„ t | d ƒD ƒ¡‰ ‡ fdd„t | ƒD ƒ}d	 |¡}tƒ v t|ƒ x^t | d ƒD ]N}ˆ | }d
 ||¡}t|f|žŽ }	t|	d ƒ t|f|žŽ }
|
|d|iŽ qzW tdƒ W d Q R X d S )Nc             S   s   g | ]}t j d d ¡‘qS )r0   )rQ   rR   rS   )r   rI   r   r   r   r     s    ztest_chain.<locals>.<listcomp>c             S   s   g | ]
}|j ‘qS r   )r   )r   r   r   r   r   r     s    Ú c             s   s   | ]}t |ƒV  qd S )N)r   )r   rT   r   r   r   r(     s    ztest_chain.<locals>.<genexpr>r@   c                s   g | ]}ˆ ||d  … ‘qS )r0   r   )r   rT   )Úalphabetr   r   r     s    r>   z{}->{}r   z(----------------------------------------)ÚrangerE   r   r)   r*   r   r   )r[   r   Úxsr#   ÚnamesrG   rT   Útargetr   Ú	path_infor$   r   )r]   r   Ú
test_chain   s    
rc   é
   c          	      sæ   dd„ t | ƒD ƒ}dd„ |D ƒ}d dd„ t | d ƒD ƒ¡‰ ‡ fdd„t | ƒD ƒ}d	 |¡}tƒ z t|ƒ xbt | ƒD ]V}ˆ ||d
 … }d ||¡}t|f|žŽ }	t|	d ƒ t|f|žŽ }
|
|d|iŽ qvW tdƒ W d Q R X d S )Nc             S   s   g | ]}t j d d ¡‘qS )r0   )rQ   rR   rS   )r   rI   r   r   r   r     s    z test_chain_2.<locals>.<listcomp>c             S   s   g | ]
}|j ‘qS r   )r   )r   r   r   r   r   r     s    r\   c             s   s   | ]}t |ƒV  qd S )N)r   )r   rT   r   r   r   r(     s    ztest_chain_2.<locals>.<genexpr>r@   c                s   g | ]}ˆ ||d  … ‘qS )r0   r   )r   rT   )r]   r   r   r     s    r>   r0   z{}->{}r   z(----------------------------------------)r^   rE   r   r)   r*   r   r   )r[   r   r_   r#   r`   rG   rT   ra   r   rb   r$   r   )r]   r   Útest_chain_2  s    
re   c             C   s   t | ƒ}|d |d  S )NrK   Z	tensordot)r   )r+   Úcountsr   r   r   Ú_compute_cost*  s    rg   c          
      s4  t tddƒƒ}g }xÎ|D ]Æ}dd„ t|ƒD ƒ}d dd„ t|d ƒD ƒ¡‰ ‡ fdd„t|ƒD ƒ}d	 |¡}tƒ h}xRt|ƒD ]F}ˆ ||d
 … }	d ||	¡}
t|
fdd„ |D ƒžŽ }||d| iŽ q|W | t|ƒ¡ W d Q R X qW td t	|ƒ¡ƒ td t	|ƒ¡ƒ x(t
||ƒD ]\}}td ||¡ƒ qW d S )Nr@   é   c             S   s   g | ]}t j d d ¡‘qS )r0   )rQ   rR   rS   )r   rI   r   r   r   r   4  s    z'test_chain_2_growth.<locals>.<listcomp>r\   c             s   s   | ]}t |ƒV  qd S )N)r   )r   rT   r   r   r   r(   5  s    z&test_chain_2_growth.<locals>.<genexpr>c                s   g | ]}ˆ ||d  … ‘qS )r0   r   )r   rT   )r]   r   r   r   6  s    r>   r0   z{}->{}c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   r(   =  s    r   z
sizes = {}z
costs = {}z{}	{})Úlistr^   rE   r   r*   r   Úappendrg   r)   ÚreprrD   )r   ÚsizesZcostsr[   r_   r`   rG   r+   rT   ra   r   r$   Zcostr   )r]   r   Útest_chain_2_growth/  s$    

rm   c          
      s‚  dd„ t | ƒD ƒ}d dd„ t | d ƒD ƒ¡‰ ‡ fdd„t | ƒD ƒ}d |¡}d	}xlt | d ƒD ]\}tƒ L}ˆ | }d
 ||¡}	t|	fdd„ |D ƒžŽ }
|
|d|iŽ |t|ƒ7 }W d Q R X q`W tƒ €}t|ƒ xht | d ƒD ]X}ˆ | }d
 ||¡}	t|	f|žŽ }t|d ƒ t|	fdd„ |D ƒžŽ }
|
|d|iŽ qÞW t|ƒ}W d Q R X tdƒ td |¡ƒ td |¡ƒ ||ks~t‚d S )Nc             S   s   g | ]}t j d d ¡‘qS )r0   )rQ   rR   rS   )r   rI   r   r   r   r   J  s    z&test_chain_sharing.<locals>.<listcomp>r\   c             s   s   | ]}t |ƒV  qd S )N)r   )r   rT   r   r   r   r(   K  s    z%test_chain_sharing.<locals>.<genexpr>r@   c                s   g | ]}ˆ ||d  … ‘qS )r0   r   )r   rT   )r]   r   r   r   L  s    r>   r   z{}->{}c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   r(   T  s    r   c             s   s   | ]}|j V  qd S )N)r   )r   r   r   r   r   r(   _  s    z(----------------------------------------zWithout sharing: {} expressionszWith sharing: {} expressions)	r^   rE   r   r*   r   rg   r)   r   r!   )r[   r   r_   r`   rG   rL   rT   r+   ra   r   r$   rb   rM   r   )r]   r   Útest_chain_sharingG  s4    
rn   c                 sl   ddl m}  dd„ ‰ ˆ ƒ }| dƒ‰‡ ‡fdd„tdƒD ƒ}tƒ rDt‚d	d„ |D ƒ|gd ks`t‚ˆ ¡  d S )
Nr   )Ú
ThreadPoolc           	   S   sH   t  d¡\} }}tƒ ( td| ||ƒ td| ||ƒ ttƒ ƒS Q R X d S )Nzab,bc,cdzab,bc,cd->azab,bc,cd->b)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_async)r   rI   )rt   Ú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  s    )Zmultiprocessing.poolro   r^   r   r!   Úclose)ro   r%   Úfsr   )rt   rv   r   Útest_multithreaded_sharingi  s    	
r|   )3rB   r:   Úcollectionsr   r   rQ   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ÚbackendsrY   r=   Zparametrizer'   r,   r-   r/   r<   rJ   rN   rZ   rc   re   rg   rm   rn   r|   r   r   r   r   Ú<module>   sd      
'!