o
    i ek                     @   s2  d Z ddlZddlZddlmZmZmZmZ ddl	m
Z
mZ g dZg dZejdeejded	d
 Zejdedd Zejdeejdedd Zejdeejdedd Zejdeejdedd Zd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d Zd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)d* Zejdd+d,gejd-d.d/gejd0d1d'gejd2g d3ejd4ddgd5d6 Zejd7ed8d9 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_expressioncontract_pathhelpers)linear_to_ssassa_to_linear)Bz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)
optimalz
branch-allzbranch-2zbranch-1greedyzrandom-greedyzrandom-greedy-128dpautozauto-hqstringoptimizec                 C   sN   t |}t|g|R ddd}t|g|R | dd}t||s%J d S )NFr   use_blasr   build_viewsr   npallcloser   r   viewseinopt r   M/var/www/myenv/lib/python3.10/site-packages/opt_einsum/tests/test_contract.pytest_comparei   s   
r   c                 C   s<   t | }t| g|R  }t|tj| g|R  sJ d S N)r   r   r   r   r   einsum)r   r   r   r   r   r   test_drop_in_replacements   s   
"r   c                 C   sb   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   r   joinr   r   r   r   r   r   test_compare_greekz   s
   
r.   c                 C   sJ   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"   r$   r'   r   r   r   r*      r+   z*test_compare_blas_greek.<locals>.<genexpr>r,   r   r   r   r   test_compare_blas_greek   s
   
r0   c                  C   sH   dt tdd  d } tjddd}tt| |td|s"J d S )	Nr)   br#   a         cxa)r%   r&   r   randomrandr   r   )r   xr   r   r   &test_some_non_alphabet_maintains_order   s    r:   c                  C   s:   d} t | }t| g|R  }tt|d dksJ d S )Nr	      i  )r   r   r   lenstr)r   r   r   r   r   r   test_printing   s   
r>   r   FTout_specc           	      C   s   t | }dd |D }t| g|R ddd}t| g|R ||d}|rEd| v rE| dd  dkrEt | dd \}||d|i n|| }t||sQJ | | v sYJ | | v saJ d S )	Nc                 S      g | ]}|j qS r   shaper(   viewr   r   r   
<listcomp>       z-test_contract_expressions.<locals>.<listcomp>Fr   z->r;   out)	r   r   r   r   splitr   r   __repr____str__)	r   r   r   r?   r   shapesexpectedexprrH   r   r   r   test_contract_expressions   s   
rO   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 )r3   N)r   r7   randnr(   _r   r   r   r*      s    z=test_contract_expression_interleaved_input.<locals>.<genexpr>xyzr   r;   r3   r4   c                 s   s    | ]}d V  qdS ))r3   r3   Nr   rQ   r   r   r   r*      s    )r   r   r   r   )	r9   yzrM   xshpyshpzshprN   rH   r   r   r   *test_contract_expression_interleaved_input   s   &$rY   zstring,constantszhbc,bdef,cdkj,ji,ikeh,lfo)r;   r3   r4   r5   zbdef,cdkj,ji,ikeh,hbc,lfo)r   r;   r3   r4   zijab,acd,bce,df,ef->jizab,cd,ad,cbr;   r4   ab,bc,cdc                 C   s   t | }t| g|R ddd}dd |D }g }g }tt||D ]\}\}}	||v r3||	 q#|| ||	 q#t| g|R d|i}
t|
 |
| }t	||sYJ d S )NFr   c                 S   r@   r   rA   rC   r   r   r   rE      rF   z;test_contract_expression_with_constants.<locals>.<listcomp>	constants)
r   r   r   	enumeratezipappendr   printr   r   )r   r[   r   rM   rL   	expr_args	ctrc_argsirB   rD   rN   rH   r   r   r   'test_contract_expression_with_constants   s   


rc   r   r
   nr5      regr3   n_out)r   r3   r5   
global_dimc              	   C   sj   t j|||ddddd\}}}t ||}t|g|R ddi}	t|g|R d| i}
t|	|
s3J d S )Nr3   re   *   T)d_mind_maxseedreturn_size_dictr   F)r   rand_equationr   r   r   r   )r   rd   rf   rg   rh   eqrR   	size_dictr   rM   actualr   r   r   test_rand_equation   s
   rr   equationc                 C   s>   t | }t| g|R  \}}t|}t|}||ksJ d S r   )r   r   r   r   r   )rs   r   linear_pathrR   ssa_pathlinear_path2r   r   r   test_linear_vs_ssa   s
   
rw   c                  C   s&   d} g d}t | g|R ddi d S )NrZ   ))r3   r4   )r4   r5   )r5   re   rL   T)r   )ro   shpsr   r   r    test_contract_path_supply_shapes  s   ry   )__doc__numpyr   pytest
opt_einsumr   r   r   r   opt_einsum.pathsr   r   testsall_optimizersmarkparametrizer   r   r.   r/   r0   r:   r>   rO   rY   rc   rr   rw   ry   r   r   r   r   <module>   s`    X
		







	

