o
    1ή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g d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_allclose
abcdefghij)            r   r   r      r   r   r   c                   @   sn  e Zd Zdd Zdd Z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 Z/d=S )X
TestEinsumc              
   C   s  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gdR 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 d    n	1 sw   Y  t ttjd%td!d,d&|d-d. qd S )/NTFoptimize r   test)outr   Worderr   blah)castingr   bad_data_type)dtyper   )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 r2   C/tmp/pip-target-vg8gfxp4/lib/python/numpy/core/tests/test_einsum.pytest_einsum_errors   s~   




zTestEinsum.test_einsum_errorsc              	      sz  dD ]7}t d d _t jd |d}t|j u  t j tg|d}t|j u  t jd |d}t|j u  t|  t j ddg|d}t|j u  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 u  t| j	 t j ddg|d}t|j u  t| j	 t d d _t jd |d}t|j u  t| fddt
dD  t j ddgdg|d}t|j u  t| fddt
dD  t d d _t jd |d}t|j u  t|dd  D  t j tddgtdg|d}t|j u  t|dd  D  t jd |d}t|j u  t|dd  dddD  t j ddtgtdg|d}t|j u  t|dd  dddD  t jd |d}t|j u  t| fddt
dD  t j tddgdtg|d}t|j u  t| fddt
dD  t jd |d}t|j u  t| fd dt
dD  t j g d!ddg|d}t|j u  t| fd"dt
dD  t jd# |d}t|j u  t| fd$dt
dD  t j ddtgdtg|d}t|j u  t| fd%dt
dD  t jd& |d}t|j u  t| fd'dt
dD  t j dtdgdtg|d}t|j u  t| fd(dt
dD  t jd) |d}t|j u  t|d*d  dddD  t j dtdgtdg|d}t|j u  t|d+d  dddD  t d d _t jd, |d}t|j u  t| fd-dt
dD  t j g d.dg|d}t|j u  t| fd/dt
dD  t d0 d1 _t jd2 |d}t|j u  t| dd t j g d3g d4|d}t|j u  t| dd qd S )5Nr   r   r   r   z...r   r!   r   r$   	WRITEABLEFji	   )r   r   r#   c                       g | ]} ||f qS r2   r2   .0r    r0   r2   r3   
<listcomp>       z0TestEinsum.test_einsum_views.<locals>.<listcomp>r   c                    r9   r2   r2   r:   r<   r2   r3   r=      r>      )r   r   r   z...ii->...ic                    "   g | ]  fd dt dD qS )c                    r9   r2   r2   r:   xr2   r3   r=      r>   ;TestEinsum.test_einsum_views.<locals>.<listcomp>.<listcomp>r   ranger;   r2   rA   r3   r=         " c                    r@   )c                    r9   r2   r2   r:   rA   r2   r3   r=      r>   rC   r   rD   rF   r2   rA   r3   r=      rG   zii...->...ic                    r@   )c                    r9   r2   r2   r:   rA   r2   r3   r=      r>   rC   r   rD   rF   r2   rA   r3   r=          r   c                    r@   )c                    r9   r2   r2   r:   rA   r2   r3   r=      r>   rC   r   rD   rF   r2   rA   r3   r=      rH   z...ii->i...c                       g | ]} d d ||f qS Nr2   r:   r<   r2   r3   r=          c                    rI   rJ   r2   r:   r<   r2   r3   r=      rK   zjii->ijc                    rI   rJ   r2   r:   r<   r2   r3   r=      rK   )r$   r   r   c                    rI   rJ   r2   r:   r<   r2   r3   r=      rK   zii...->i...c                    (   g | ]}  d dddd||f qS r   r   r$   N	transposer:   r<   r2   r3   r=         ( c                    rL   rM   rN   r:   r<   r2   r3   r=      rP   zi...i->i...c                    rL   r$   r   r   NrN   r:   r<   r2   r3   r=      rP   c                    rL   rQ   rN   r:   r<   r2   r3   r=      rP   zi...i->...ic                    r@   )c                    r9   r2   r2   r:   rA   r2   r3   r=      r>   rC   r   rD   rF   r2   rA   r3   r=      rH   c                    r@   )c                    r9   r2   r2   r:   rA   r2   r3   r=      r>   rC   r   rD   rF   r2   rA   r3   r=      rH   ziii->ic                       g | ]	} |||f qS r2   r2   r:   r<   r2   r3   r=          )r   r   r   c                    rR   r2   r2   r:   r<   r2   r3   r=      rS      r   r   r   zijk->jikr   r$   r   )r$   r   r   )r(   r+   shaper)   r   baseEllipsisr   flagsTrE   rO   swapaxes)r.   r/   r1   r2   r<   r3   test_einsum_viewsg   s   













 zTestEinsum.test_einsum_viewsFc                 C   s  t ddD ]1}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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| q<t ddD ]9}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 ]:}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	|| qttdddd t ddD ]A}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|| qit ddD ]=}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|| qt ddD ]E}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 ]8}tjd|dd }tj||dd }ttjd|||dt|| ttj|dg|dg|dt|| q>t p}|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| qt 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| qt ddD ]L}|dk s|dkrt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|| qt ddD ]m}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|g d)|g d*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|g d)|g d*d
