o
    2h!                     @   s  d Z ddlmZmZ ddlZddlmZmZmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZ edZg d	Zejd
dd
eddfddZejdeejd
e
d
ededdfddZejdededdfddZejdeejd
e
d
ededdfddZejdeejd
e
d
ededdfddZejdeejd
e
d
ededdfddZdDddZdd Zejdeejd
e
ejddd gejd!dd gded
ede d!e ddf
d"d#Z!dDd$d%Z"ejd&d'g d(fd)g d*fd'g d(fd'g d(fd+g d(fd,d-d.gfd/dd-gfgded0ee# ddfd1d2Z$ejd
d3d4gejd5d6d7gejd8d9d.gejd:g d;ejd<dd gd
ed5e#d8e#d:e#d<e ddfd=d>Z%ejd?ed?eddfd@dAZ&dDdBdCZ'dS )Ezf
Tets a series of opt_einsum contraction paths to ensure the results are the same for different paths
    )AnyListN)contractcontract_expressioncontract_path)_PATH_OPTIONSlinear_to_ssassa_to_linear)build_viewsrand_equation)OptimizeKindnumpy)Fza,->azab,->abz,ab,->abz,,->za,ab,abc->abcz
a,b,ab->abzea,fb,gc,hd,abcd->efghzea,fb,abcd,gc,hd->efghzabcd,ea,fb,gc,hd->efgh$acdf,jbje,gihb,hfac,gfac,gifabc,hfacr   z 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,hiadzchd,bde,agbc,hiad,bdi,cgh,agdbzbdhe,acad,hiab,agac,hibdz	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->zab,cd,ef->abcdefzab,cd,ef->acdfzab,cd,de->abcdezab,cd,de->bezab,bcd,cd->abcdzab,bcd,cd->abdzeb,cb,fb->cefzdd,fb,be,cdb->cefzbca,cdb,dbf,afc->z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ab,abzab,bazabc,abczabc,baczabc,cbazab,bczab,cbzba,bczba,cbzabcd,cdzabcd,abz	abcd,cdefzabcd,cdef->febaz	abcd,efdcz
aab,bc->acz
ab,bcc->aczaab,bcc->aczbaa,bcc->aczaab,ccb->acz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->dbbd,bda,fc,db->acfzdba,ead,cad->bcezaef,fbc,dca->bdeoptimize)TFNreturnc                 C   sz   d}t jddt jddt jddg}t|g|R d| i}t|dks)J t|g|R d| i}|jdks;J d S )Nzij,jk,kl->il   r   r   r   )nprandomrandr   lenr   shape)r   expropspathresult r   Y/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/tests/test_contract.pytest_contract_plain_typesg   s   (r   stringc                 C   sL   t |}t|g|R ddd}t|g|R | dd}t||s$J d S )NFr   use_blasr
   r   r   allcloser   r    viewseinoptr   r   r   test_compares   s   r)   c                 C   s:   t | }t| g|R  }t|tj| g|R  sJ d S N)r
   r   r   r$   einsum)r    r&   r(   r   r   r   test_drop_in_replacement}   s   "r,   c                 C   s`   t |}t|g|R ddd}ddd |D }t|g|R | dd}t||s.J d S )NFr!    c                 s   ,    | ]}|d vrt t|d n|V  qdS z,->.P  Nchrord.0cr   r   r   	<genexpr>      * z%test_compare_greek.<locals>.<genexpr>r
   r   joinr   r$   r%   r   r   r   test_compare_greek   s
   r;   c                 C   sH   t |}t|g|R ddi}t|g|R d| i}t||s"J d S )Nr   Fr#   r%   r   r   r   test_compare_blas   s   r<   c                 C   s\   t |}t|g|R ddi}ddd |D }t|g|R d| i}t||s,J d S )Nr   Fr-   c                 s   r.   r/   r1   r4   r   r   r   r7      r8   z*test_compare_blas_greek.<locals>.<genexpr>r9   r%   r   r   r   test_compare_blas_greek   s
   r=   c                  C   sH   dt tdd  d } tjddd}tt| |td|s"J d S )	Nr6   br0   ar         cxa)r2   r3   r   r   r   r$   r   )r    xr   r   r   &test_some_non_alphabet_maintains_order   s    rD   c                  C   s8   d} t | }t| g|R  }tt|d dksJ d S )Nr      i  )r
   r   r   str)r    r&   r'   r   r   r   test_printing   s   rG   r"   FTout_specc           	      C   s   t | }dd |D }t| g|R ddd}t| g|R ||d}|rCd| v rC| dd  dkrCt | dd \}||d|i n|| }t||sOJ | | v sWJ | | v s_J d S )	Nc                 S       g | ]}t |d r|jndqS r   r   hasattrr   r5   viewr   r   r   
