a
    o=ico1                     @   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y   ejdejjd	d
gdZY n0 zd dlZdZ W n. ey   ejdejjdd
gdZ Y n0 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   n/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/opt_einsum/tests/test_sharing.py<lambda>'       r   )r   r   r   eqbackendc                 C   s~   t | }dd |D }t| g|R  }||d|i}t  ||d|i}W d    n1 s`0    Y  ||k szJ d S )Nc                 S   s   g | ]
}|j qS r   shape.0vr   r   r   
<listcomp>1   r   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 sj0    Y  td td t 4}||d| i ||d| i t|}W d    n1 s0    Y  td td| td	| ||ksJ d S )
N
ab,bc,cd->c                 s   s   | ]}|j V  qd S r   r   r   r   r   r   	<genexpr>?   r   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$    
&&r6   c                 C   s,  d}t |}t|gdd |D R  }td td t &}||d| i t|}W d    n1 sj0    Y  td td t }||d| i W d    n1 s0    Y  t|& ||d| i t|}W d    n1 s0    Y  td td| td	| ||ks(J d S )
Nr*   c                 s   s   | ]}|j V  qd S r   r   r   r   r   r   r+   X   r   z,test_sharing_reused_cache.<locals>.<genexpr>r,   r-   r   r.   r/   r0   r1   r4   r   r   r   test_sharing_reused_cacheT   s&    
&,
&r7   c           	      C   sH  d}t |}t|gdd |D R  }td td t 4}||d| i t|}|t| W d    n1 sx0    Y  td td t &}||d| i t|}W d    n1 s0    Y  t ,}||d| i |t| W d    n1 s0    Y  td td| td	| ||ksDJ d S )
Nr*   c                 s   s   | ]}|j V  qd S r   r   r   r   r   r   r+   r   r   z1test_no_sharing_separate_cache.<locals>.<genexpr>r,   r-   r   r.   r/   r0   )r   r"   r   r2   r   r   updater3   )	r   r   r$   r&   r5   r'   Zcache1r(   Zcache2r   r   r   test_no_sharing_separate_cachen   s*    
,&.r9   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   s   g | ]
}|j qS r   r   r   r   r   r   r!      r   z(test_sharing_nesting.<locals>.<listcomp>c                    s   t   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 sJ W d    n1 s0    Y  dvsJ ddvsJ d|S )	Nr   r      za,b->r   wr   zcache leakager   r   r   )r$   r?   r   result)r   eqsrefsr%   r   r   method1   s    *z%test_sharing_nesting.<locals>.method1c                    s   t   td gR  | d i}td gR  | d i}|d< |d< td|j|j|| d}||  }~~dv sJ dv sJ W d    n1 s0    Y  dvsJ dvsJ d S )Nr=   r      yzzc,d->r>   r@   )r$   rF   rG   rA   r   rB   rD   rC   r%   r   r   method2   s    *z%test_sharing_nesting.<locals>.method2)r   r"   weakrefWeakValueDictionary)r   r$   rI   r   rH   r   test_sharing_nesting   s    rL   c                    s^  t | } fdd|D }t| g| \}}}|d}td td t .}t| g|R d i t|}W d    n1 s0    Y  td td t r}t	t
||D ]H}dd |D }	d	d |D }
d
d|	|}t|g|
R d i qt|}W d    n1 s0    Y  td td| td| ||ksZJ d S )Nc                    s   g | ]}t   |qS r   )
to_backendr   r   r>   r   r   r!      r   z5test_sharing_modulo_commutativity.<locals>.<listcomp>,r,   r-   r   r.   c                 S   s   g | ]}|d  qS )r   r   r   pr   r   r   r!      r   c                 S   s   g | ]}|d  qS )   r   rP   r   r   r   r!      r   {}->{}r/   r0   )r   r"   r   splitr2   r   r   r   	itertoolspermutationszipr3   join)r   r   opsinputsoutput_r5   r'   ZpermutedZpermuted_inputsZpermuted_opsZpermuted_eqr(   r   r>   r   !test_sharing_modulo_commutativity   s,    

&(r]   c           
      C   sp  d}t |\}}}d| d }t||j|j|j}td td t }t .}||||| d |t| W d    n1 s0    Y  t .}||||| d |t| W d    n1 s0    Y  td td t 8}||||| d ||||| d t|}	W d    n1 s(0    Y  td td	| td		|	 |d
 |	d
 kslJ d S )Nz
