o
    2h<                     @   s2  d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZ z-zd dlmZ d dlmZ W n eyJ   d dlmZ d dlmZ Y nw e Zdej_W n	 ey\   Y nw g d	Zejd
ed
eddfddZejdd dhd dhddhgde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d dhd dhddhgde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d dhd dhddhgdee ddfddZ#ejd
ed
eddfdd Z$ejdd dhd dhddhgdee ddfd!d"Z%d3d#d$Z&d3d%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,Z*ejdd dhd dhddhgdee ddfd-d.Z+d3d/d0Z,ejd
ed
eddfd1d2Z-dS )4    )SetN)backendscontractcontract_expressionsharingArrayShapedinfer_backendparse_backend)build_views)ConfigProto)SessionT)z	ab,bc->cazabc,bcd,deazabc,def->fedcbazabc,bcd,df->fazijk,ikjzi,j->ijz	ijk,k->ijz	AB,BC->CAstringreturnc           	      C   s   t d}t d t| }t| g|R ddd}||}dd |D }t| g|R ddi}ttd	}|  ||d|d
 W d    n1 sMw   Y  |	  |
||s^J dd |D }||  d S )Nnumpy
tensorflowFoptimizeuse_blasc                 S      g | ]}|j qS  shape.0vr   r   Y/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/tests/test_backends.py
<listcomp>-       z#test_tensorflow.<locals>.<listcomp>r   Tconfig)backendoutc                 S      g | ]}t |qS r   )r   to_tensorflowr   viewr   r   r   r   8       )pytestimportorskipr   r   
empty_liker   	TFSession
_TF_CONFIG
as_defaultcloseallclose)	r   npviewseinoptshpsexprsesstensorflow_viewsr   r   r   test_tensorflow$   s   




r8   	constants      c           
         s2  t dt d}d}d}h d  \} fddt|D jj||  t|g fdd	td
D R  }t|gR d i}tt	d
  |dd}W d    n1 s_w   Y  tdd	 |jd D srJ ||szJ |dd}||sJ |t}	t|	|jsJ d S )Nr   r   ij,jk,kl->lir;      r?      )rA         r   r:   r;   c                    (   g | ]\}}| v rj j| n|qS r   randomrandr   ishpr9   r0   r   r   r   D      ( z2test_tensorflow_with_constants.<locals>.<listcomp>c                 3   $    | ]}| v r| nV  qd S Nr   r   rI   r9   opsvarr   r   	<genexpr>F      " z1test_tensorflow_with_constants.<locals>.<genexpr>r?   r9   r   r!   c                 s   $    | ]}|d u pt |dkV  qd S )Nr   r	   r   arrayr   r   r   rS   M   s    
)r(   r)   	enumeraterF   rG   r   ranger   r+   r,   r-   all_evaluated_constantsr/   r   r$   
isinstanceTensor)
r9   tfeqshapes	non_constres_expr5   res_gotres_got2res_got3r   r9   r0   rQ   rR   r   test_tensorflow_with_constants<   s(   

&ri   c              	      sD  t d}t d t| }t| g|R ddd}dd |D }t| g|R ddi}ttd	}| D t	 0}||d
di}t
 |u sJJ t|}	|	dksTJ ||d
