
    ,Vh!                        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j$                  d      Zg d	Zej*                  j-                  d
d      d
eddfd       Zej*                  j-                  de      ej*                  j-                  d
e
      d
ededdfd              Zej*                  j-                  de      deddfd       Zej*                  j-                  de      ej*                  j-                  d
e
      d
ededdfd              Zej*                  j-                  de      ej*                  j-                  d
e
      d
ededdfd              Zej*                  j-                  de      ej*                  j-                  d
e
      d
ededdfd              Zd6dZd Zej*                  j-                  de      ej*                  j-                  d
e
      ej*                  j-                  dddg      ej*                  j-                  dddg      ded
ede de ddf
d                            Z!d6dZ"ej*                  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d&ee#   ddfd'       Z$ej*                  j-                  d
d(d)g      ej*                  j-                  d*d+d,g      ej*                  j-                  d-d.d$g      ej*                  j-                  d/g d0      ej*                  j-                  d1ddg      d
ed*e#d-e#d/e#d1e ddfd2                                   Z%ej*                  j-                  d3e      d3eddfd4       Z&d6d5Z'y)7zf
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                 D   d}t         j                  j                  dd      t         j                  j                  dd      t         j                  j                  dd      g}t        |g|d| i}t	        |      dk(  sJ t        |g|d| i}|j                  dk(  sJ y )Nzij,jk,kl->il   r   r   r   )nprandomrandr   lenr   shape)r   expropspathresults        N/home/dcms/DCMS/lib/python3.12/site-packages/opt_einsum/tests/test_contract.pytest_contract_plain_typesr    g   s    D99>>!Q1!5ryy~~a7K
LC77h7Dt9>>d4S484F<<6!!!    stringc                     t        |      }t        |g|ddd}t        |g|| dd}t        j                  ||      sJ y )NFr   use_blasr   r   r   allcloser   r"   viewseinopts        r   test_comparer,   s   sN     E
6
BE
BEE
BC
6
EE
EHu
EC;;sC   r!   c                     t        |       }t        | g| }t        j                  |t        j                  | g|       sJ y N)r   r   r   r'   einsum)r"   r)   r+   s      r   test_drop_in_replacementr0   }   s=    E
6
"E
"C;;sBIIf5u5666r!   c                     t        |      }t        |g|ddd}dj                  d |D              }t        |g|| dd}t        j	                  ||      sJ y )NFr$    c              3   V   K   | ]!  }|d vrt        t        |      dz         n| # ywz,->.P  Nchrord.0cs     r   	<genexpr>z%test_compare_greek.<locals>.<genexpr>   (     QQ!6/SQ#&q@Q   ')r   r   joinr   r'   r(   s        r   test_compare_greekrA      sd     E
6
BE
BEE
BC WWQ&QQF
6
EE
EHu
EC;;sC   r!   c                     t        |      }t        |g|ddi}t        |g|d| i}t        j                  ||      sJ y )Nr   Fr&   r(   s        r   test_compare_blasrC      sJ     E
6
2E
2E
2C
6
5E
5H
5C;;sC   r!   c                     t        |      }t        |g|ddi}dj                  d |D              }t        |g|d| i}t        j	                  ||      sJ y )Nr   Fr2   c              3   V   K   | ]!  }|d vrt        t        |      dz         n| # ywr4   r6   r9   s     r   r<   z*test_compare_blas_greek.<locals>.<genexpr>   r=   r>   r?   r(   s        r   test_compare_blas_greekrF      s`     E
6
2E
2E
2C WWQ&QQF
6
5E
5H
5C;;sC   r!   c                      dt        t        d      dz         z   dz   } t        j                  j	                  ddd      }t        j                  t        | |      t        d|            sJ y )	Nr;   br5   ar         cxa)r7   r8   r   r   r   r'   r   )r"   xs     r   &test_some_non_alphabet_maintains_orderrN      sX    3s3x#~&&,F 			q!QA;;x*HUA,>???r!   c                  n    d} t        |       }t        | g| }t        t        |d               dk(  sJ y )Nr      i  )r   r   r   str)r"   r)   r*   s      r   test_printingrR      s;    !FE