ab,bc,de->g       @g      ?r,   r-   r>   r.   r/   r0   einsum)
r   r"   r   r   r2   r   r   r8   r   r3   )
r   r   r   rF   Zz1Zz2r&   num_exprs_nosharingr5   num_exprs_sharingr   r   r   test_partial_sharing   s.    ,,(ra   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 s0    Y  t|||D ]$\}}}t||sJ d|qd S )Nzij,jk,klZijklc                    s   g | ]}d   |qS )rS   )r3   )r   r[   )rZ   r   r   r!      r   z/test_sharing_with_constants.<locals>.<listcomp>))r=   rE   )rE      )rb      r   r=   c                    s(   g | ] \}}| v r t jj| n|qS r   nprandomrand)r   iZshp	constantsr   r   r!      r   rR   c                    s,   g | ]$}t |gR   d   d qS )r   r=   r   r   r   )rY   r%   varr   r   r!      r   c                    s&   g | ]}t |gR d  iqS ri   rk   rl   )rj   rY   rm   r   r   r!      r   zerror at {})	enumeratere   rf   rg   r   rW   Zallcloser3   )r   outputs	equationsr'   r(   dimZexpected_dimZ
actual_dimr   )rj   rZ   rY   r%   rm   r   test_sharing_with_constants   s    4rr   size)rE   rb   rc   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t  t| t | d D ]R} | }d
||}t|g|R  }	t|	d  t|g|R  }
|
|d|i qxtd W d    n1 s0    Y  d S )Nc                 S   s   g | ]}t jd d qS r=   rd   r   r\   r   r   r   r!     r   ztest_chain.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   r   rN   r   r   r   r!     r    c                 s   s   | ]}t |V  qd S r   r   r   rh   r   r   r   r+     r   ztest_chain.<locals>.<genexpr>rR   c                    s   g | ]} ||d   qS rt   r   rx   alphabetr   r   r!     r   rO   rS   r   r,   rangerX   r   r2   r3   r   r   rs   r   xsr%   namesrZ   rh   targetr   	path_infor&   r   ry   r   
test_chain   s    
r   )rE   rb   rc   
   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t  t| t | D ]Z} ||d
  }d||}t|g|R  }	t|	d  t|g|R  }
|
|d|i qttd W d    n1 s0    Y  d S )Nc                 S   s   g | ]}t jd d qS rt   rd   ru   r   r   r   r!     r   z test_chain_2.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   r   rN   r   r   r   r!     r   rv   c                 s   s   | ]}t |V  qd S r   rw   rx   r   r   r   r+     r   ztest_chain_2.<locals>.<genexpr>rR   c                    s   g | ]} ||d   qS rt   r   rx   ry   r   r   r!     r   rO   r=   rS   r   r,   r{   r}   r   ry   r   test_chain_2  s    
r   c                 C   s   t | }|d |d  S )Nr^   Z	tensordot)r   )r5   countsr   r   r   _compute_cost*  s    r   c              	      s>  t tdd}g }|D ]}dd t|D }ddd t|d D   fddt|D }d	|}t p}t|D ]H} ||d
  }	d||	}
t|
gdd |D R  }||d| i qx|t| W d    q1 s0    Y  qtdt	| tdt	| t
||D ]\}}td|| qd S )NrR      c                 S   s   g | ]}t jd d qS rt   rd   ru   r   r   r   r!   4  r   z'test_chain_2_growth.<locals>.<listcomp>rv   c                 s   s   | ]}t |V  qd S r   rw   rx   r   r   r   r+   5  r   z&test_chain_2_growth.<locals>.<genexpr>c                    s   g | ]} ||d   qS rt   r   rx   ry   r   r   r!   6  r   rO   r=   rS   c                 s   s   | ]}|j V  qd S r   r   rN   r   r   r   r+   =  r   r   z
sizes = {}z
costs = {}z{}	{})listr|   rX   r   r3   r   appendr   r2   reprrW   )r   sizesZcostsrs   r~   r   rZ   r5   rh   r   r   r&   Zcostr   ry   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 ]r}t X} | }d
||}	t|	gdd |D R  }
|
|d|i |t|7 }W d    q^1 s0    Y  q^t }t| t | d D ]\} | }d
||}	t|	g|R  }t|d  t|	gdd |D R  }
|
|d|i qt|}W d    n1 sj0    Y  td td| td| ||ksJ d S )Nc                 S   s   g | ]}t jd d qS rt   rd   ru   r   r   r   r!   J  r   z&test_chain_sharing.<locals>.<listcomp>rv   c                 s   s   | ]}t |V  qd S r   rw   rx   r   r   r   r+   K  r   z%test_chain_sharing.<locals>.<genexpr>rR   c                    s   g | ]} ||d   qS rt   r   rx   ry   r   r   r!   L  r   rO   r   rS   c                 s   s   | ]}|j V  qd S r   r   rN   r   r   r   r+   T  r   r   c                 s   s   | ]}|j V  qd S r   r   rN   r   r   r   r+   _  r   r,   r/   r0   )r|   rX   r   r3   r   r   r2   r   )rs   r   r~   r   rZ   r_   rh   r5   r   r   r&   r   r`   r   ry   r   test_chain_sharingG  s4    
,(r   c                     sl   ddl m}  dd    }| d fddtdD }t rDJ d	d |D |gd ks`J   d S )
Nr   )
ThreadPoolc                  S   s`   t d\} }}t 6 td| || td| || tt W  d    S 1 sR0    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_asyncru   r   poolr   r   r!   w  r   z.test_multithreaded_sharing.<locals>.<listcomp>   c                 S   s   g | ]}|  qS r   )get)r   fr   r   r   r!   y  r   )Zmultiprocessing.poolr   r|   r   close)r   r'   fsr   r   r   test_multithreaded_sharingi  s    	
r   )3rU   rJ   collectionsr   r   re   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backendsrp   rM   Zparametrizer)   r6   r7   r9   rL   r]   ra   rr   r   r   r   r   r   r   r   r   r   r   <module>   sp      




&


 