di}
t||	kscJ W d    n1 smw   Y  W d    n1 s|w   Y  t fdd| D sJ |||sJ |||
sJ d S )Nr   r   Fr   c                 S   r   r   r   r   r   r   r   r   c   r   z0test_tensorflow_with_sharing.<locals>.<listcomp>r   Tr   r!   r   c                 3   s    | ]	}t | jV  qd S rN   )r^   r_   r   tr`   r   r   rS   p   s    z/test_tensorflow_with_sharing.<locals>.<genexpr>)r(   r)   r   r   r   r+   r,   r-   r   shared_intermediatesget_sharing_cachelenr\   valuesr/   )r   r0   r1   r2   r4   r5   r6   cachetfl1cache_sztfl2r   rl   r   test_tensorflow_with_sharing[   s(   


 ru   c           
      C   s   t d}t d}t| }t| g|R ddd}dd |D }t| g|R ddi}||d	di}|||s;J d
d |D }|| }	t|	|jjsOJ d S )Nr   theanoFr   c                 S   r   r   r   r   r   r   r   r   }   r   ztest_theano.<locals>.<listcomp>r   Tr!   c                 S   r#   r   )r   	to_theanor%   r   r   r   r      r'   )	r(   r)   r   r   r   r/   r^   tensorTensorVariable)
r   r0   rv   r1   r2   r4   r5   r3   theano_views
theano_optr   r   r   test_theanov   s   

r|   c           
         s  t dt d}d}d}h d  \} fddt|D jj||  t|g fdd	td
D R  }t|gR d i}|dd}tdd	 |j	d D s[J 
||scJ |dd}
||sqJ |t}	t|	|jjsJ d S )Nr   rv   r<   r=   rC   c                    rD   r   rE   rH   rK   r   r   r      rL   z.test_theano_with_constants.<locals>.<listcomp>c                 3   rM   rN   r   rO   rP   r   r   rS      rT   z-test_theano_with_constants.<locals>.<genexpr>r?   r9   rU   c                 s   rV   )Nrv   rW   rX   r   r   r   rS      rT   )r(   r)   rZ   rF   rG   r   r[   r   r\   r]   r/   r   rw   r^   rx   ry   )
r9   rv   ra   rb   rc   rd   r5   re   rf   rg   r   rh   r   test_theano_with_constants   s    

&r}   c           
         s  t d}t d t| }t| g|R ddd}dd |D }t| g|R ddi}t 0}||d	di}t |u s@J t|}|d
ksJJ ||d	di}	t||ksYJ W d    n1 scw   Y  t	 fdd|
 D swJ |||sJ |||	sJ d S )Nr   rv   Fr   c                 S   r   r   r   r   r   r   r   r      r   z,test_theano_with_sharing.<locals>.<listcomp>r   Tr!   r   c                 3   s    | ]
}t | jjV  qd S rN   )r^   rx   ry   rj   rv   r   r   rS      s    z+test_theano_with_sharing.<locals>.<genexpr>)r(   r)   r   r   r   r   rm   rn   ro   r\   rp   r/   )
r   r0   r1   r2   r4   r5   rq   thn1rs   thn2r   r~   r   test_theano_with_sharing   s"   


r   c           
      C   s   t d}t d}t| }t| g|R ddd}dd |D }t| g|R ddi}||d	di}|||s;J d
d |D }|| }	t|	|jsNJ ||||	sYJ d S )Nr   cupyFr   c                 S   r   r   r   r   r   r   r   r      r   ztest_cupy.<locals>.<listcomp>r   Tr!   c                 S   r#   r   )r   to_cupyr%   r   r   r   r      r'   )	r(   r)   r   r   r   r/   r^   ndarrayasnumpy)
r   r0   r   r1   r2   r4   r5   r3   
cupy_viewscupy_optr   r   r   	test_cupy   s   

r   c           
         s  t dt d}d}d}h d  \} fddt|D jj||  t|g fdd	td
D R  }t|gR d i}|dd}tdd	 |j	d D s[J 
||scJ |dd}
||sqJ ||}	t|	|jsJ 
||	 sJ d S )Nr   r   r<   r=   rC   c                    rD   r   rE   rH   rK   r   r   r      rL   z,test_cupy_with_constants.<locals>.<listcomp>c                 3   rM   rN   r   rO   rP   r   r   rS      rT   z+test_cupy_with_constants.<locals>.<genexpr>r?   r9   rU   c                 s   rV   )Nr   rW   rX   r   r   r   rS      rT   )r(   r)   rZ   rF   rG   r   r[   r   r\   r]   r/   asarrayr^   r   get)
r9   r   ra   rb   rc   rd   r5   re   rf   rg   r   rh   r   test_cupy_with_constants   s"   

&r   c                 C   s   t d}t d t| }t| g|R ddd}dd |D }t| g|R ddi}||d	di}|||s;J t||jsCJ d S )
Nr   jaxFr   c                 S   r   r   r   r   r   r   r   r      r   ztest_jax.<locals>.<listcomp>r   Tr!   )r(   r)   r   r   r   r/   r^   r   )r   r0   r1   r2   r4   r5   r3   r   r   r   test_jax   s   

r   c                    s   t djdd}d}h d  \} fddt|D j|| t|g fdd	td
D R  }t|gR d i}|dd}t	dd	 |j
d D s^J jj|| dk snJ d S )Nr   *   r<   r=   rC   c                    s*   g | ]\}}| v rj |n|qS r   rF   uniformrH   )r9   r   keyr   r   r   
  s   * z+test_jax_with_constants.<locals>.<listcomp>c                 3   rM   rN   r   rO   rP   r   r   rS     rT   z*test_jax_with_constants.<locals>.<genexpr>r?   r9   rU   c                 s   s&    | ]}|d u pt |dV  qd S )Nr   )r	   
startswithrX   r   r   r   rS     s   $ g:0yE>)r(   r)   rF   PRNGKeyrZ   r   r   r[   r   r\   r]   r   sumabs)r9   ra   rb   rc   rd   r5   re   r   )r9   r   r   rQ   rR   r   test_jax_with_constants  s   
&$r   c            
         s   t djdd} d}fdd|D }t| g|R    | } }||  }|t j|ddks;J  fd	d
}||}t	dd t
||D sYJ dd t
||D }||  }	|	|k soJ d S )Nr   r   
ij,jk,kl->r>   r@   )rA   r;   c                    s   g | ]	} j |qS r   r   r   s)r   r   r   r   r         z)test_jax_jit_gradient.<locals>.<listcomp>gh㈵>)relc                        |  S rN   r   r1   r5   r   r   <lambda>&      z'test_jax_jit_gradient.<locals>.<lambda>c                 s        | ]\}}|j |j kV  qd S rN   r   r   v1v2r   r   r   rS   (      z(test_jax_jit_gradient.<locals>.<genexpr>c                 S      g | ]
\}}|d |  qS gMbP?r   r   r   dvr   r   r   r   +      )r(   r)   rF   r   r   jititemapproxgradr\   zip)
ra   rb   r1   x0jit_exprx1	grad_expr
view_grads	new_viewsx2r   )r5   r   r   r   test_jax_jit_gradient  s    

r   c            	         s   t dt d} d}d}fdd|D }t|g|R    | }|  fdd}||}td	d
 t||D s>J dd t||D } | }||k sRJ d S )Nr   autogradr   r   c                    s   g | ]} j j| qS r   )rF   randnr   )r0   r   r   r   6      z*test_autograd_gradient.<locals>.<listcomp>c                    r   rN   r   r   r   r   r   r   ;  r   z(test_autograd_gradient.<locals>.<lambda>c                 s   r   rN   r   r   r   r   r   rS   =  r   z)test_autograd_gradient.<locals>.<genexpr>c                 S   r   r   r   r   r   r   r   r   @  r   )r(   r)   r   r   r\   r   )	r   ra   rb   r1   r   r   r   r   r   r   )r5   r0   r   test_autograd_gradient0  s   

r   c                    s   t d}t d t| }t| g|R ddd}dd |D }t| g|R ddi} fd	d|D }|| }t| jsAJ ||||sLJ t| g|R  }t| js\J ||||sgJ d S )
Nr   z
dask.arrayFr   c                 S   r   r   r   r   r   r   r   r   L  r   ztest_dask.<locals>.<listcomp>r   Tc                    s   g | ]	} j |d dqS )r;   )chunks)
from_arrayr   xdar   r   r   P  r   )	r(   r)   r   r   r   r^   Arrayr/   rY   )r   r0   r1   r2   r4   r5   da_viewsda_optr   r   r   	test_daskE  s   

r   c           
         s$  t d}t d t| }|D ]}|jd |jddg|jdddg}d||< qt| g|R ddd	}d
d |D }t| g|R ddi} fdd|D }|| }	|jsdt 	|dksbJ d S t
|	 jslJ |||	 svJ t| g|R  }	t
|	 jsJ |||	 sJ d S )Nr   sparser   FTg?gffffff?r   r   c                 S   r   r   r   r   r   r   r   r   l  r   ztest_sparse.<locals>.<listcomp>r   c                    s   g | ]} j |qS r   )COO
from_numpyr   r   r   r   r   p  r   g        )r(   r)   r   rF   seedchoicer   r   r   r   r^   r   r/   todense)
r   r0   r1   r&   maskr2   r4   r5   sparse_views
sparse_optr   r   r   test_sparse^  s(   


r   c           	      C   s   t d}t| |jd}|j| g|R  }dd |D }t| g|R ddi}||ddi}|j|| dd |D }|| }t||j	sHJ |j|| d S )	Ntorch)array_functionc                 S   r   r   r   r   r   r   r   r     r   ztest_torch.<locals>.<listcomp>r   Tr!   c                 S   r#   r   )r   to_torchr%   r   r   r   r     r'   )
r(   r)   r   rG   einsumr   testingassert_closer^   r_   )	r   r   r1   r2   r4   r5   r3   torch_views	torch_optr   r   r   
test_torch  s   
r   c           	         s  t dd}d}h d  \} fddt|D j||  t|g fddtd	D R d
di}t|gR d i}|dd}tdd |jd D sXJ j	
|| |dd}j	
|| |t}t|js{J j	
|| d S )Nr   r<   r=   rC   c                    s&   g | ]\}}| v rj | n|qS r   )rG   rH   )r9   r   r   r   r     s   & z-test_torch_with_constants.<locals>.<listcomp>c                 3   rM   rN   r   rO   rP   r   r   rS     rT   z,test_torch_with_constants.<locals>.<genexpr>r?   r!   r9   rU   c                 s   rV   )Nr   rW   rX   r   r   r   rS     rT   )r(   r)   rZ   rG   r   r[   r   r\   r]   r   r   r   r   r^   r_   )	r9   ra   rb   rc   rd   r5   re   rf   rg   r   )r9   rQ   r   rR   r   test_torch_with_constants  s    
,r   c                  C   sD   t d} t| dksJ t| gddksJ t| gd dks J d S )N)r:   r;   r?   
opt_einsumautor   r   )r   r   r   r   +test_auto_backend_custom_array_no_tensordot  s   r   c                 C   s   t d}t| }t| g|R ddd}|jtksJ dd |D }t| g|R ddi}dd |D }t| g|R d	d
i}|jtksGJ |||t	sRJ ||d	d
i}|jtks`J |||t	skJ d S )Nr   Fr   c                 S   r   r   r   r   r   r   r   r     r   z.test_object_arrays_backend.<locals>.<listcomp>r   Tc                 S   s   g | ]}| tqS r   )astypeobjectr%   r   r   r   r     r'   r!   r   )
r(   r)   r   r   dtyper   r   r/   r   float)r   r0   r1   r2   r4   r5   	obj_viewsobj_optr   r   r   test_object_arrays_backend  s   
r   )r   N).typingr   r(   r   r   r   r   r   opt_einsum.contractr   r	   r
   opt_einsum.testingr   r   r   r   r+   ImportErrortensorflow.compat.v1r,   gpu_optionsallow_growthtestsmarkparametrizestrr8   intri   ru   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sh    

#
