U
    #c                      @   s   d dl Z d dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZmZ dZedddddddddddgZeeeeZG d	d
 d
ZG dd dZdd ZdS )    N)assert_assert_equalassert_array_equalassert_almost_equalassert_raisessuppress_warningsassert_raises_regexassert_allcloseZ
abcdefghij               c                   @   sv  e Zd Zdd Zdd Ze dVddZdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zej d4ej!d5 ej!d6  d7d8 Z"d9d: Z#d;d< Z$dWd>d?Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+dLdM Z,dNdO Z-dPdQ Z.dRdS Z/dTdU Z0d=S )X
TestEinsumc              
   C   sj  dD ]^}t ttj|d t ttjd|d t ttjdd|d t ttjddd|d t ttjddd|d t ttjddd	|d
 t ttjddd|d t ttjddd|d t ttjfdd|i t ttjddd|d t ttjdddgdg|d t ttjddg|d t ttjdd|d t ttjdddg|d t ttjdd|d t ttjdddg|d t ttjdd|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddg|d t ttjdddgddgg|d t ttjd td!d"d#|d t ttjd$td!d"d#|d t ttjdtd!d"d#|d t ttjd%dd&gdd&ggtd'd"d"|d ttd(( td)}td*}td+|| W 5 Q R X t ttjd%td!d,d&|d-d. qd S )/NTFoptimize r   test)outr   Worderr   Zblah)castingr   Zbad_data_type)dtyper   )Zbad_argr   )?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNr   ,iijz...izi...jzi...zij...zi..z.i...zj->..jzj->.j...zi%...z...j$zi->&zi->ijzij->jijiir   r
   r   ii->izi->i   r   z'b')r   r   r   r   r   )r   r   r   z	aabcb,abcd)r   r   )	r   
ValueErrornpeinsum	TypeErrorarangereshaper   ones)selfdo_optab r.   @/tmp/pip-unpacked-wheel-b2rbor69/numpy/core/tests/test_einsum.pytest_einsum_errors   s    

 
  

 zTestEinsum.test_einsum_errorsc              	      s  dD ]v}t d d _t jd |d}t|j k t j tg|d}t|j k t jd |d}t|j k t|  t j ddg|d}t|j k t|  t jd |d}t|jd	  d
 jd	< t jd |d}t|jd	   t d d _t jd |d}t|j k t| j	 t j ddg|d}t|j k t| j	 t d d _t jd |d}t|j k t| fddt
dD  t j ddgdg|d}t|j k t| fddt
dD  t d d _t jd |d}t|j k t|dd  D  t j tddgtdg|d}t|j k t|dd  D  t jd |d}t|j k t|dd  dddD  t j ddtgtdg|d}t|j k t|dd  dddD  t jd |d}t|j k t| fddt
dD  t j tddgdtg|d}t|j k t| fddt
dD  t jd |d}t|j k t| fd dt
dD  t j dddgddg|d}t|j k t| fd!dt
dD  t jd" |d}t|j k t| fd#dt
dD  t j ddtgdtg|d}t|j k t| fd$dt
dD  t jd% |d}t|j k t| fd&dt
dD  t j dtdgdtg|d}t|j k t| fd'dt
dD  t jd( |d}t|j k t|d)d  dddD  t j dtdgtdg|d}t|j k t|d*d  dddD  t d d _t jd+ |d}t|j k t| fd,dt
dD  t j dddgdg|d}t|j k t| fd-dt
dD  t d. d/ _t jd0 |d}t|j k t| dd t j dddgdddg|d}t|j k t| dd qd S )1Nr   r   r
   r   z...r   r   r   r    Z	WRITEABLEFZji	   )r   r   r   c                    s   g | ]} ||f qS r.   r.   .0r   r,   r.   r/   