dg|dd|d	 t|tj|d|dddgddgfd(| W d    n	1 sw   Y  tjg d-|d}tjg d.|d}tg d/}ttjd0|||d1d|d2tt|dk|dk|dk ttj|dg|dg|dgdgd1dd3	tt|dk|dk|dk tjd4|d}ttd5d|dt|  ttdg |dgg dt|  ttd6|ddt|  tt|dgdg g dt|  t dd7D ]}tj||d}t|jdkrttjd8|||dt|| ttjd9|||dt|| ttjd:|d
|dd
|  ttjd;d
||dd
|  ttjd6|d
|dd
t|  ttjd5d
||dd
t|  ttjd8|dd  |d d |dt|dd  |d d  ttjd9|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d6|dd  d
|dd
t|dd    ttjd5d
|dd  |dd
t|dd    qtjd4td}tjd||dd3}t|t| t|jt| tj|dgg |dd3}t|t| t|jt| td
d }tdd
d
d }tdd
d
d< }ttd=|||d> td?}td@}ttjdA||dBdtjdA||dCd ttjdA||dBddDgd
  tdEdFg}tdGg}ttjdH||dCddI ttjdH||dBddI tdJd
 }tdKd
 }dLD ]&}ttjdM|||dtjdM|||d ttjdM|||dtdJdN qrt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%   )axisr   r   r   r   z	...i->...z	i...->...r"   z..., ...r      z
...i, ...i   z
i..., i...i,jzij, jzij,jf8unsafe)r   r   r   r   .zji,j   f2zij,jkrT      r      zij,jk,kl   <   zijk, jil -> klaxesrV   )r$   r   r   
   zijk,jil->kl)r$   r   r   rb      r   r$   )r   g      @g        rp   r   r$   r   rb   )TTFTTFTTzi,i,i->i?)r   r   r   )r   r   r8   ,i->i,->   z...,...zi,ii,->i,i->i   z	z,mz,zm->   )ro   r   r$   r   zij,ij->jTFg      $@g       @      @g      @zi, ig      4@)r$   r   r   r   r   ...ij,...jk->...ikg      ?zji,i->zi,ij->zij,i->)rE   r(   r+   r   r)   sumastyper,   rY   traceasarraylistmultiplyinnerr[   outerr   filterComplexWarningdotr   	tensordotarraylogical_anditemsizeobjectr-   r   fulleye)r.   r   r/   nr0   np_arrayr1   supcr&   tgtpqrrB   yr   r2   r2   r3   check_einsum_sums   s  

 
 











