
    i=                        S r SSKrSSKrSSKrSSKrSSKr\" S5      \" S5      \" S5      /\" S5      SSS	S
S.4\" S5      \" S5      \" S5      /\" S5      SSS	S
S.4S.r	/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ S Q/ S!Q/ S"Q/ S#Q/ S$Q/r
SFS% jrS& rS' rS( rS) rS* rS+ rS, rS- r\R(                  R+                  S.\
5      S/ 5       rS0 rS1 rS2 rS3 rS4 rS5 rS6 r\R(                  R+                  S7/ S8Q5      S9 5       r\R(                  R+                  S:/ S;Q5      S< 5       rS= r S> r!\R(                  RE                  \RF                  S?:  S@SA9SB 5       r$SC r%SD r&SE r'g)Gzm
Tests the accuracy of the opt_einsum paths in addition to unit tests for
the various path helper functions.
    Nabdacbdc             abcdabcdabcbc   )GEMM1Inner1)greedyeb,cb,fb->cefr   r   r   r   )
branch-allr   r   )branch-2r   r   )optimalr   r   )dpr   )r   r   r   )r   dd,fb,be,cdb->cefr   r	   r   r   )r   r    r!   )r   r    r!   )r   r    r!   )r   r    )r"   r   r   )r   bca,cdb,dbf,afc->r   r   r   )r   r#   r$   )r   r#   r$   )r   r#   r$   )r   r#   )r   r   r   )r   dcc,fce,ea,dbf->ab)r   r   r   )r   r%   r$   )r   r%   r$   )r   r%   r$   )r   r%   r$   c                     [        U [        5      (       d  g[        U 5      [        U5      :w  a  gSn[        [        U 5      5       H$  nU[        X   [        5      -  nX0U   X   :H  -  nM&     U$ )NFT)
isinstancelistlenrangetuple)test_output	benchmarkbypassretposs        [/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/opt_einsum/tests/test_paths.py
check_pathr2   7   sn    k4((
;3y>)
CS%&z+*E2239>11 ' J    c                 P    U " US   US   US   U5      n[        XC5      (       d   eg )Nr   r   r   )r2   )func	test_datamax_sizer-   r,   s        r1   assert_contract_orderr8   E   s/    y|Yq\9Q<JKk----r3   c                  b   0 n [        S/ SQ5       H	  u  pX U'   M     [        R                  R                  nSU" SU 5      :X  d   eSU" SU 5      :X  d   eSU" SU 5      :X  d   eS	U" S
U 5      :X  d   eS	U" SU 5      :X  d   eS	U" SU 5      :X  d   eSU" SU 5      :X  d   eSU" SU 5      :X  d   eg )Nabcdez)r   r   	         r   r   r   r   r   r   r   r   zazzbch   aaaeiF2  abcde)zipoehelperscompute_size_by_dict)
sizes_dictindval	path_funcs       r1   test_size_by_dictrL   K   s    J"673 8 

//I	"j))))	#z****	#z****	#z****	$
++++	%,,,,)FJ////Igz2222r3   c                  b   S V s0 s H  o S_M     nn S[         R                  R                  SSSU5      :X  d   eS[         R                  R                  SSSU5      :X  d   eS[         R                  R                  SSSU5      :X  d   eS	[         R                  R                  SS
SU5      :X  d   eS[         R                  R                  SS
SU5      :X  d   eS[         R                  R                  SS
SU5      :X  d   eS[         R                  R                  SS
SU5      :X  d   eg s  sn f )Nabcdef
   r   Fr   r   d   ab   T      r	   i  r   )rE   rF   
flop_count)v	size_dicts     r1   test_flop_costrX   _   s    ()1BI) &&sE1i@@@@ &&sE1i@@@@"**''eQ	BBBB &&sD!Y????"**''dAyAAAA &&sD!Y???? 2::((aCCCC# *s   D,c            	          [         R                  " [        5         [        R                  " SS/S/S/SS9  S S S 5        g ! , (       d  f       g = f)Na,b,cr   r   r	   optimalloptimize)pytestraisesKeyErrorrE   contract r3   r1   test_bad_path_optionrc   u   s4    	x	 
GaS1#sZ@ 
!	 	 s   A  
Ac                  j    [         R                  " SS/S/S/SS/S9n U R                  5       S:X  d   eg )	NrZ   r   r   r	   r   r   r\      )rE   ra   item)xs    r1   test_explicit_pathrh   z   s5    
GaS1#sff5EFA668q==r3   c                      [         R                  R                  n [        S   n[	        XSSS/5        [	        XSS/5        g Nr   i  r   r   r   )r   r   r   )rE   pathsr   explicit_path_testsr8   	test_funcr6   s     r1   test_path_optimalro      s:      I#G,I)vv6FG)I;?r3   c                      [         R                  R                  n [        S   n[	        XSSS/5        [	        XSS/5        g rj   )rE   rk   r   rl   r8   rm   s     r1   test_path_greedyrq      s8    I#G,I)vv6FG)I;?r3   c                     Sn [         R                  R                  U 5      n[         R                  " U /UQ7SSS.6n[	        US   S/5      (       d   e[         R                  " U /UQ7SSS.6n[	        US   S/5      (       d   e[         R                  " U /UQ7SSS.6n[	        US   / S	Q5      (       d   e[         R                  " U /UQ7SSS.6n[	        US   / S	Q5      (       d   eg )
Nzabc,bdef,fghj,cem,mhk,ljk->adglr   r   r]   memory_limitr   r   r   r   r	   r
   r   r   )r"   )r   r
   r   r   r   rE   rF   build_viewscontract_pathr2   )