<listcomp>   s     z0TestEinsum.test_einsum_views.<locals>.<listcomp>r   c                    s   g | ]} ||f qS r.   r.   r3   r5   r.   r/   r6      s        )r   r   r   z...ii->...ic                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   xr.   r/   r6      s     ;TestEinsum.test_einsum_views.<locals>.<listcomp>.<listcomp>r   ranger4   r.   r8   r/   r6      s     c                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   r8   r.   r/   r6      s     r:   r   r;   r=   r.   r8   r/   r6      s     zii...->...ic                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   r8   r.   r/   r6      s     r:   r   r;   r=   r.   r8   r/   r6      s   r
   c                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   r8   r.   r/   r6      s     r:   r   r;   r=   r.   r8   r/   r6      s   z...ii->i...c                    s   g | ]} d d ||f qS Nr.   r3   r5   r.   r/   r6      s     c                    s   g | ]} d d ||f qS r>   r.   r3   r5   r.   r/   r6      s     zjii->ijc                    s   g | ]} d d ||f qS r>   r.   r3   r5   r.   r/   r6      s     c                    s   g | ]} d d ||f qS r>   r.   r3   r5   r.   r/   r6      s     zii...->i...c                    s(   g | ] }  d dddd||f qS r
   r   r    N	transposer3   r5   r.   r/   r6      s     c                    s(   g | ] }  d dddd||f qS r?   r@   r3   r5   r.   r/   r6      s     zi...i->i...c                    s(   g | ] }  d dddd||f qS r    r   r
   Nr@   r3   r5   r.   r/   r6      s     c                    s(   g | ] }  d dddd||f qS rB   r@   r3   r5   r.   r/   r6      s     zi...i->...ic                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   r8   r.   r/   r6      s     r:   r   r;   r=   r.   r8   r/   r6      s   c                    s"   g | ]  fd dt dD qS )c                    s   g | ]} ||f qS r.   r.   r3   r8   r.   r/   r6      s     r:   r   r;   r=   r.   r8   r/   r6      s   ziii->ic                    s   g | ]} |||f qS r.   r.   r3   r5   r.   r/   r6      s     c                    s   g | ]} |||f qS r.   r.   r3   r5   r.   r/   r6      s        )r
   r   r   zijk->jik)r$   r'   shaper%   r   baseEllipsisr   flagsTr<   rA   Zswapaxes)r*   r+   r-   r.   r5   r/   test_einsum_viewsg   s    













zTestEinsum.test_einsum_viewsFc                 C   s  t |}tddD ]b}t j||d}tt jd||dt j|dd| tt j|dgg |dt j|dd| qtddD ]t}t jd	| |dd
d|}tt jd||dt j|dd| tt j|t	dgt	g|dt j|dd| qtddD ]t}t jd
| |dd
|}tt jd||dt j|dd| tt j|dt	gt	g|dt j|dd| qtddD ]v}t jd	| |dd
d|}tt jd||dt j|dd| tt j|dt	gt	g|dt j|dd| qtddD ]}t j|| |d||}tt jd||dt 
|| tt j|ddg|dt 
|| t ddg}tt j|||dt 
|| tt j|t||dt 
|| qtt dddd tddD ]}t jd| |dd|}t jd	| |dd
d|}tt jd|||dt || tt j|t	g|t	g|dt || qtddD ]z}t jd	| |dd
d|}t j||d}tt jd|||dt || tt j|t	dg|t	dg|dt || qptddD ]}t j|d d
 |d|dd
}t j||d}tt jd|||dt |j|jj tt j|dt	g|dt	g|dt |j|jj qtddD ]p}t jd|dd }t j||dd }tt jd|||dt || tt j|dg|dg|dt || qt }|t j tddD ]}t jd| |dd|}t j||d}tt jd|||dt || tt j|ddg|dg|dt || t jd|d}t jd|||dd|d t|t |d|d| d|d< t j|ddg|dg|dd|d t|t |d|d| qtddD ],}t jd| |dd|}t j||d}tt jd|j|j|dt |j|j tt j|jddg|jdg|dt |j|j t jd|d}t jd|j|j|dd|d t|t |jd|jd| d|d< t j|jddg|jdg|dd|d t|t |jd|jd| q8tddD ]}|dk s|dkrrt jd| |dd|}t j|d	 |d|d	}tt jd|||dt || tt j|ddg|dd
g|dt || qrtddD ]}t jd| |dd|}t j|d	 |d|d	}t jd |ddd	}t jd|||dd|d t|t |d|d| d|d< t j|ddg|dd
g|dd|d t|t |d|d| qt jd|ddd}t jd!|ddd"}t jd#|dd"d	}|dk	rtt jd$||||d||| tt j|ddg|dd
g|d
dg|d||| t jd%|ddd	}	t jd$||||	dd|d |d|d}
|
|d|}
t|	|
 d|	d< t j|ddg|dd