'
'Cs3q6{s"""r!   r%   FTout_specc                    t        |       }|D cg c]  }t        |d      r|j                  nd }}t        | g|ddd}t	        | g|||d}|r4d| v r0| dd  dk7  r(t        | j                  d      d         \  }	 ||d|	i n || }	t        j                  |	|      sJ | |j                         v sJ | |j                         v sJ y c c}w )	Nr    Fr$   z->rP   out)
r   hasattrr   r   r   splitr   r'   __repr____str__)
r"   r   r%   rS   r)   viewshapesexpectedr   rW   s
             r   test_contract_expressionsr_      s    
 EGLMtGD'2djj:MFMGGGHvUUHUDTV^&+*=V\\$/23eEl;;sH%%% T]]_$$$T\\^### Ns   !Cc            
          d dD        \  } }}t         j                  | ddg|ddg|ddgddg      }d dD        \  }}}t        |ddg|ddg|ddgddg      } || ||      }t         j                  ||      sJ y )Nc              3   \   K   | ]$  }t         j                  j                  d d        & yw)r   N)r   r   randnr:   _s     r   r<   z=test_contract_expression_interleaved_input.<locals>.<genexpr>   s     4ryyq!$4s   *,xyzr   rP   r   rJ   c              3       K   | ]  }d   yw)r   NrU   rc   s     r   r<   z=test_contract_expression_interleaved_input.<locals>.<genexpr>   s     .1.s   )r   r/   r   r'   )	rM   yzr^   xshpyshpzshpr   rW   s	            r   *test_contract_expression_interleaved_inputrl      s    4e4GAq!yyQFA1vq1a&1a&AH..D$taVTAq64!Q!QPD
q!Q-C;;sH%%%r!   zstring,constantszhbc,bdef,cdkj,ji,ikeh,lfo)rP   r   rJ   rK   zbdef,cdkj,ji,ikeh,hbc,lfo)r   rP   r   rJ   zijab,acd,bce,df,ef->jizab,cd,ad,cbrP   rJ   ab,bc,cd	constantsc                    t        |       }t        | g|ddd}|D cg c]  }t        |d      r|j                  nd }}g }g }t	        t        ||            D ]@  \  }\  }	}||v r|j                  |       |j                  |	       |j                  |       B t        | g|d|i}
 |
| }t        j                  ||      sJ y c c}w )NFr$   r   rU   rn   )
r   r   rX   r   	enumeratezipappendr   r   r'   )r"   rn   r)   r^   r\   r]   	expr_args	ctrc_argsir   r   rW   s               r   'test_contract_expression_with_constantsrv      s     EGGGHGLMtGD'2djj:MFMII%c&%&89 #=E4	>T"U#T"# vG	GYGD
	
C;;x%%% Ns   !CgreedyoptimalnrK      regr   n_out)r   r   rK   
global_dimc           	          t        |||dddd      \  }}}t        ||      }t        |g|ddi}	t        |g|d| i}
t        j	                  |	|
      sJ y )Nr   rz   *   T)d_mind_maxseedreturn_size_dictr   F)r   r   r   r   r'   )r   ry   r{   r|   r}   eqrd   	size_dictr)   r^   actuals              r   test_rand_equationr      sj     %QU!12`deB9I&E3U3U3Hb45484F;;x(((r!   equationc                 r    t        |       }t        | g| \  }}t        |      }t        |      }||k(  sJ y r.   )r   r   r	   r
   )r   r)   linear_pathrd   ssa_pathlinear_path2s         r   test_linear_vs_ssar     sA    !E"84e4NK[)H *L;&&&r!   c                  .    d} g d}t        | g|ddi y )Nrm   ))r   rJ   )rJ   rK   )rK   rz   r]   T)r   )r   shpss     r    test_contract_path_supply_shapesr     s    	B#D")t)D)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    rQ   r,   r0   rA   rC   rF   rN   rR   boolr_   rl   intrv   r   r   r   rU   r!   r   <module>r      s$     C C H H 9 * V!R	j %89" " " :" 5)]3!< ! ! ! 4 *! 5)7S 7T 7 *7 5)]3	! 	!s 	!t 	! 4 *	! 5)]3! !c !d ! 4 *! 5)]3	!l 	!C 	!D 	! 4 *	!@# 5)]3eT]3eT]3$c $\ $T $]a $fj $ 4 4 4 *$(& 	$l3	$l3	$l3	$l3	!<0	A	aV&C &DI &RV &&( h	%:;q!f%A'),t}5) )# )C ) )Y] )bf ) 6 - ( & <
) U+' ' ' ,'*r!   