expressionviewspath_rets      r1   test_memory_pathsr}      s    2JJJ"":.E 
WUWYUVWHhqk$6#78888
VUVXTUVHhqk$6#78888 
XUXYUWXHhqk#KLLLL
WUWXTVWHhqk#KLLLLr3   zalg,expression,orderc                     [         R                  R                  U5      n[         R                  " U/UQ7SU 06n[	        US   U5      (       d   eg )Nr]   r   rw   )algrz   orderr{   r|   s        r1   test_path_edge_casesr      sI    JJ"":.E 
AUASAHhqk5))))r3   c                     Sn [         R                  R                  U SSSSS.S9n[         R                  " U /UQ7SSS.6u  p#[	        USS	/5      (       d   e[         R                  " U /UQ7S
SS.6u  p#[	        USS	/5      (       d   eg )Nza,ac,ab,ad,cd,bd,bc->rR   r   dimension_dictr   	max_inputrs   r   ru   r   rw   )rz   
edge_test4pathpath_strs       r1   test_optimal_edge_casesr      s     )J''
RT[]dfCg'hJ%%jk:k_jkNDdV%789999%%jl:l	`klNDdV%789999r3   c                  V   Sn U R                  SS5       Vs0 s H  oS_M     nn[        R                  R                  XS9n[        R                  " U /UQ7SSS.6u  pE[        US	/5      (       d   e[        R                  " U /UQ7SS
S.6u  pE[        U/ SQ5      (       d   eg s  snf )Nzabc,cfd,dbe,efa,r   rR   r   r   r   rs   )r   r   r   r	   rv   )r   r   r   )replacerE   rF   rx   ry   r2   )rz   kdim_dicttensorsr   r   s         r1   test_greedy_edge_casesr      s    "J)11#r:;:!2:H;jj$$Z$IG%%jh7hX\ghNDd\N++++%%j_7_X\^_NDd45555 <s   B&c                      Sn / SQn[         R                  " U /UQ7SSS.6S   n[        UR                  5      S:X  d   eg )Nznlp,nlq,pl->n)r   r   r   r   )r   r   Tr   shapesr]   r   r	   rE   ry   max
scale_listeqr   infos      r1   test_dp_edge_cases_dimension_1r      sD    	B+FBDDtDQGDt1$$$r3   c                      Sn / SQn[         R                  " U /UQ7SSS.6S   n[        UR                  5      S:X  d   eg )Nza,bcd,efg->))r   r   r   r   r   Tr   r   r   r	   r   r   s      r1   &test_dp_edge_cases_all_singlet_indicesr      sD    	B*FBDDtDQGDt1$$$r3   c                  $   Sn Su  pnU4U4XU4/n[         R                  " SS9n[         R                  " SS9n[         R                  " U /UQ7SUS.6S   n[         R                  " U /UQ7SUS.6S   nUR                  UR                  :  d   eg )Nz
a,b,abc->c)r   r   r	   F)search_outerTr   r   )rE   DynamicProgrammingry   opt_cost)	r   dadbdcr   opt1opt2info1info2s	            r1   .test_custom_dp_can_optimize_for_outer_productsr      s    	BJBBfrfrrl+F  e4D  d3DRE&EEaHERE&EEaHE>>ENN***r3   c                  ~   [         R                  R                  SSSS9u  p[         R                  " SS9n[         R                  " SS9n[         R                  " U /UQ7SUS	.6S
   n[         R                  " U /UQ7SUS	.6S
   nUR
                  UR
                  :  d   eUR                  UR                  :  d   eg )NrO   r
   +   seedflopsminimizesizeTr   r   )rE   rF   rand_equationr   ry   r   largest_intermediate)r   r   r   r   r   r   s         r1   $test_custom_dp_can_optimize_for_sizer      s    ))"ab)9JB  '2D  &1DRE&EEaHERE&EEaHENNU^^+,+&&)C)CCDCr3   c                     [         R                  R                  SSSS9u  p[         R                  " SS9n[         R                  " SS9n[         R                  " SS9n[         R                  " U /UQ7SUS	.6S
   n[         R                  " U /UQ7SUS	.6S
   n[         R                  " U /UQ7SUS	.6S
   nUR
                  UR
                  s=:X  a  UR
                  :X  d   e   eg )Nr   r	   *   r   T)cost_capFrP   r   r   )rE   rF   r   r   ry   r   )r   r   r   r   opt3r   r   info3s           r1   test_custom_dp_can_set_cost_capr      s    ))!QR)8JB  $/D  %0D  #.DRE&EEaHERE&EEaHERE&EEaHE>>U^^=u~~=====r3   r]   )r   r   r   r   r   c           	         [        S5       Vs/ s H#  n[        R                  R                  SS5      PM%     snu  p#n[        R                  R                  SS5      n[        R
                  " SX#XEU S9S   / SQ:X  d   eg s  snf )Nr	   rO   r   zab,cd,ef,fgr\   r   )r   r	   r   r   )r*   nprandomrandnrE   ry   )r]   _r   r   r   r   s         r1    test_can_optimize_outer_productsr      sk    05a91ryyr2&9GA!
		AAM1I!LPhhhh :s   *Bnum_symbols)r   r	      4   t   i,  c           	      Z  ^ SR                  S [        U 5       5       5      m[        [        T[        R
                  " / SQ5      5      5      nSR                  U4S j[        U S-
  5       5       5      n[        R                  R                  X!S9n[        R                  " U/UQ7SS	06  g )
Nr   c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fN)rE   
get_symbol).0is     r1   	<genexpr>"test_large_path.<locals>.<genexpr>  s     C0B1bmmA&&0Bs   #%)r   r	   r
   r   c              3   2   >#    U  H  nTXS -    v   M     g7f)r   Nrb   )r   tsymbolss     r1   r   r     s     K4Jq'!E*4Js   r   r   r]   r   )
joinr*   dictrD   	itertoolscyclerE   rF   rx   ry   )r   r   rz   r   r   s       @r1   test_large_pathr     s    ggCk0BCCG#gyy'ABCNKE+/4JKKJjj$$Z$OG Z='=H=r3   c                     [         R                  R                  SSSS9u  p[        [	        [
        R                  U5      5      n[        R                  " [        5         [         R                  " SS9  S S S 5        [         R                  " SSS9n[         R                  " U /UQ7S	U06u  pE[        UR                  5      S:X  d   e[        UR                  5      S:X  d   eXCR                  :X  d   eUR                   S   [#        UR                  5      :X  d   eUR$                  UR                   S
   :X  d   eUR&                  UR                   S   :X  d   eSUl        SUl        [         R                  " U /UQ7S	U06u  pE[        UR                  5      S:X  d   e[        UR                  5      S:X  d   eXCR                  :X  d   eUR                   S
   [#        UR                  5      :X  d   eUR$                  UR                   S
   :X  d   eUR&                  UR                   S   :X  d   e[         R                  R                  SSSS9u  p[        [	        [
        R                  U5      5      n[        R                  " [        5         [         R                  " U /UQ7S	U06u  pES S S 5        g ! , (       d  f       GNH= f! , (       d  f       g = f)NrO   r
   r   r   	somethingr   r   )max_repeatsr   r]   r   g        re      )   )rE   rF   r   r(   mapr   onesr^   r_   
ValueErrorRandomGreedyry   r)   costssizesr   bestminr   r   temperaturer   r   r   r{   	optimizerr   	path_infos         r1   test_custom_random_greedyr     sS   ))"ab)9JBRWWf%&E	z	"
- 
# BAI&&rFEFIFODy2%%%y2%%%>>!!!>>'"c)//&::::))Y^^F-CCCC!8888  II&&rFEFIFODy2%%%y2%%%>>!!!>>&!S%9999))Y^^F-CCCC!8888 ))"ab)9JBRWWf%&E	z	"**2JJ	J 
#	"= 
#	"< 
#	"s   J5K5
K
Kc                     [         R                  R                  SSSS9u  p[        [	        [
        R                  U5      5      n[         R                  " SSSS9n[         R                  " U /UQ7S	U06u  pEXCR                  :X  d   eUR                  UR                  S   :X  d   eUR                  UR                  S
   :X  d   eSUl        SUl        [         R                  " U /UQ7S	U06u  pEXCR                  :X  d   eUR                  UR                  S   :X  d   eUR                  UR                  S
   :X  d   e[         R                  R                  SSSS9u  p[        [	        [
        R                  U5      5      n[        R                   " ["        5         [         R                  " U /UQ7S	U06u  pES S S 5        g ! , (       d  f       g = f)N   r
   r   r   r   rO   r   )nbranchcutoff_flops_factorr   r]   r   r	   r   )rE   rF   r   r(   r   r   r   BranchBoundry   r   r   r   r   r   r   r^   r_   r   r   s         r1   test_custom_branchboundr   5  s   ))!QR)8JBRWWf%&Eqb6RI&&rFEFIFOD>>!!!))Y^^F-CCCC!8888 I$%I!&&rFEFIFOD>>!!!))Y^^F-CCCC!8888 ))!QR)8JBRWWf%&E	z	"**2JJ	J 
#	"	"s   G
G)r	   r   zrequires python3.2 or higher)reasonc                  r   SSK Jn   U " S5      n[        R                  R	                  SSSS9u  p#[        [        [        R                  U5      5      n[        R                  " SUS9n[        R                  " U/UQ7S	U06u  pg[        UR                  5      S:X  d   e[        UR                  5      S:X  d   eXeR                  :X  d   eUR                  UL d   eUR                   UL d   eUR"                  S
   [%        UR                  5      :X  d   eUR&                  UR"                  S   :X  d   eUR(                  UR"                  S
   :X  d   e[+        S5      Ul        SUl        SUl        [        R                  " U/UQ7S	U06u  pg[        UR                  5      S:  d   e[        UR                  5      S:  d   eXeR                  :X  d   eUR"                  S
   [%        UR                  5      :X  d   eUR&                  UR"                  S   :X  d   eUR(                  UR"                  S
   :X  d   eSUl        UR                   c   eUR                   ULd   eUR0                   Vs/ s H)  oR3                  5       =(       d    UR5                  5       PM+     n	n[7        U	5      (       d   eg s  snf )Nr   )ProcessPoolExecutorr   rO   r
   r   r   )r   parallelr]   r   r   g    .Ag?T)concurrent.futuresr   rE   rF   r   r(   r   r   r   r   ry   r)   r   r   r   r   	_executorr   r   r   r   intr   max_time_futuresrunningdoneall)
r   poolr   r   r{   r   r   r   fare_dones
             r1   test_parallel_random_greedyr   P  so   6q!D))"ab)9JBRWWf%&EB>I&&rFEFIFODy2%%%y2%%%>>!!!%%%$&&&>>'"c)//&::::))Y^^F-CCCC!8888  HIII&&rFEFIFODy"$$$y"$$$>>!!!>>'"c)//&::::))Y^^F-CCCC!8888I***d***1:1C1CD1CA		'qvvx'1CHDx=== Es   /0J4c                  ~    " S S[         R                  R                  5      n [         R                  R	                  SSSSS9u  p[        [        [        R                  U5      5      n[         R                  " U/UQ7SS06nU " 5       n[         R                  " U/UQ7SU06nXF:X  d   eUR                  (       d   eg )	Nc                       \ rS rSrSS jrSrg)2test_custom_path_optimizer.<locals>.NaiveOptimizeri}  Nc                 4    SU l         S/[        U5      S-
  -  $ )NTr   r   )was_usedr)   )selfinputsoutputrW   rt   s        r1   __call__;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__~  s     DM8s6{Q//r3   r  r   )__name__
__module____qualname____firstlineno__r  __static_attributes__rb   r3   r1   NaiveOptimizerr  }  s    	0r3   r  r   r	   r   r   d_maxr]   F)rE   rk   PathOptimizerrF   r   r(   r   r   r   ra   r  )r  r   r   r{   expr   outs          r1   test_custom_path_optimizerr  |  s    0// 0
 ))!QRq)AJBRWWf%&E