g|d
dg|	dd|d
 |d|d}
|
|d|}
t|	|
 t |t dkrt jd&|dddd"}t jd |dddd
}tt d'||t j||ddgddgfd( tt |ddd
g|dddgd
dgt j||ddgddgfd( t jd)|dd"d
}t jd*|||dd|d t|t j|d|dddgddgfd(| d|d< t j|ddd
g|dddgd
dg|dd|d	 t|t j|d|dddgddgfd(| W 5 Q R X |jd+krd,nt |jd }t jdd|ddd-ddg|d}t jdd.d/|ddddg|d}t d0d0d1d0d0d1d0d0g}tt jd2|||d3d|d4t t |dk|dk|dk tt j|dg|dg|dgdgd3dd5	t t |dk|dk|dk t jd6|d}tt d7d|dt |  tt dg |dgg dt |  tt d8|ddt |  tt |dgdg g dt |  tdd9D ]}t j||d}t |jdkrtt jd:|||dt || tt jd;|||dt || tt jd<|d
|dd
|  tt jd=d
||dd
|  tt jd8|d
|dd
t |  tt jd7d
||dd
t |  tt jd:|dd  |d d |dt |dd  |d d  tt jd;|dd  |d d |dt |dd  |d d  tt jd<|dd  d
|dd
|dd    tt jd=d
|dd  |dd
|dd    tt jd8|dd  d
|dd
t |dd    tt jd7d
|dd  |dd
t |dd    qt jd6td}t jd||dd5}t|t | t|jt | t j|dgg |dd5}t|t | t|jt | t d
d }t dd
d
d }t dd
d
d> }tt d?|||d@ t dA}t dB}tt jdC||d0dt jdC||d1d tt jdC||d0ddDgd
  t dEdFg}t dGg}tt jdH||d1ddI tt jdH||d0ddI t dJd
 }t dKd
 }dLD ]L}tt jdM|||dt jdM|||d tt jdM|||dt dJdN q.t j d
|d}t jd
|d}tt jdO|||ddEg tt jdP|||ddEg tt jdQ|||ddEg d S )RNr       r   i->r   r!   )Zaxisr   r   r
   r   z	...i->...z	i...->...r   z..., ...r      z
...i, ...i   z
i..., i...i,jzij, jzij,jf8Zunsafe)r   r   r   r   .zji,j   f2zij,jkrC      r      zij,jk,kl   <   zijk, jil -> klZaxes
   zijk,jil->klu   g      @g        TFzi,i,i->i?)r   r   r   )r   r   r2   ,i->i,->   z...,...zi,ii,->i,i->i   z	z,mz,zm->   )rX   r
   r    r
   zij,ij->jg      $@g       @      @g      @zi, ig      4@)r    r   r   r   r   ...ij,...jk->...ikg      ?zji,i->zi,ij->zij,i->)!r$   r   r<   r'   r   r%   sumastyper(   rF   traceZasarraylistmultiplyinnerrH   outerr   filterZComplexWarningdot	tensordotkindZiinfomaxarraylogical_anditemsizeobjectr)   r   fullZeye)r*   r   r+   nr,   Znp_arrayr-   supcr"   tgtZneg_valpqrr9   yr   r.   r.   r/   check_einsum_sums   s   


 
 




      
  


  
  
  
