o
    e;                     @   s  d dl 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mZ zd dlZdZW n ey3   dZY nw zd dlZe Zdej_dZW n eyO   dZY nw zd dlZdejd< d dlZdZW n eyl   dZY nw zd dlZdZW n ey   dZY nw zd dlZdZW n ey   dZY nw zd dlZdZ W n ey   dZ Y nw g dZ!ej"j#e d	d
ej"$de!dd Z%ej"j#e d	d
ej"$dd dhd dhddhgdd Z&ej"j#e d	d
ej"$de!dd Z'ej"j#e dd
ej"$de!dd Z(ej"j#e dd
ej"$dd dhd dhddhgdd Z)ej"j#e dd
ej"$de!dd Z*ej"j#e dd
ej"$de!dd Z+ej"j#e dd
ej"$dd dhd dhddhgd d! Z,ej"j#e d"d
ej"$de!d#d$ Z-ej"j#e d"d
ej"$dd dhd dhddhgd%d& Z.ej"j#e d"d
d'd( Z/ej"j#e  d)d
d*d+ Z0ej"$de!d,d- Z1ej"$de!d.d/ Z2ej"j#e d0d
ej"$de!d1d2 Z3ej"j#e d0d
ej"$dd dhd dhddhgd3d4 Z4d5d6 Z5ej"$de!d7d8 Z6dS )9    N)backendscontractcontract_expressionhelperssharingShapedinfer_backendparse_backendTFZGNUZMKL_THREADING_LAYER)z	ab,bc->cazabc,bcd,deazabc,def->fedcbazabc,bcd,df->fazijk,ikjzi,j->ijz	ijk,k->ijz	AB,BC->CAzTensorflow not installed.)reasonstringc                 C   s   t | }t| g|R ddd}t|}dd |D }t| g|R ddi}tjtd}|	  ||d|d	 W d    n1 sEw   Y  |
  t||sVJ d
d |D }||  d S )NFoptimizeZuse_blasc                 S      g | ]}|j qS  shape.0vr   r   ND:\Projects\ConvertPro\env\Lib\site-packages\opt_einsum/tests/test_backends.py
<listcomp>D       z#test_tensorflow.<locals>.<listcomp>r   Tconfig
tensorflow)backendoutc                 S      g | ]}t |qS r   )r   to_tensorflowr   viewr   r   r   r   O       )r   build_viewsr   npZ
empty_liker   tfSession
_TF_CONFIG
as_defaultcloseallclose)r   viewseinoptshpsexprsessZtensorflow_viewsr   r   r   test_tensorflow=   s   


r1   	constants      c           	         s  d}d}h d  \} fddt |D tjj||  t|g fddtdD R  }t|gR d	 i}tjt	d

  |dd}W d    n1 sUw   Y  tdd |jd D shJ t||spJ |dd}t||s~J |t}t|tjsJ d S )Nij,jk,kl->lir4      r8      )r:         r   r3   r4   c                    (   g | ]\}}| v rt jj| n|qS r   r$   randomrandr   iZshpr2   r   r   r   Y      ( z2test_tensorflow_with_constants.<locals>.<listcomp>c                 3   $    | ]}| v r| nV  qd S Nr   r   rB   r2   opsvarr   r   	<genexpr>[      " z1test_tensorflow_with_constants.<locals>.<genexpr>r8   r2   r   r   r   c                 s   $    | ]}|d u pt |dkV  qd S )Nr   r	   r   arrayr   r   r   rK   b   s    numpy)	enumerater$   r?   r@   r   ranger   r%   r&   r'   r(   all_evaluated_constantsr*   r   r   
isinstanceTensor	r2   eqshapes	non_constres_expr/   res_gotZres_got2Zres_got3r   rH   r   test_tensorflow_with_constantsS   s$   &r_   c           
   	   C   s0  t | }t| g|R ddd}dd |D }t| g|R ddi}tjtd}| D t	 0}||dd	i}t
 |u sBJ t|}|d
ksLJ ||dd	i}	t||ks[J W d    n1 sew   Y  W d    n1 stw   Y  tdd | D sJ t||sJ t||	sJ d S )NFr   c                 S   r   r   r   r   r   r   r   r   u   r   z0test_tensorflow_with_sharing.<locals>.<listcomp>r   Tr   r   r   r   c                 s   s    | ]	}t |tjV  qd S rF   )rW   r%   rX   r   tr   r   r   rK      s    z/test_tensorflow_with_sharing.<locals>.<genexpr>)r   r#   r   r   r%   r&   r'   r(   r   shared_intermediatesget_sharing_cachelenrU   valuesr$   r*   )
r   r+   r,   r.   r/   r0   cacheZtfl1cache_szZtfl2r   r   r   test_tensorflow_with_sharingo   s$   
 rh   zTheano not installed.c                 C   s   t | }t| g|R ddd}dd |D }t| g|R ddi}||ddi}t||s2J d	d |D }|| }t|tjj	sFJ d S )
