B
    ²ô`?  ã               @   sX   d Z ddlZddlZddlmZmZ dd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )zf
Tets a series of opt_einsum contraction paths to ensure the results are the same for different paths
é    N)ÚcontractÚcontract_expressionc           	   C   sP  t  t¡ tddddd W d Q R X t  t¡ tddddƒ W d Q R X t d¡} t  t¡ tddd| d W d Q R X tdddƒ}t  t¡}|tj d	d
¡ƒ W d Q R X dt|j	ƒksÀt
‚t  t¡0}|tj d	d
¡tj d	d
¡tj d	d
¡ƒ W d Q R X dt|j	ƒkst
‚t  t¡&}|tj d	d
d¡tj d
d¡ƒ W d Q R X dt|j	ƒks^t
‚t  t¡&}|tj d	d¡tj d
dd¡ƒ W d Q R X dt|j	ƒks¨t
‚t  t¡4}|tj d	d
¡tj d
d¡tj d	dd¡d W d Q R X dt|j	ƒks t
‚t  t¡(}|tj d	d
¡tj d
d¡dd W d Q R X dt|j	ƒksLt
‚d S )Nz	ab,bc->ac)é   é   )r   é   F)Úoptimize)é*   r   )r   r   )Úoutr   r   z$`ContractExpression` takes exactly 2r   z4Internal error while evaluating `ContractExpression`é   é   ÚF)Úorderz6only valid keyword arguments to a `ContractExpression`)ÚpytestZraisesÚ
ValueErrorr   ÚnpÚemptyÚrandomÚrandÚstrÚvalueÚAssertionError)r	   ÚexprÚerr© r   úO/home/dcms/DCMS/lib/python3.7/site-packages/opt_einsum/tests/test_edge_cases.pyÚtest_contract_expression_checks   s4    
4**8,r   c        	      C   sÀ   t j ddd¡} t j dd¡}t j dd¡}t j d¡}td| ||dd}td| ||d	d}t  ||¡slt‚|| }td
| |||dd}td
| |||d	d}t  ||¡s¬t‚t  ||¡s¼t‚d S )Né   r
   r   r   é
   z	ijk,kl,jlF)r   Tzijk,kl,jl,i->i)r   r   r   r   Úallcloser   )	ÚaÚbÚcÚdÚ
ein_scalarÚ
opt_scalarÚresultÚeinÚoptr   r   r   Útest_broadcasting_contraction7   s    r(   c        	      C   sÄ   t j dddd¡} t j dd¡}t j dd¡}t j dd¡}td| ||dd}td| ||d	d}t  ||¡spt‚|| }td
| |||dd}td
| |||d	d}t  ||¡s°t‚t  ||¡sÀt‚d S )Nr   r
   r   r   é   z
abjk,kl,jlF)r   Tzabjk,kl,jl,ab->ab)r   r   r   r   r   r   )	r   r    r!   r"   r#   r$   r%   r&   r'   r   r   r   Útest_broadcasting_contraction2K   s    r*   c              C   sx   t j ddd¡} t j ddd¡}t j dd¡}t j dd¡}td| |||dd}td| |||d	d}t  ||¡stt‚d S )
Nr   r
   r   r   r)   zajk,kbl,jl,ab->abF)r   T)r   r   r   r   r   r   )r   r    r!   r"   r&   r'   r   r   r   Útest_broadcasting_contraction3_   s    r+   c              C   sH   t  d¡ ddd¡} td| | dd}td| | dd}t  ||¡sDt‚d S )	Né@   r   r   é   zobk,ijk->iojF)r   T)r   ZarangeZreshaper   r   r   )r   r&   r'   r   r   r   Útest_broadcasting_contraction4l   s    r.   c              C   sj   t ddddƒ} | jd d dks$t‚| jd d d	ks:t‚| jd
 d dksPt‚| jd
 d dksft‚d S )Nzab,bc,bd->acd)r
   r   )r   r
   )r   é   r   r   z
bc,ab->bcaéÿÿÿÿFr   zbca,bd->acdZGEMM)r   Zcontraction_listr   )r   r   r   r   Ú,test_can_blas_on_healed_broadcast_dimensionsu   s
    r1   )Ú__doc__Únumpyr   r   Z
opt_einsumr   r   r   r(   r*   r+   r.   r1   r   r   r   r   Ú<module>   s   ,	