B
    `k              B   @   s  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 ddddd	d
d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEgBZdFdGdHdIdJdKdLdMdNdOg
ZejdPeejdQedRdS ZejdPedTdU ZejdPeejdQedVdW ZejdPeejdQedXdY ZejdPeejdQedZd[ Zd\d] Zd^d_ ZejdPeejdQeejd`dadbgejdcdadbgddde Zdfdg Zejdhdidjdkdldmgfdnddjdkdlgfdidjdkdldmgfdidjdkdldmgfdodjdkdldmgfdpdjdlgfdqddjgfgdrds ZejdQdJdFgejdtdmdugejdvdkdlgejdwddkdmgejdxdadbgdydz Zejd{ed|d} 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_linearz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->efghz$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,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->dzbbd,bda,fc,db->acfzdba,ead,cad->bcezaef,fbc,dca->bdeZoptimalz
branch-allzbranch-2zbranch-1Zgreedyzrandom-greedyzrandom-greedy-128Zdpautozauto-hqstringoptimizec             C   sJ   t |}t|f|ddd}t|f|| dd}t||sFtd S )NF)r
   use_blas)r   build_viewsr   npallcloseAssertionError)r
   r	   viewseinopt r   M/home/dcms/DCMS/lib/python3.7/site-packages/opt_einsum/tests/test_contract.pytest_comparei   s    
r   c             C   s8   t | }t| f| }t|tj| f| s4td S )N)r   r   r   r   r   einsumr   )r	   r   r   r   r   r   test_drop_in_replacements   s    
r   c             C   s^   t |}t|f|ddd}ddd |D }t|f|| dd}t||sZtd S )NF)r
   r    c             s   s*   | ]"}|d krt t|d n|V  qdS )z,->.iP  N)chrord).0cr   r   r   	<genexpr>   s    z%test_compare_greek.<locals>.<genexpr>)r   r   r   joinr   r   r   )r
   r	   r   r   r   r   r   r   test_compare_greekz   s
    
r   c             C   sF   t |}t|f|ddi}t|f|d| i}t||sBtd S )Nr
   F)r   r   r   r   r   r   )r
   r	   r   r   r   r   r   r   test_compare_blas   s    
r    c             C   sZ   t |}t|f|ddi}ddd |D }t|f|d| i}t||sVtd S )Nr
   Fr   c             s   s*   | ]"}|d krt t|d n|V  qdS )z,->.iP  N)r   r   )r   r   r   r   r   r      s    z*test_compare_blas_greek.<locals>.<genexpr>)r   r   r   r   r   r   r   )r
   r	   r   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|sDtd S )	Nr   biP  a         Zcxa)r   r   r   randomZrandr   r   r   )r	   xr   r   r   &test_some_non_alphabet_maintains_order   s    r)   c              C   s8   d} t | }t| f| }tt|d dks4td S )Nzbbd,bda,fc,db->acf   i  )r   r   r   lenstrr   )r	   r   r   r   r   r   test_printing   s    
r-   r   FTout_specc       	      C   s   t | }dd |D }t| f|ddd}t| f|||d}|rd| kr| dd  dkrt | dd \}||d|i n|| }t||st| | kst| |	 kstd S )	Nc             S   s   g | ]
}|j qS r   )shape)r   viewr   r   r   
<listcomp>   s    z-test_contract_expressions.<locals>.<listcomp>F)r
   r   z->r*   out)
r   r   r   r   splitr   r   r   __repr____str__)	r	   r
   r   r.   r   shapesexpectedexprr3   r   r   r   test_contract_expressions   s    
r:   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 ||std S )	Nc             s   s   | ]}t jd d V  qdS )r$   N)r   r'   Zrandn)r   _r   r   r   r      s    z=test_contract_expression_interleaved_input.<locals>.<genexpr>Zxyzr   r*   r$   r%   c             s   s   | ]
}d V  qdS ))r$   r$   Nr   )r   r;   r   r   r   r      s    )r   r   r   r   r   )	r(   yzr8   ZxshpZyshpZzshpr9   r3   r   r   r   *test_contract_expression_interleaved_input   s    &$r>   zstring,constantszhbc,bdef,cdkj,ji,ikeh,lfor*   r$   r%   r&   zbdef,cdkj,ji,ikeh,hbc,lfozijab,acd,bce,df,ef->jizab,cd,ad,cbzab,bc,cdc             C   s   t | }t| f|ddd}dd |D }g }g }xFtt||D ]4\}\}}	||krf||	 qF|| ||	 qFW t| f|d|i}
t|
 |
| }t	||st
d S )NF)r
   r   c             S   s   g | ]
}|j qS r   )r/   )r   r0   r   r   r   r1      s    z;test_contract_expression_with_constants.<locals>.<listcomp>	constants)r   r   r   	enumeratezipappendr   printr   r   r   )r	   r?   r   r8   r7   Z	expr_argsZ	ctrc_argsir/   r0   r9   r3   r   r   r   'test_contract_expression_with_constants   s    


rE   n   regn_out
global_dimc          	   C   sf   t j|||ddddd\}}}t ||}t|f|ddi}	t|f|d| i}
t|	|
sbtd S )Nr$   rG   *   T)Zd_minZd_maxseedZreturn_size_dictr
   F)r   Zrand_equationr   r   r   r   r   )r
   rF   rH   rI   rJ   eqr;   Z	size_dictr   r8   actualr   r   r   test_rand_equation   s
    rO   equationc             C   s<   t | }t| f| \}}t|}t|}||ks8td S )N)r   r   r   r   r   r   )rP   r   Zlinear_pathr;   Zssa_pathZlinear_path2r   r   r   test_linear_vs_ssa   s
    
rQ   c              C   s&   d} dddg}t | f|ddi d S )Nzab,bc,cd)r$   r%   )r%   r&   )r&   rG   r7   T)r   )rM   Zshpsr   r   r    test_contract_path_supply_shapes  s    
rR   )__doc__numpyr   ZpytestZ
opt_einsumr   r   r   r   Zopt_einsum.pathsr   r   testsZall_optimizersmarkZparametrizer   r   r   r    r!   r)   r-   r:   r>   rE   rO   rQ   rR   r   r   r   r   <module>   s   			 	
"	