o
    2hE3                     @   s  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d zd dlZdZW n e ys   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 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 ee'e%gZ(g dZ)dd eedZ*ej"+de)ej"+de(de,deddfddZ-ej"+de(deddfddZ.ej"+de(deddfddZ/ej"+de(deddfd d!Z0ej"+de(deddfd"d#Z1ej"+de)ej"+de(de,deddfd$d%Z2ej"+de(deddfd&d'Z3ej"+de(deddfd(d)Z4ej"+d*g d+ej"+de(d*e5deddfd,d-Z6ej"+d*g d.ej"+de(d*e5deddfd/d0Z7d1d2 Z8ej"+de(deddfd3d4Z9ej"+d*g d+ej"+de(d*e5deddfd5d6Z:d9d7d8Z;dS ):    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                 C   s   | S N )xr   r   X/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/tests/test_sharing.py<lambda>4   s    r   )r   r   r   eqbackendreturnc                 C   s|   t | }dd |D }t| g|R  }||d|i}t  ||d|i}W d    n1 s/w   Y  ||k s<J d S )Nc                 S      g | ]}|j qS r   shape.0vr   r   r   
<listcomp>>       z&test_sharing_value.<locals>.<listcomp>r   )r   r   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 s4w   Y  td td t }||d| i ||d| i t|}W d    n1 saw   Y  td td| d	 td
| d	 ||ksJ d S )N
ab,bc,cd->c                 s       | ]}|j V  qd S r   r    r"   r   r   r   	<genexpr>L       z(test_complete_sharing.<locals>.<genexpr>(----------------------------------------Without sharing:r   With sharing:Without sharing:  expressionsWith sharing: r   r   printr   r   r   r   r(   r*   cacher+   r,   r   r   r   test_complete_sharingH   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 s4w   Y  td td t }||d| i W d    n1 sVw   Y  t| ||d| i t|}W d    n1 suw   Y  td td| d	 td
| d	 ||ksJ d S )Nr.   c                 s   r/   r   r    r"   r   r   r   r0   e   r1   z,test_sharing_reused_cache.<locals>.<genexpr>r2   r3   r   r4   r5   r6   r7   r8   r:   r   r   r   test_sharing_reused_cachea   s,   