"         $$
 """",,



zTestEinsum.check_einsum_sumsc                 C   s   |  d d S )Ni1r   r*   r.   r.   r/   test_einsum_sums_int8  s    z TestEinsum.test_einsum_sums_int8c                 C   s   |  d d S )Nu1r   r   r.   r.   r/   test_einsum_sums_uint8   s    z!TestEinsum.test_einsum_sums_uint8c                 C   s   |  d d S )Ni2r   r   r.   r.   r/   test_einsum_sums_int16#  s    z!TestEinsum.test_einsum_sums_int16c                 C   s   |  d d S )Nu2r   r   r.   r.   r/   test_einsum_sums_uint16&  s    z"TestEinsum.test_einsum_sums_uint16c                 C   s   |  d |  dd d S )Ni4Tr   r   r.   r.   r/   test_einsum_sums_int32)  s    
z!TestEinsum.test_einsum_sums_int32c                 C   s   |  d |  dd d S )NZu4Tr   r   r.   r.   r/   test_einsum_sums_uint32-  s    
z"TestEinsum.test_einsum_sums_uint32c                 C   s   |  d d S )Ni8r   r   r.   r.   r/   test_einsum_sums_int641  s    z!TestEinsum.test_einsum_sums_int64c                 C   s   |  d d S )Nu8r   r   r.   r.   r/   test_einsum_sums_uint644  s    z"TestEinsum.test_einsum_sums_uint64c                 C   s   |  d d S )NrR   r   r   r.   r.   r/   test_einsum_sums_float167  s    z#TestEinsum.test_einsum_sums_float16c                 C   s   |  d d S )NZf4r   r   r.   r.   r/   test_einsum_sums_float32:  s    z#TestEinsum.test_einsum_sums_float32c                 C   s   |  d |  dd d S )NrP   Tr   r   r.   r.   r/   test_einsum_sums_float64=  s    
z#TestEinsum.test_einsum_sums_float64c                 C   s   |  tj d S r>   )r   r$   Z
longdoubler   r.   r.   r/   test_einsum_sums_longdoubleA  s    z&TestEinsum.test_einsum_sums_longdoublec                 C   s   |  d |  dd d S )NZc8Tr   r   r.   r.   r/   test_einsum_sums_cfloat64D  s    
z$TestEinsum.test_einsum_sums_cfloat64c                 C   s   |  d d S )NZc16r   r   r.   r.   r/   test_einsum_sums_cfloat128H  s    z%TestEinsum.test_einsum_sums_cfloat128c                 C   s   |  tj d S r>   )r   r$   Zclongdoubler   r.   r.   r/   test_einsum_sums_clongdoubleK  s    z'TestEinsum.test_einsum_sums_clongdoublec                 C   s
  t d}t d}tt d||dgdggg tt jd||dddgdggg tt d||dgdggg tt dddd	gdd	d
gd tt jdddd	gdd	d
gddd t dt j}t dt j}tt d|||t d|| tt jd|||ddt jd||dd t dd	}t dddd}t ddd
d}tt d|||dd	gd	dgddgddggddgddgddgddggg tt jd|||dddd	gd	dgddgddggddgddgddgddggg tt jddgdgd ddgg d S )Nrd   )r
   r
   r    zij...,j...->i...r
   Tr   z	...i,...ir    r   r   rS   greedy)r   rM   r   r
   r   )r   rM   rN   zijklm,ijn,ijn->zijklm,ijn->r   r2   zx,yx,zx->xzy   rb      rQ          rC   0   @   rO   r   )r$   r)   r   r%   Zint64r'   r(   )r*   r,   r-   r{   r.   r.   r/   test_einsum_miscN  sB    

" zTestEinsum.test_einsum_miscc                    s   t d t dt j ddgddgddgdd t j ddgddgddgdd t j dd	gd	dgddgdd tt fd
d tt fdd d S )Nr1   r   r   r   rS   r
   Fr   r7   3   c                      s"   t j ddgddgddgddS )Nr   4   r
   Fr   r$   r%   r.   r,   r-   r.   r/   <lambda>|      z1TestEinsum.test_subscript_range.<locals>.<lambda>c                      s"   t j ddgddgddgddS )Nr!   r   r
   Fr   r   r.   r   r.   r/   r   }  r   )r$   r)   r%   r   r#   r   r.   r   r/   test_subscript_ranget  s    

"""zTestEinsum.test_subscript_rangec                 C   s<  t dddd}t d}t jd||dd}dD ]L}tt jd	|||d| tt jd
|||d| tt jd|||d| q4t dd}t dd}t jd||dd}dD ]d}tt jd|||d| tt jd|||d| tt jd|||d| tt jd|||d| qddddg}t t ||}t |d }t jd||dd}dD ]N}tt jd|||d| tt jd|||d| tt jd|||d| qdd\}}	}
t ||	 |
 ddd||	|
}t ||	 |
 d ||	|
