o
    i 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_backendTFGNU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optimizeuse_blasc                 S      g | ]}|j qS  shape.0vr   r   M/var/www/myenv/lib/python3.10/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   np
empty_liker   tfSession
_TF_CONFIG
as_defaultcloseallclose)r   viewseinoptshpsexprsesstensorflow_viewsr   r   r   test_tensorflow=   s   


r6   	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r9      r=      )r?         r   r8   r9   c                    (   g | ]\}}| v rt jj| n|qS r   r'   randomrandr   ishpr7   r   r   r   Y      ( z2test_tensorflow_with_constants.<locals>.<listcomp>c                 3   $    | ]}| v r| nV  qd S Nr   r   rG   r7   opsvarr   r   	<genexpr>[      " z1test_tensorflow_with_constants.<locals>.<genexpr>r=   r7   r   r   r   c                 s   $    | ]}|d u pt |dkV  qd S )Nr   r	   r   arrayr   r   r   rQ   b   s    numpy)	enumerater'   rD   rE   r   ranger   r)   r*   r+   r,   all_evaluated_constantsr.   r   r"   
isinstanceTensor	r7   eqshapes	non_constres_expr3   res_gotres_got2res_got3r   rN   r   test_tensorflow_with_constantsS   s$   &rg   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 rL   )r]   r)   r^   r   tr   r   r   rQ      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.   )
r   r/   r0   r2   r3   r4   cachetfl1cache_sztfl2r   r   r   test_tensorflow_with_sharingo   s$   
 rr   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.   r]   rs   tensorTensorVariable)r   r/   r0   r2   r3   r1   theano_views
theano_optr   r   r   test_theano   s   
ry   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 )Nr:   r;   rA   c                    rB   r   rC   rF   rI   r   r   r      rJ   z.test_theano_with_constants.<locals>.<listcomp>c                 3   rK   rL   r   rM   rN   r   r   rQ      rR   z-test_theano_with_constants.<locals>.<genexpr>r=   r7   rs   rS   c                 s   rT   )Nrs   rU   rV   r   r   r   rQ      rR   rX   )rY   r'   rD   rE   r   rZ   r   r[   r\   r.   r   rt   r]   rs   ru   rv   r_   r   rN   r   test_theano_with_constants   s   &rz   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   rs   r   c                 s   s    | ]
}t |tjjV  qd S rL   )r]   rs   ru   rv   rh   r   r   r   rQ      s    z+test_theano_with_sharing.<locals>.<genexpr>)r   r&   r   r   r   rj   rk   rl   r[   rm   r'   r.   )	r   r/   r0   r2   r3   rn   thn1rp   thn2r   r   r   test_theano_with_sharing   s   

r}   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   to_cupyr#   r   r   r   r      r%   )
r   r&   r   r   r'   r.   r]   r~   ndarrayasnumpy)r   r/   r0   r2   r3   r1   
cupy_viewscupy_optr   r   r   	test_cupy   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 t	|| sJ d S )Nr:   r;   rA   c                    rB   r   rC   rF   rI   r   r   r      rJ   z,test_cupy_with_constants.<locals>.<listcomp>c                 3   rK   rL   r   rM   rN   r   r   rQ      rR   z+test_cupy_with_constants.<locals>.<genexpr>r=   r7   r~   rS   c                 s   rT   )Nr~   rU   rV   r   r   r   rQ      rR   rX   )rY   r'   rD   rE   r   rZ   r   r[   r\   r.   r~   asarrayr]   r   getr_   r   rN   r   test_cupy_with_constants   s   &r   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.   r]   r   )r   r/   r0   r2   r3   r1   r   r   r   test_jax   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 S )Nr:   r;   rA   c                    rB   r   rC   rF   rI   r   r   r     rJ   z+test_jax_with_constants.<locals>.<listcomp>c                 3   rK   rL   r   rM   rN   r   r   rQ     rR   z*test_jax_with_constants.<locals>.<genexpr>r=   r7   r   rS   c                 s   rT   )Nr   rU   rV   r   r   r   rQ     rR   )
rY   r'   rD   rE   r   rZ   r   r[   r\   r.   )r7   r`   ra   rb   rc   r3   rd   r   rN   r   test_jax_with_constants  s   &r   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->r<   r>   )r?   r9   c                 S      g | ]}t jj| qS r   r'   rD   randnr   sr   r   r   r          z)test_jax_jit_gradient.<locals>.<listcomp>gh㈵>)relc                        |  S rL   r   r/   r3   r   r   <lambda>)      z'test_jax_jit_gradient.<locals>.<lambda>c                 s        | ]\}}|j |j kV  qd S rL   r   r   v1v2r   r   r   rQ   +      z(test_jax_jit_gradient.<locals>.<genexpr>c                 S      g | ]
\}}|d |  qS gMbP?r   r   r   dvr   r   r   r   .      )	r   r   jititempytestapproxgradr[   zip)
r`   ra   r/   x0jit_exprx1	grad_expr
view_grads	new_views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 )
Nr   r   c                 S   r   r   r   r   r   r   r   r   7  r   z*test_autograd_gradient.<locals>.<listcomp>c                    r   rL   r   r   r   r   r   r   <  r   z(test_autograd_gradient.<locals>.<lambda>c                 s   r   rL   r   r   r   r   r   rQ   >  r   z)test_autograd_gradient.<locals>.<genexpr>c                 S   r   r   r   r   r   r   r   r   A  r   )r   autogradr   r[   r   )r`   ra   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 )r9   )chunks)
from_arrayr   xdar   r   r   P  s    )r   importorskipr   r&   r   r   r]   Arrayr'   r.   rW   )r   r/   r0   r2   r3   da_views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   )COO
from_numpyr   r   r   r   r   o  r   )r   r   r   r&   r'   rD   seedchoicer   r   r   r]   r   r.   todense)	r   r/   r$   maskr0   r2   r3   sparse_views
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.   r]   r   r^   cpurX   )r   r/   r0   r2   r3   r1   torch_views	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 )Nr:   r;   rA   c                    rB   r   rC   rF   rI   r   r   r     rJ   z-test_torch_with_constants.<locals>.<listcomp>c                 3   rK   rL   r   rM   rN   r   r   rQ     rR   z,test_torch_with_constants.<locals>.<genexpr>r=   r7   r   rS   c                 s   rT   )Nr   rU   rV   r   r   r   rQ     rR   rX   r   )rY   r'   rD   rE   r   rZ   r   r[   r\   r.   r   r   r]   r   r^   devicetyperX   r   r_   r   rN   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)r8   r9   r=   
opt_einsumautorX   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   dtyper   r   r'   r.   r   float)r   r/   r0   r2   r3   	obj_viewsobj_optr   r   r   test_object_arrays_backend  s   
r   )7rX   r'   r   r   r   r   r   r   r   opt_einsum.contractr   r	   r
   r~   
found_cupyImportErrorr   r)   ConfigProtor+   gpu_optionsallow_growthfound_tensorflowosenvironrs   found_theanor   found_torchr   	found_jaxr   found_autogradtestsmarkskipifparametrizer6   rg   rr   ry   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    