v$$
 """",,



zTestEinsum.check_einsum_sumsc                 C      |  d d S )Ni1r   r.   r2   r2   r3   test_einsum_sums_int8     z TestEinsum.test_einsum_sums_int8c                 C   r   )Nu1r   r   r2   r2   r3   test_einsum_sums_uint8  r   z!TestEinsum.test_einsum_sums_uint8c                 C   r   )Ni2r   r   r2   r2   r3   test_einsum_sums_int16  r   z!TestEinsum.test_einsum_sums_int16c                 C   r   )Nu2r   r   r2   r2   r3   test_einsum_sums_uint16"  r   z"TestEinsum.test_einsum_sums_uint16c                 C      |  d |  dd d S )Ni4Tr   r   r2   r2   r3   test_einsum_sums_int32%     
z!TestEinsum.test_einsum_sums_int32c                 C   r   )Nu4Tr   r   r2   r2   r3   test_einsum_sums_uint32)  r   z"TestEinsum.test_einsum_sums_uint32c                 C   r   )Ni8r   r   r2   r2   r3   test_einsum_sums_int64-  r   z!TestEinsum.test_einsum_sums_int64c                 C   r   )Nu8r   r   r2   r2   r3   test_einsum_sums_uint640  r   z"TestEinsum.test_einsum_sums_uint64c                 C   r   )Nrh   r   r   r2   r2   r3   test_einsum_sums_float163  r   z#TestEinsum.test_einsum_sums_float16c                 C   r   )Nf4r   r   r2   r2   r3   test_einsum_sums_float326  r   z#TestEinsum.test_einsum_sums_float32c                 C   r   )Nre   Tr   r   r2   r2   r3   test_einsum_sums_float649  r   z#TestEinsum.test_einsum_sums_float64c                 C      |  tj d S rJ   )r   r(   
longdoubler   r2   r2   r3   test_einsum_sums_longdouble=     z&TestEinsum.test_einsum_sums_longdoublec                 C   r   )Nc8Tr   r   r2   r2   r3   test_einsum_sums_cfloat64@  r   z$TestEinsum.test_einsum_sums_cfloat64c                 C   r   )Nc16r   r   r2   r2   r3   test_einsum_sums_cfloat128D  r   z%TestEinsum.test_einsum_sums_cfloat128c                 C   r   rJ   )r   r(   clongdoubler   r2   r2   r3   test_einsum_sums_clongdoubleG  r   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g dg d	d
 tt dg dg d	d
 tt jdg dg d	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 )!Nrz   )r   r   r$   zij...,j...->i...r   Tr   z	...i,...i)r$   r   r   rU   ri   greedy)r   rb   r   r   r   )r   rb   rc   zijklm,ijn,ijn->zijklm,ijn->r$   r   r   r8   r   zx,yx,zx->xzy   rx      rg          rT   0   @   rd   r   )r(   r-   r   r)   int64r+   r,   )r.   r0   r1   r   r2   r2   r3   test_einsum_miscJ  sD   

"$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 )Nr5   r   r   r   ri   r   Fr   r?   3   c                      "   t j ddgddgddgddS )Nr   4   r   Fr   r(   r)   r2   r0   r1   r2   r3   <lambda>y  rG   z1TestEinsum.test_subscript_range.<locals>.<lambda>c                      r   )Nr%   r   r   Fr   r   r2   r   r2   r3   r   z  rG   )r(   r-   r)   r   r'   r   r2   r   r3   test_subscript_rangeq  s   

"""zTestEinsum.test_subscript_rangec                 C   s6  t dddd}t d}t jd||dd}dD ]&}tt jd	|||d| tt jd
|||d| tt jd|||d| qt dd}t dd}t jd||dd}dD ]2}tt jd|||d| tt jd|||d| tt jd|||d| tt jd|||d| q\g d}t t ||}t |d }t jd||dd}dD ]&}tt jd|||d| tt jd|||d| tt jd|||d| qd\}}	}
t ||	 |
 ddd||	|
}t ||	 |
 d ||	|
d}t jd||dd}dD ]}tt jd|||d| q	d S )NrT   r   r   r   z
ijk,j->ijkFr   r   zij...,j...->ij...zij...,...j->ij...zij...,j->ij...rb   r   r   r   )r   r   z	ik,kj->ijzik...,k...->i...zik...,...kj->i...jz...k,kjzik,k...->i...)r   r   r   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dimsr0   vJKMr2   r2   r3   test_einsum_broadcast|  sD   