r=   c           	      C   sF  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 saw   Y  t }||d| i |t| W d    n1 sw   Y  td td| d	 td
| d	 ||ksJ d S )Nr.   c                 s   r/   r   r    r"   r   r   r   r0      r1   z1test_no_sharing_separate_cache.<locals>.<genexpr>r2   r3   r   r4   r5   r6   r7   )r   r   r9   r   r   update)	r   r   r(   r*   r;   r+   cache1r,   cache2r   r   r   test_no_sharing_separate_cache{   s0   
rA   c                    sd   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->crD   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(   rG   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 )NrE   r      yzzc,d->rF   rH   )r(   rN   rO   rI   r   rJ   rL   rK   r)   r   r   method2   s   
z%test_sharing_nesting.<locals>.method2)r   weakrefWeakValueDictionary)r   r(   rQ   r   rP   r   test_sharing_nesting   s   rT   c                    s`  t  fddt| D }t| gt| \}}}|d}td td t }t| g|R d i t|}W d    n1 sCw   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| d td| d ||ksJ d S )Nc                 3   s    | ]	}t   |V  qd S r   )
to_backendr#   r   rF   r   r   r0      s    z4test_sharing_modulo_commutativity.<locals>.<genexpr>,r2   r3   r   r4   c                 S      g | ]}|d  qS )r   r   r#   pr   r   r   r%          z5test_sharing_modulo_commutativity.<locals>.<listcomp>c                 S   rX   )   r   rY   r   r   r   r%      r[   z{}->{}r5   r6   r7   )tupler   r   listsplitr9   r   r   r   	itertoolspermutationszipformatjoin)r   r   opsinputsoutput_inputs_listr;   r+   permutedpermuted_inputspermuted_opspermuted_eqr,   r   rF   r   !test_sharing_modulo_commutativity   s.   


rn   c           
      C   sn  d}t |\}}}d| d }t||j|j|j}td td t }t }||||| d |t| W d    n1 sAw   Y  t }||||| d |t| W d    n1 scw   Y  td td t }||||| d ||||| d t|}	W d    n1 sw   Y  td td| d	 td
|	 d	 |d |	d ksJ d S )Nz
ab,bc,de->g       @g      ?r2   r3   rF   r4   r5   r6   r7   einsum)r   r   r!   r9   r   r   r>   r   )
r   r   r   rN   z1z2r*   num_exprs_nosharingr;   num_exprs_sharingr   r   r   test_partial_sharing   s4   
rt   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   )r#   rg   )rf   r   r   r%          z/test_sharing_with_constants.<locals>.<listcomp>))rE   rM   )rM      )rx      r   rE   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   rE   r   r#   r   )re   r)   varr   r   r%     s   , c                    s&   g | ]}t |gR d  iqS r   r   r   )r   re   r   r   r   r%     s   & z	error at )	enumerater{   r|   r}   r   rb   allclose)r   outputs	equationsr+   r,   dimexpected_dim
actual_dimr   )r   rf   re   r)   r   r   test_sharing_with_constants   s   r   size)rM   rx   ry   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t B t| t | d D ]*} | }| d
| }t|g|R  }	t|	d  t|g|R  }
|
|d|i q<td W d    d S 1 svw   Y  d S )Nc                 S      g | ]	}t jd d qS rE   rz   r#   rh   r   r   r   r%     rw   ztest_chain.<locals>.<listcomp>c                 S   r   r   r    rV   r   r   r   r%     r&    c                 s       | ]}t |V  qd S r   r   r#   r~   r   r   r   r0         ztest_chain.<locals>.<genexpr>r\   c                       g | ]
} ||d   qS r   r   r   alphabetr   r   r%         rW   rv   r   r2   rangerd   r   r9   r   r   r   r   xsr)   namesrf   r~   targetr   	path_infor*   r   r   r   
test_chain  s    

"r   )rM   rx   ry   
   c                    s   dd t | D }dd |D }ddd t | d D   fddt | D }d	|}t D t| t | D ].} ||d
  }| d| }t|g|R  }	t|	d  t|g|R  }
|
|d|i q:td W d    d S 1 sxw   Y  d S )Nc                 S   r   r   rz   r   r   r   r   r%   $  rw   z test_chain_2.<locals>.<listcomp>c                 S   r   r   r    rV   r   r   r   r%   %  r&   r   c                 s   r   r   r   r   r   r   r   r0   &  r   ztest_chain_2.<locals>.<genexpr>r\   c                    r   r   r   r   r   r   r   r%   '  r   rW   rE   rv   r   r2   r   r   r   r   r   test_chain_2!  s    

"r   c                 C   s   t | }|d |d  S )Nro   	tensordot)r   )r;   countsr   r   r   _compute_cost6  s   r   c              	      s@  t tdd}g }|D ]m}dd t|D }ddd t|d D   fddt|D }d	|}t 9}t|D ]%} ||d
  }	| d|	 }
t|
gdd |D R  }||d| i q<|t| W d    n1 ssw   Y  qtdt|  tdt|  t	||D ]\}}t| d|  qd S )Nr\      c                 S   r   r   rz   r   r   r   r   r%   @  rw   z'test_chain_2_growth.<locals>.<listcomp>r   c                 s   r   r   r   r   r   r   r   r0   A  r   z&test_chain_2_growth.<locals>.<genexpr>c                    r   r   r   r   r   r   r   r%   B  r   rW   rE   rv   c                 s   r/   r   r    rV   r   r   r   r0   I  r1   r   zsizes = zcosts = 	)
r^   r   rd   r   r   appendr   r9   reprrb   )r   sizescostsr   r   r   rf   r;   r~   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 ]<}t /} | }| d
| }	t|	gtdd |D R  }
|
|d|i |t|7 }W d    n1 sfw   Y  q/t F}t| t | d D ]/} | }| d
| }	t|	g|R  }t|d  t|	gdd |D R  }
|
|d|i qzt|}W d    n1 sw   Y  td td| d td| d ||ksJ d S )Nc                 S   r   r   rz   r   r   r   r   r%   V  rw   z&test_chain_sharing.<locals>.<listcomp>r   c                 s   r   r   r   r   r   r   r   r0   W  r   z%test_chain_sharing.<locals>.<genexpr>r\   c                    r   r   r   r   r   r   r   r%   X  r   rW   r   rv   c                 s   r/   r   r    rV   r   r   r   r0   `  r1   r   c                 S   r   r   r    rV   r   r   r   r%   k  r&   r2   r5   r6   r7   )r   rd   r   r   r]   r   r9   r   )r   r   r   r   rf   rr   r~   r;   r   r   r*   r   rs   r   r   r   test_chain_sharingS  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,cdrB   rC   )r   r   r   lenr   )r   rN   rO   r   r   r   fnx  s   $z&test_multithreaded_sharing.<locals>.fn   c                    s   g | ]}  qS r   )apply_asyncr   r   poolr   r   r%     s    z.test_multithreaded_sharing.<locals>.<listcomp>   c                 S   s   g | ]}|  qS r   )get)r#   fr   r   r   r%     r[   )multiprocessing.poolr   r   r   close)r   r+   fsr   r   r   test_multithreaded_sharingu  s   	
r   )r   N)<r`   rR   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   rU   parametrizestrr-   r<   r=   rA   rT   rn   rt   r   intr   r   r   r   r   r   r   r   r   r   <module>   s    

& 