<listcomp>        z-test_contract_expressions.<locals>.<listcomp>Fr!   z->rE   out)r
   r   r   splitr   r$   __repr____str__)	r    r   r"   rH   r&   shapesexpectedr   rR   r   r   r   test_contract_expressions   s   rX   c            	   
   C   s   dd dD \} }}t | ddg|ddg|ddgddg}dd dD \}}}t|ddg|ddg|ddgddg}|| ||}t ||sGJ d S )	Nc                 s   s    | ]
}t jd d V  qdS )r   N)r   r   randnr5   _r   r   r   r7      s    z=test_contract_expression_interleaved_input.<locals>.<genexpr>xyzr   rE   r   r@   c                 s   s    | ]}d V  qdS )r   Nr   rZ   r   r   r   r7      s    )r   r+   r   r$   )	rC   yzrW   xshpyshpzshpr   rR   r   r   r   *test_contract_expression_interleaved_input   s   &$rb   zstring,constantszhbc,bdef,cdkj,ji,ikeh,lfo)rE   r   r@   rA   zbdef,cdkj,ji,ikeh,hbc,lfo)r   rE   r   r@   zijab,acd,bce,df,ef->jizab,cd,ad,cbrE   r@   ab,bc,cd	constantsc                 C   s   t | }t| g|R ddd}dd |D }g }g }tt||D ]\}\}}	||v r2||	 q"|| ||	 q"t| g|R d|i}
|
| }t||sTJ d S )NFr!   c                 S   rI   rJ   rK   rM   r   r   r   rO      rP   z;test_contract_expression_with_constants.<locals>.<listcomp>rd   )r
   r   	enumeratezipappendr   r   r$   )r    rd   r&   rW   rV   	expr_args	ctrc_argsir   rN   r   rR   r   r   r   'test_contract_expression_with_constants   s   
rk   greedyoptimalnrA      regr   n_out)r   r   rA   
global_dimc              	   C   sf   t |||ddddd\}}}t||}t|g|R ddi}	t|g|R d| i}
t|	|
s1J d S )Nr   ro   *   T)d_mind_maxseedreturn_size_dictr   F)r   r
   r   r   r$   )r   rn   rp   rq   rr   eqr[   	size_dictr&   rW   actualr   r   r   test_rand_equation   s
   
r{   equationc                 C   s<   t | }t| g|R  \}}t|}t|}||ksJ d S r*   )r
   r   r   r	   )r|   r&   linear_pathr[   ssa_pathlinear_path2r   r   r   test_linear_vs_ssa  s
   r   c                  C   s&   d} g d}t | g|R ddi d S )Nrc   ))r   r@   )r@   rA   )rA   ro   rV   T)r   )rx   shpsr   r   r    test_contract_path_supply_shapes  s   r   )r   N)(__doc__typingr   r   pytest
opt_einsumr   r   r   opt_einsum.pathsr   r   r	   opt_einsum.testingr
   r   opt_einsum.typingr   importorskipr   testsmarkparametrizer   rF   r)   r,   r;   r<   r=   rD   rG   boolrX   rb   intrk   r{   r   r   r   r   r   r   <module>   sl    
U
	&
	






,