""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   rm   r8   i   r   zcl, cpxy->lpxy)
r(   r+   r,   r   float32int16r)   r   r   float64)r.   r   r   estpr2   r2   r3   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   r|   zaabb->abr   r   )r(   randomnormalzerosr)   r+   r   )r.   rB   y1idxy2r2   r2   r3   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)ro   ro   ro   ro   zijij->r   r   )axis1axis2)r(   r   random_sampler)   r   r	   )r.   tensorrB   r   r2   r2   r3   "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 )Nr|   ro   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   rX   r   )r.   rB   r   correct_baser2   r2   r3   (test_einsum_all_contig_non_contig_output  s   


z3TestEinsum.test_einsum_all_contig_non_contig_outputr   AllFloat
AllIntegerc                 C   s  t |}t dd |}t jd|d}t d|}|| ks$J t d||}t|||  t d|dd d d |dd d d }t|||  t d||||  ks_J t j	d|d}t jd||
d|d	}t|||
d  t d
||}t|||
d  t d||}|t d|| ksJ t d||}|t d|| ksJ t jg d|d}t d|||}t||| |   t d||||}t||| | |   d S )Nrx         ?r   r_   r`   zi,i->izi,i->rv   r   rw   rs   rt   )r   r   g      ?g      @r{   zi,i,i->z	i,i,i,i->)r(   r   r+   r   r   r)   r~   r   repeatr-   type)r.   r   arrscalarresr   r2   r2   r3   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$   r_   r   T.)r   r$   r$   r}   r   )r(   r   bool_r-   r)   r   )r.   r0   r   r   r   r2   r2   r3   test_small_boolean_arrays  s   z$TestEinsum.test_small_boolean_arraysc                 C   s4   t ddd}t jd|||d}||u sJ d S )Nr8   r   r}   r   )r(   r+   r,   r)   )r.   r0   r   r2   r2   r3   test_out_is_res%  s   zTestEinsum.test_out_is_resNc           	      C   s   |d u r'|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 r2   )global_size_dictr;   rB   r2   r2   r3   r=   1      z/TestEinsum.optimize_compare.<locals>.<listcomp>r   Fr   optimal)splitappendr(   r   randr)   r   )	r.   
subscriptsoperandsargstermstermr   nooptr   r2   r2   r3   optimize_compare*  s   

zTestEinsum.optimize_comparec                 C   s   |  d |  d d S )Nza,ab,abc->abcz
a,b,ab->abr  r   r2   r2   r3   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   r2   r2   r3   test_index_transformationsA  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   r2   r2   r3   test_complexG  s   






zTestEinsum.test_complexc                 C   @   |  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   r2   r2   r3   test_collapseR     




zTestEinsum.test_collapsec                 C   r  )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   r2   r2   r3   test_expand[  r  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   r2   r2   r3   test_edge_casesd  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   r2   r2   r3   test_inner_products  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   r2   r2   r3   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 )Nr8   r$   r   zbbcdc->drb   )r(   r+   r,   r)   r   )r.   r0   r1   r2   r2   r3   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   ro   z	ijk,kl,jl)r  zijk,kl,jl,i->irx   z
abjk,kl,jlzabjk,kl,jl,ab->abr   r   rg   zobk,ijk->ioj)r(   r   r  r  r+   r,   )r.   r0   r1   r   r&   efgr2   r2   r3   test_broadcasting_dot_cases  s   z&TestEinsum.test_broadcasting_dot_casesc                 C   s`  t jddd}t jddd}dD ]e}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u  t|jjdu  t jd|||d}t|jjdu  t|jjdu  qt jddd}dD ]}t jd||d|d}t|jj qt jddd}dD ]}t jd||d|d}t|jj qd S )N)r   r   r   F)r   r   r   z...ft,mf->...mtr0   r   r!  r   kFr   C)r(   r-   r)   r   rZ   f_contiguousc_contiguous)r.   r0   r1   r   tmpr   r&   r2   r2   r3   test_output_order  s0   zTestEinsum.test_output_order)FrJ   )0__name__
__module____qualname__r4   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pytestmarkparametrizer(   	typecodesr   r   r   r  r  r  r  r  r  r  r  r  r  r#  r*  r2   r2   r2   r3   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 r2   r2   r  	size_dictr2   r3   r=     r  z1TestEinsumPath.build_operands.<locals>.<listcomp>)r  r  r(   r   r  )r.   stringr4  r  r
  r  r   r2   r3  r3   build_operands  s   zTestEinsumPath.build_operandsc                 C   sl   t |t |k}t| tt |d D ]}|t||d  tM }|||d  ||d  kM }qt| d S )Nr$   )lenr   rE   