++b
15
15
1C I
++b
55
59
5C::r3   c                      " S S[         R                  R                  5      n [         R                  R	                  SSSSS9u  p[        [        [        R                  U5      5      n[         R                  " U/UQ7SS06nU " S	S
9n[         R                  " U/UQ7SU06nXF:X  d   eUR                  (       d   e[        UR                  5      S	:X  d   eg )Nc                   *    \ rS rSr\S 5       rS rSrg):test_custom_random_optimizer.<locals>.NaiveRandomOptimizeri  c                    [         R                  R                  U 5        / n[        [	        U5      5      n[        U5      S:  a  [         R                  R                  [        U5      SSS9u  pxUR                  U[        U5      -   5        UR                  U5        UR                  U5        UR                  Xx45        [        U5      S:  a  M  [        R                  R                  XRX45      u  pXYU
4$ )z9Picks a completely random contraction order.
            r   r   F)r   r   )r   r   r   setr*   r)   choicer(   addremoveappendrE   path_randomssa_path_compute_cost)rnr  r  rW   ssa_path	remainingr   jcostr   s              r1   random_pathFtest_custom_random_optimizer.<locals>.NaiveRandomOptimizer.random_path  s     IINN1HE!HIi.1$yy''Ya'Oa#h-/0  #  #' i.1$ ==hPVbJD4''r3   c                 L    SU l         [        U5      nU R                  nXAX#4nXV4$ )NT)r  r)   r'  )r  r  r  rW   r"  trial_fn
trial_argss          r1   setup@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setup  s0     DMFA''HV7J''r3   r	  N)r
  r  r  r  staticmethodr'  r,  r  rb   r3   r1   NaiveRandomOptimizerr    s    		( 
	(	(r3   r/  r   r	   r   r  r]   Fr   )r   )rE   r  RandomOptimizerrF   r   r(   r   r   r   ra   r  r)   r   )r/  r   r   r{   r  r   r  s          r1   test_custom_random_optimizerr1    s    (r~~== (0 ))!QRq)AJBRWWf%&E