d}t jd||dd}dD ]}tt jd|||d| qd S )NrC   r
   r   r   z
ijk,j->ijkFr   r   zij...,j...->ij...zij...,...j->ij...zij...,j->ij...rM   r   r   r   )r   r
   z	ik,kj->ijzik...,k...->i...zik...,...kj->i...jz...k,kjzik,k...->i...r   zijkl,k->ijlzijkl,kz...kl,kz
...kl,k...)   r   x   r    z...lmn,...lmno->...oz...lmn,lmno->...o)r$   r'   r(   r%   r   prod)r*   ABrefoptdimsr,   vJKMr.   r.   r/   test_einsum_broadcast  sB    

""z TestEinsum.test_einsum_broadcastc                 C   s   t dddt j}t ddddt j}t d||}t j||dd}t|| t d	ddt j	}t d
ddddt j}t d||}t j||dd}t|| d S )Nr   r
   r   i@  i
  zcl, cpx->lpx)r   r   rW   r2   i   r   zcl, cpxy->lpxy)
r$   r'   r(   ri   float32Zint16r%   rq   r   Zfloat64)r*   r   r   estpr.   r.   r/   test_einsum_fixedstridebug  s    
z%TestEinsum.test_einsum_fixedstridebugc                 C   sj   t jddd}t d}t jd||d t d}||d d d f |d d d f ||f }t|| d S )Nr   r    )r   r   r   r   rf   zaabb->abr   r   )r$   randomnormalzerosr%   r'   r   )r*   r9   y1idxy2r.   r.   r/   test_einsum_fixed_collapsingbug  s    

(z*TestEinsum.test_einsum_fixed_collapsingbugc                 C   s8   t jd}t d|}|jddd }t|| d S )N)rX   rX   rX   rX   zijij->r   r
   )Zaxis1Zaxis2)r$   r   Zrandom_sampler%   rj   r	   )r*   Ztensorr9   r   r.   r.   r/   "test_einsum_failed_on_p9_and_s390x  s    z-TestEinsum.test_einsum_failed_on_p9_and_s390xc                 C   s   t d}t dd d d }t d}d|d d d< t jd||||d t|j| t dd d d }t jd||||d t|j| t dd	 }t d}d|d	< t d