isinstancetuple)r.   comp	benchmarkretposr2   r2   r3   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_pathrV   )r  r   zacdf,jbje,gihb,hfacr   r$   r   r   r6  r(   r?  r>  )r.   
outer_testpathpath_str	long_testr2   r2   r3   test_memory_contraints  s   

z%TestEinsumPath.test_memory_contraintsc                 C   s   |  d}tj|ddi\}}| |g d tj|ddi\}}| |g d |  d}tj|ddi\}}| |g d tj|ddi\}}| |g d d S )	Nr  r   r   )r?  )r   r   r   )r   r   r5   r   r   r   r$   r  r  )r?  r   r   r   r   r$   r   rz   rH  )r?  )r   r   )r$   r   r   rJ  rz   rH  rA  )r.   
long_test1rC  rD  
long_test2r2   r2   r3   test_long_paths  s   

zTestEinsumPath.test_long_pathsc                 C   s  |  d}tj|ddi\}}| |g d tj|ddi\}}| |g d |  d}tj|ddi\}}| |g d tj|ddi\}}| |g d |  d}tj|ddi\}}| |g d	 tj|ddi\}}| |g d	 |  d
}tj|ddi\}}| |g d tj|ddi\}}| |g d	 | j ddddddd}tj|ddi\}}| |g d tj|ddi\}}| |g d d S )Nr  r   r   )r?  rG  rH  r  r  )r?  rI  rH  rH  r  )r?  rz   rG  rH  r  r?  rz   rH  rH  za,ac,ab,ad,cd,bd,bc->ri   )r0   r1   r   r&   r3  )r?  rH  )r   r$   r   r   r   r   rA  )r.   
edge_test1rC  rD  
edge_test2
edge_test3
edge_test4r2   r2   r3   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\}}| |g d g d}tj|d|i\}}| || tj|ddi}tj|d|i}t|| d S )	Nr  r   Fr?  r@  TrN  )r?  rG  rG  rH  r6  r(   r?  r>  r)   r   )r.   	path_testrC  rD  exp_pathr  r   r2   r2   r3   test_path_type_input1  s   
z#TestEinsumPath.test_path_type_inputc                 C   s`   |  d}g d}tj|d|i\}}| || tj|ddi}tj|d|i}t|| d S )Nzcab,cdd->abr?  )r$   rH  r   FrT  )r.   rU  rV  rC  rD  r  r   r2   r2   r3   #test_path_type_input_internal_traceD  s   
z2TestEinsumPath.test_path_type_input_internal_tracec                 C   s   |  d}g d}tttjg|R d|i tttjg|R d|i |  d}g d}tttjg|R d|i tttjg|R d|i d S )Nzab,bc,cd,de->ae)r?  r5   rH  r   za,a,a->arX  )r6  r   RuntimeErrorr(   r)   r?  )r.   rU  rV  r2   r2   r3   test_path_type_input_invalidQ  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(   r   	itertoolsproductr)   format)r.   r   spr2   r2   r3   test_spaces^  s   zTestEinsumPath.test_spacesN)r+  r,  r-  r   r6  r>  rF  rM  rS  rW  rY  r[  ra  r2   r2   r2   r3   r2    s    	,r2  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 )Nr8   r_   r   r   r   )r(   r+   intr,   r   r)   r   )r0   r1   r&   r   r2   r2   r3   test_overlape  s   
rc  )r]  r.  numpyr(   numpy.testingr   r   r   r   r   r   r   r	   charsr   sizesdictzipr   r   r2  rc  r2   r2   r2   r3   <module>   s$    (       = 