o
    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-128Z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   ND:\Projects\ConvertPro\env\Lib\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
   
r/   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         Zcxa)r$   r%   r   randomZrandr   r   )r   xr   r   r   &test_some_non_alphabet_maintains_order   s    r7   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->r8   out)	r   r   r   r   splitr   r   __repr____str__)	r   r   r   r<   r   shapesexpectedexprrE   r   r   r   test_contract_expressions   s   
rL   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 )r2   N)r   r5   Zrandnr'   _r   r   r   r)      s    z=test_contract_expression_interleaved_input.<locals>.<genexpr>Zxyzr   r8   r2   r3   c                 s   s    | ]}d V  qdS ))r2   r2   Nr   rM   r   r   r   r)      s    )r   r   r   r   )	r6   yzrJ   ZxshpZyshpZzshprK   rE   r   r   r   *test_contract_expression_interleaved_input   s   &$rQ   zstring,constantszhbc,bdef,cdkj,ji,ikeh,lfo)r8   r2   r3   r4   zbdef,cdkj,ji,ikeh,hbc,lfo)r   r8   r2   r3   zijab,acd,bce,df,ef->jizab,cd,ad,cbr8   r3   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   r>   r@   r   r   r   rB      rC   z;test_contract_expression_with_constants.<locals>.<listcomp>	constants)
r   r   r   	enumeratezipappendr   printr   r   )r   rS   r   rJ   rI   Z	expr_argsZ	ctrc_argsir?   rA   rK   rE   r   r   r   'test_contract_expression_with_constants   s   


rY   r   r
   nr4      regr2   n_out)r   r2   r4   
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 )Nr2   r[   *   T)Zd_minZd_maxseedZreturn_size_dictr   F)r   Zrand_equationr   r   r   r   )r   rZ   r\   r]   r^   eqrN   Z	size_dictr   rJ   actualr   r   r   test_rand_equation   s
   rc   equationc                 C   s>   t | }t| g|R  \}}t|}t|}||ksJ d S r   )r   r   r   r   r   )rd   r   Zlinear_pathrN   Zssa_pathZlinear_path2r   r   r   test_linear_vs_ssa   s
   
re   c                  C   s&   d} g d}t | g|R ddi d S )NrR   ))r2   r3   )r3   r4   )r4   r[   rI   T)r   )ra   Zshpsr   r   r    test_contract_path_supply_shapes  s   rf   )__doc__numpyr   ZpytestZ
opt_einsumr   r   r   r   Zopt_einsum.pathsr   r   testsZall_optimizersmarkZparametrizer   r   r-   r.   r/   r7   r;   rL   rQ   rY   rc   re   rf   r   r   r   r   <module>   s`    X
		







	