t j}t jd|||d t|j| d S )Nrf   rX   r
   r   zmi,mi,mi->mr   zim,im,im->m)r
   r
   r
   ).r   )r
   r
   	ij,jk->ik)r$   r)   r%   r   rE   r   )r*   r9   r   Zcorrect_baser.   r.   r/   (test_einsum_all_contig_non_contig_output  s    


z3TestEinsum.test_einsum_all_contig_non_contig_outputr   ZAllFloatZ
AllIntegerc                 C   s  t |}t dd |}t jd|d}t d|}|| ksHtt d||}t|||  t d|	dd d d |	dd d d }t|||  t d||||  kstt j
d|d}t jd||d|d	}t|||d  t d
||}t|||d  t d||}|t d|| ksBtt d||}|t d|| ksjtt jdddddg|d}t d|||}t||| |   t d||||}t||| | |   d S )Nrb   g      ?r
   rK   rL   zi,i->izi,i->r`   r   ra   r]   r^   g      ?g      @re   zi,i,i->z	i,i,i,i->)r$   r   r'   ri   rt   r%   rh   AssertionErrorr   repeatr)   type)r*   r   arrZscalarresr   r.   r.   r/   test_different_paths  s0    
.zTestEinsum.test_different_pathsc                 C   sh   t jdt jdd d }d|d< t jdt jdd d }t jdt jd}t jd|||d}t|| d S )	N)r   r    r    rK   r
   T.)r
   r    r    rg   r   )r$   r   Zbool_r)   r%   r   )r*   r,   r   r|   r   r.   r.   r/   test_small_boolean_arrays  s    z$TestEinsum.test_small_boolean_arraysc                 C   s4   t ddd}t jd|||d}||ks0td S )Nr2   r   rg   r   )r$   r'   r(   r%   r   )r*   r,   r   r.   r.   r/   test_out_is_res(  s    zTestEinsum.test_out_is_resNc           	      C   s   |d krN|g}| dd  d}|D ]$}dd |D }|tjj|  q&n
|g| }tj|ddi}tj|ddi}t|| tj|dd	i}t|| d S )
N->r   r   c                 S   s   g | ]}t | qS r.   )global_size_dictr4   r9   r.   r.   r/   r6   4  s     z/TestEinsum.optimize_compare.<locals>.<listcomp>r   Fr   optimal)splitappendr$   r   randr%   r   )	r*   Z
subscriptsoperandsargstermstermr   nooptr   r.   r.   r/   optimize_compare-  s    

zTestEinsum.optimize_comparec                 C   s   |  d |  d d S )Nza,ab,abc->abcz
a,b,ab->abr   r   r.   r.   r/   test_hadamard_like_products?  s    
z&TestEinsum.test_hadamard_like_productsc                 C   s"   |  d |  d |  d d S )Nzea,fb,gc,hd,abcd->efghzea,fb,abcd,gc,hd->efghzabcd,ea,fb,gc,hd->efghr   r   r.   r.   r/   test_index_transformationsD  s    

z%TestEinsum.test_index_transformationsc                 C   sT   |  d |  d |  d |  d |  d |  d |  d |  d d S )N$acdf,jbje,gihb,hfac,gfac,gifabc,hfacz cd,bdhe,aidb,hgca,gc,hgibcd,hgaczabhe,hidj,jgba,hiab,gabz bde,cdh,agdb,hica,ibd,hgicd,hiaczchd,bde,agbc,hiad,hgc,hgi,hiadchd,bde,agbc,hiad,bdi,cgh,agdbzbdhe,acad,hiab,agac,hibdr   r   r.   r.   r/   test_complexJ  s    






zTestEinsum.test_complexc                 C   s@   |  d |  d |  d |  d |  d |  d d S )Nz	ab,ab,c->z
ab,ab,c->czab,ab,cd,cd->zab,ab,cd,cd->aczab,ab,cd,cd->cdzab,ab,cd,cd,ef,ef->r   r   r.   r.   r/   test_collapseU  s    




zTestEinsum.test_collapsec                 C   s@   |  d |  d |  d |  d |  d |  d d S )Nzab,cd,ef->abcdefzab,cd,ef->acdfzab,cd,de->abcdezab,cd,de->bezab,bcd,cd->abcdzab,bcd,cd->abdr   r   r.   r.   r/   test_expand^  s    




zTestEinsum.test_expandc                 C   s|   |  d |  d |  d |  d |  d |  d |  d |  d |  d	 |  d
 |  d |  d d S )Neb,cb,fb->cefdd,fb,be,cdb->cefbca,cdb,dbf,afc->dcc,fce,ea,dbf->abzfdf,cdd,ccd,afe->aezabcd,adzed,fcd,ff,bcf->bezbaa,dcf,af,cde->bezbd,db,eac->acezfff,fae,bef,def->abdzefc,dbc,acf,fd->abezba,ac,da->bcdr   r   r.   r.   r/   test_edge_casesg  s    










zTestEinsum.test_edge_casesc                 C   s6   |  d |  d |  d |  d |  d d S )Nzab,abzab,bazabc,abczabc,baczabc,cbar   r   r.   r.   r/   test_inner_productv  s
    



zTestEinsum.test_inner_productc                 C   sr   |  d |  d |  d |  d |  d |  d |  d |  d |  d	 |  d
 |  d d S )Nzaab,fa,df,ecc->bdezecb,fef,bad,ed->aczbcf,bbb,fbf,fc->zbb,ff,be->ezbcb,bb,fc,fff->zfbb,dfd,fc,fc->zafd,ba,cc,dc->bfzadb,bc,fa,cfc->dzbbd,bda,fc,db->acfzdba,ead,cad->bcezaef,fbc,dca->bder   r   r.   r.   r/   test_random_cases~  s    









zTestEinsum.test_random_casesc                 C   s4   t dddddd}t d|}t|dg d S )Nr2   r    r   zbbcdc->drM   )r$   r'   r(   r%   r   )r*   r,   r-   r.   r.   r/   test_combined_views_mapping  s    z&TestEinsum.test_combined_views_mappingc                 C   s   t jddd}t jdd}t jdd}t jd}| jd|||gd | jd||||gd t jdddd}t jd	d	}| jd
|||gd | jd||||gd t dddd}| jd||gd d S )Nr    r   r   r   rX   z	ijk,kl,jl)r   zijk,kl,jl,i->irb   z
abjk,kl,jlzabjk,kl,jl,ab->abr   r
   rQ   zobk,ijk->ioj)r$   r   r   r   r'   r(   )r*   r,   r-   r{   r"   efgr.   r.   r/   test_broadcasting_dot_cases  s    z&TestEinsum.test_broadcasting_dot_casesc                 C   sb  t jddd}t jddd}dD ]}t jd||d|d}t|jj t jd||d	|d}t|jj t jd||d
|d}t|jj t jd||d|d}t|jjdk t|jjdk t jd|||d}t|jjdk t|jjdk q t jddd}dD ]$}t jd||d|d}t|jj qt jddd}dD ]&}t jd||d|d}t|jj q6d S )N)r
   r   r   F)r   r   r   z...ft,mf->...mtr,   r   r   r{   kFr   C)r$   r)   r%   r   rG   f_contiguousc_contiguous)r*   r,   r-   r   tmpr{   r"   r.   r.   r/   test_output_order  s.    zTestEinsum.test_output_order)F)N)1__name__
__module____qualname__r0   rI   r$   Z_no_nep50_warningr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pytestmarkZparametrizeZ	typecodesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   r      s^   U   ,&*

,

		r   c                   @   sX   e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )TestEinsumPathc                    sL   |g}| dd  d}|D ](} fdd|D }|tjj|  q|S )Nr   r   r   c                    s   g | ]} | qS r.   r.   r   	size_dictr.   r/   r6     s     z1TestEinsumPath.build_operands.<locals>.<listcomp>)r   r   r$   r   r   )r*   stringr   r   r   r   r   r.   r   r/   build_operands  s    zTestEinsumPath.build_operandsc                 C   sl   t |t |k}t| tt |d D ]6}|t||d  tM }|||d  ||d  kM }q(t| d S )Nr    )lenr   r<   
isinstancetuple)r*   compZ	benchmarkretposr.   r.   r/   assert_path_equal  s    z TestEinsumPath.assert_path_equalc                 C   s   |  d}tj|ddi\}}| |ddg tj|ddi\}}| |ddg |  d}tj|ddi\}}| |ddg tj|ddi\}}| |ddg d S )	Nz
a,b,c->abcr   )r   r   einsum_path)r   r    r
   )r   r   zacdf,jbje,gihb,hfacr   r    r
   r   r   r$   r  r  )r*   Z
outer_testpathpath_strZ	long_testr.   r.   r/   test_memory_contraints  s    

z%TestEinsumPath.test_memory_contraintsc              
   C   s   |  d}tj|ddi\}}| |dddddd	d
g tj|ddi\}}| |dddddd	d
g |  d}tj|ddi\}}| |ddddddd
g tj|ddi\}}| |ddddddd
g d S )Nr   r   r   r  )r   r   r   )r
   r   r1   r   r
   r   r    r   r   r   r   )r    r   rd   )r   r   )r    r   r
  )r*   Z
long_test1r  r  Z
long_test2r.   r.   r/   test_long_paths  sL    
          
          zTestEinsumPath.test_long_pathsc                 C   s  |  d}tj|ddi\}}| |dddg tj|ddi\}}| |dddg |  d}tj|ddi\}}| |dd	ddg tj|ddi\}}| |dd	ddg |  d
}tj|ddi\}}| |ddddg tj|ddi\}}| |ddddg |  d}tj|ddi\}}| |ddddg tj|ddi\}}| |ddddg | j ddddddd}tj|ddi\}}| |dddg tj|ddi\}}| |dddg d S )Nr   r   r   r  r  r  r   r   r  r   rd   r   za,ac,ab,ad,cd,bd,bc->rS   )r,   r-   r{   r"   r   )r   r    r
   r   r   r   r
  )r*   Z
edge_test1r  r  Z
edge_test2Z
edge_test3Z
edge_test4r.   r.   r/   test_edge_paths  s6    



zTestEinsumPath.test_edge_pathsc                 C   s   |  d}tj|ddi\}}| |ddg tj|ddi\}}| |ddddg dd	d	dg}tj|d|i\}}| || tj|ddi}tj|d|i}t|| d S )
Nr   r   Fr  r	  Trd   r  r  r   r$   r  r  r%   r   )r*   	path_testr  r  exp_pathr   r   r.   r.   r/   test_path_type_input4  s    
z#TestEinsumPath.test_path_type_inputc                 C   sb   |  d}dddg}tj|d|i\}}| || tj|ddi}tj|d|i}t|| d S )Nzcab,cdd->abr  r    r  r   Fr  )r*   r  r  r  r  r   r   r.   r.   r/   #test_path_type_input_internal_traceG  s    

z2TestEinsumPath.test_path_type_input_internal_tracec                 C   s   |  d}dddg}tttjf|d|i tttjf|d|i |  d}dddg}tttjf|d|i tttjf|d|i d S )Nzab,bc,cd,de->aer  r1   r  r   za,a,a->ar  )r   r   RuntimeErrorr$   r%   r  )r*   r  r  r.   r.   r/   test_path_type_input_invalidT  s,    

 

 z+TestEinsumPath.test_path_type_input_invalidc                 C   s<   t dgg}tjddgddD ]}t dj| | q d S )Nr    r    r   )r   z{}...a{}->{}...a{})r$   rt   	itertoolsproductr%   format)r*   r   spr.   r.   r/   test_spacesa  s    zTestEinsumPath.test_spacesN)r   r   r   r   r   r  r  r  r  r  r  r  r   r.   r.   r.   r/   r     s   	,r   c                  C   sp   t jdtddd} t jdtddd}t | |}t d| |}t|| t jd| ||d}t|| d S )Nr2   rK   r   r   r   )r$   r'   intr(   rp   r%   r   )r,   r-   r"   r{   r.   r.   r/   test_overlaph  s    
r"  )r  r   Znumpyr$   Znumpy.testingr   r   r   r   r   r   r   r	   charsrt   Zsizesdictzipr   r   r   r"  r.   r.   r.   r/   <module>   s"   (        @ 