++b
15
15
1C$4I
++b
55
59
5C::y2%%%r3   c                     S n [         R                  " [        5         [        R                  R                  SU 5        S S S 5        [        R                  R                  SU 5        S[        R                  R                  ;   d   eSn/ SQn[        R                  " U/UQ7SSS.6u  p4USS/:X  d   e[        R                  R                  S	 g ! , (       d  f       N= f)	Nc                 &    S/[        U 5      S-
  -  $ )Nr   r   )r)   )r  r  rW   rt   s       r1   custom_optimizer5test_optimizer_registration.<locals>.custom_optimizer  s    x3v;?++r3   r   customzab,bc,cd)r   )r	   r
   )r
   r   Tr   r   )r^   r_   r`   rE   rk   register_path_fn_PATH_OPTIONSry   )r4  r   r   r   r   s        r1   test_optimizer_registrationr9    s    , 
x	 
!!)-=> 
! HHh(89rxx-----	B%F&&rSFS4(SODFF####
x( 
!	 s   !C
C)F)(__doc__r   sysnumpyr   r^   
opt_einsumrE   r  rl   path_edge_testsr2   r8   rL   rX   rc   rh   ro   rq   r}   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   skipifversion_infor   r  r1  r9  rb   r3   r1   <module>rC     s  
  
    5z3t9c%j13r7	=  FSZT3SW	?  " 2532-=A?>>9=A?>9>B@?:+2.3(D,A

@@M* /A* B*	:
6%%+
E> %Z[i \i (KL> M>#KLK6 C$$v-6TU( V(V"#&L)r3   