NFr   c                 S   r   r   r   r   r   r   r   r      r   ztest_theano.<locals>.<listcomp>r   Tr   theanoc                 S   r   r   )r   	to_theanor    r   r   r   r      r"   )
r   r#   r   r   r$   r*   rW   ri   tensorTensorVariable)r   r+   r,   r.   r/   r-   Ztheano_viewsZ
theano_optr   r   r   test_theano   s   
rm   ztheano not installed.c           	         s   d}d}h d  \} fddt |D tjj||  t|g fddtdD R  }t|gR d	 i}|d
d}tdd |jd
 D sPJ t	||sXJ |dd}t	||sfJ |t
}t|tjjsvJ d S )Nr5   r6   r<   c                    r=   r   r>   rA   rC   r   r   r      rD   z.test_theano_with_constants.<locals>.<listcomp>c                 3   rE   rF   r   rG   rH   r   r   rK      rL   z-test_theano_with_constants.<locals>.<genexpr>r8   r2   ri   rM   c                 s   rN   )Nri   rO   rP   r   r   r   rK      rL   rR   )rS   r$   r?   r@   r   rT   r   rU   rV   r*   r   rj   rW   ri   rk   rl   rY   r   rH   r   test_theano_with_constants   s   &rn   c           	      C   s   t | }t| g|R ddd}dd |D }t| g|R ddi}t 0}||ddi}t |u s7J t|}|d	ksAJ ||ddi}t||ksPJ W d    n1 sZw   Y  td
d |	 D slJ t
||stJ t
||s|J d S )NFr   c                 S   r   r   r   r   r   r   r   r      r   z,test_theano_with_sharing.<locals>.<listcomp>r   Tr   ri   r   c                 s   s    | ]
}t |tjjV  qd S rF   )rW   ri   rk   rl   r`   r   r   r   rK      s    z+test_theano_with_sharing.<locals>.<genexpr>)r   r#   r   r   r   rb   rc   rd   rU   re   r$   r*   )	r   r+   r,   r.   r/   rf   Zthn1rg   Zthn2r   r   r   test_theano_with_sharing   s   

ro   zCupy not installed.c                 C   s   t | }t| g|R ddd}dd |D }t| g|R ddi}||ddi}t||s2J d	d |D }|| }t|tjsEJ t|t	|sPJ d S )
NFr   c                 S   r   r   r   r   r   r   r   r      r   ztest_cupy.<locals>.<listcomp>r   Tr   cupyc                 S   r   r   )r   Zto_cupyr    r   r   r   r      r"   )
r   r#   r   r   r$   r*   rW   rp   ndarrayZasnumpy)r   r+   r,   r.   r/   r-   Z
cupy_viewsZcupy_optr   r   r   	test_cupy   s   
rr   c           	         s  d}d}h d  \} fddt |D tjj||  t|g fddtdD R  }t|gR d	 i}|d
d}tdd |jd
 D sPJ t	||sXJ |dd}t	||sfJ |t
}t|t
jsuJ t	|| sJ d S )Nr5   r6   r<   c                    r=   r   r>   rA   rC   r   r   r      rD   z,test_cupy_with_constants.<locals>.<listcomp>c                 3   rE   rF   r   rG   rH   r   r   rK      rL   z+test_cupy_with_constants.<locals>.<genexpr>r8   r2   rp   rM   c                 s   rN   )Nrp   rO   rP   r   r   r   rK      rL   rR   )rS   r$   r?   r@   r   rT   r   rU   rV   r*   rp   ZasarrayrW   rq   getrY   r   rH   r   test_cupy_with_constants   s   &rt   zjax not installed.c                 C   sx   t | }t| g|R ddd}dd |D }t| g|R ddi}||ddi}t||s2J t|tjs:J d S )	NFr   c                 S   r   r   r   r   r   r   r   r      r   ztest_jax.<locals>.<listcomp>r   Tr   jax)r   r#   r   r   r$   r*   rW   rq   )r   r+   r,   r.   r/   r-   r   r   r   test_jax   s   
rv   c                    s   d}d}h d  \} fddt |D tjj||  t|g fddtdD R  }t|gR d	 i}|d
d}tdd |jd
 D sPJ t	||sXJ d S )Nr5   r6   r<   c                    r=   r   r>   rA   rC   r   r   r     rD   z+test_jax_with_constants.<locals>.<listcomp>c                 3   rE   rF   r   rG   rH   r   r   rK     rL   z*test_jax_with_constants.<locals>.<genexpr>r8   r2   ru   rM   c                 s   rN   )Nru   rO   rP   r   r   r   rK     rL   )
rS   r$   r?   r@   r   rT   r   rU   rV   r*   )r2   rZ   r[   r\   r]   r/   r^   r   rH   r   test_jax_with_constants  s   &rw   c            
         s   d} d}dd |D }t | g|R    | }t }||  }|tj|ddks-J tt fdd}||}td	d
 t||D sKJ dd t||D }||  }	|	|k saJ d S )N
ij,jk,kl->r7   r9   )r:   r4   c                 S      g | ]}t jj| qS r   r$   r?   Zrandnr   sr   r   r   r          z)test_jax_jit_gradient.<locals>.<listcomp>gh㈵>)relc                        |  S rF   r   r+   r/   r   r   <lambda>)      z'test_jax_jit_gradient.<locals>.<lambda>c                 s        | ]\}}|j |j kV  qd S rF   r   r   v1v2r   r   r   rK   +      z(test_jax_jit_gradient.<locals>.<genexpr>c                 S      g | ]
\}}|d |  qS gMbP?r   r   r   Zdvr   r   r   r   .      )	r   ru   ZjititempytestZapproxgradrU   zip)
rZ   r[   r+   x0Zjit_exprx1	grad_expr
view_grads	new_viewsZx2r   r   r   test_jax_jit_gradient  s   
r   zautograd not installed.c                     s   d} d}dd |D }t | g|R    | }t fdd}||}tdd t||D s2J d	d t||D } | }||k sFJ d S )
Nrx   ry   c                 S   rz   r   r{   r|   r   r   r   r   7  r~   z*test_autograd_gradient.<locals>.<listcomp>c                    r   rF   r   r   r   r   r   r   <  r   z(test_autograd_gradient.<locals>.<lambda>c                 s   r   rF   r   r   r   r   r   rK   >  r   z)test_autograd_gradient.<locals>.<genexpr>c                 S   r   r   r   r   r   r   r   r   A  r   )r   autogradr   rU   r   )rZ   r[   r+   r   r   r   r   r   r   r   r   test_autograd_gradient3  s   r   c                    s   t d t| }t| g|R ddd}dd |D }t| g|R ddi} fdd|D }|| }t| js=J t	|t
|sHJ t| g|R  }t| jsXJ t	|t
|scJ d S )	Nz
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 )r4   )chunks)Z
from_arrayr   xdar   r   r   P  s    )r   importorskipr   r#   r   r   rW   Arrayr$   r*   rQ   )r   r+   r,   r.   r/   Zda_viewsZda_optr   r   r   	test_daskF  s   

r   c           	         s   t d t| }|D ]}tjd t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 }|| }t| jsZJ t|| sdJ t	| g|R  }t| jstJ t|| s~J d S )Nsparse*   FTg?gffffff?r   r   c                 S   r   r   r   r   r   r   r   r   k  r   ztest_sparse.<locals>.<listcomp>r   c                    s   g | ]} j |qS r   )COOZ
from_numpyr   r   r   r   r   o  r~   )r   r   r   r#   r$   r?   seedchoicer   r   r   rW   r   r*   Ztodense)	r   r+   r!   maskr,   r.   r/   Zsparse_viewsZ
sparse_optr   r   r   test_sparse^  s    


r   zTorch not installed.c                 C   s   t | }t| g|R ddd}dd |D }t| g|R ddi}||ddi}t||s2J d	d |D }|| }t|tjsEJ t||	 
 sQJ d S )
NFr   c                 S   r   r   r   r   r   r   r   r     r   ztest_torch.<locals>.<listcomp>r   Tr   torchc                 S   r   r   )r   to_torchr    r   r   r   r     r"   )r   r#   r   r   r$   r*   rW   r   rX   cpurR   )r   r+   r,   r.   r/   r-   Ztorch_viewsZ	torch_optr   r   r   
test_torch}  s   
r   c           	         s  d}d}h d  \} fddt |D tjj||  t|g fddtdD R  }t|gR d	 i}|d
d}tdd |jd
 D sPJ t	||sXJ |dd}t	||sfJ |t
}t|tjsuJ |jjdkr| n|  }t	||sJ d S )Nr5   r6   r<   c                    r=   r   r>   rA   rC   r   r   r     rD   z-test_torch_with_constants.<locals>.<listcomp>c                 3   rE   rF   r   rG   rH   r   r   rK     rL   z,test_torch_with_constants.<locals>.<genexpr>r8   r2   r   rM   c                 s   rN   )Nr   rO   rP   r   r   r   rK     rL   rR   r   )rS   r$   r?   r@   r   rT   r   rU   rV   r*   r   r   rW   r   rX   ZdevicetyperR   r   rY   r   rH   r   test_torch_with_constants  s    & r   c                  C   s0   t d} t| dksJ t| gddksJ d S )N)r3   r4   r8   
opt_einsumautorR   r   )r   r   r   r   +test_auto_backend_custom_array_no_tensordot  s   r   c                 C   s   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sCJ t||t	sNJ ||dd	i}|jtks\J t||t	sgJ d S )
NFr   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   Zdtyper   r   r$   r*   r   float)r   r+   r,   r.   r/   Z	obj_viewsZobj_optr   r   r   test_object_arrays_backend  s   
r   )7rR   r$   r   r   r   r   r   r   r   Zopt_einsum.contractr   r	   r
   rp   Z
found_cupyImportErrorr   r%   ZConfigProtor'   Zgpu_optionsZallow_growthZfound_tensorflowosenvironri   Zfound_theanor   Zfound_torchru   Z	found_jaxr   Zfound_autogradtestsmarkZskipifZparametrizer1   r_   rh   rm   rn   ro   rr   rt   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    




