
    ,VhL                        d Z ddlZddlmZ ddlmZmZmZmZ ddl	Z	ddl
ZddlmZmZ ddlmZmZmZmZ  ed       ed       ed	      g ed
      dddddf ed       ed       ed      g ed
      dddddfdZg dg dg dg dg dg dg dg dg dg dg dg dg d g d!g d"g d#g d$g d%g d&g d'g d(gZd)dgd*dgd+dgd,dgd-dggZdtd.ed/ed0ed1efd2Zd3ed4ed5ed/ed1df
d6Zdud7Zdud8Zdud9Zdud:Zdud;Z dud<Z!dud=Z"e	jF                  jI                  d>e      d?ed@e%dAed1dfdB       Z&e	jF                  jI                  dCe      e	jF                  jI                  d?ejN                  jP                        d?ed@e%dAed1dfdD              Z)dudEZ*dudFZ+dudGZ,dudHZ-dudIZ.dudJZ/dudKZ0e	jF                  jI                  dLdMdNdOg dPfdQdRdSg dTfdUdVdSg dWfdXdYdSg dZfd[d\dSg d]fd^dVdSg dWfd_d\dSg d]fg      d`e%daedbedced1df
dd       Z1dudeZ2e	jF                  jI                  dfg dg      dfed1dfdh       Z3e	jF                  jI                  dig dj      died1dfdk       Z4dudlZ5dudmZ6dudnZ7dudoZ8dudpZ9dudqZ:dudrZ;dudsZ<y)vzm
Tests the accuracy of the opt_einsum paths in addition to unit tests for
the various path helper functions.
    N)ProcessPoolExecutor)AnyDictListOptional)build_shapesrand_equation)ArrayIndexTypeOptimizeKindPathTypeTensorShapeType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&   r0   r/   )r'   r0   r/   )r(   r0   r/   )r)   r0   r/   za,->azab,->abz,a,->az,,a,->az,,->test_output	benchmarkbypassreturnc                     t        | t              syt        |       t        |      k7  ryd}t        t        |             D ]/  }|t        | |   t              z  }|| |   t        |      |   k(  z  }1 |S )NFT)
isinstancelistlenrangetuple)r1   r2   r3   retposs        K/home/dcms/DCMS/lib/python3.12/site-packages/opt_einsum/tests/test_paths.py
check_pathr>   C   s{    k4(
;3y>)
CS%& 8z+c*E22{34	?3#7778 J    func	test_datamax_sizec                 H     | |d   |d   |d   |      }t        ||      sJ y )Nr   r   r   )r>   )r@   rA   rB   r2   r1   s        r=   assert_contract_orderrD   Q   s.    y|Yq\9Q<JKk9---r?   c                  R   i } t        dg d      D ]
  \  }}|| |<    t        j                  j                  }d |d|       k(  sJ d |d|       k(  sJ d |d|       k(  sJ d	 |d
|       k(  sJ d	 |d|       k(  sJ d	 |d|       k(  sJ d |d|       k(  sJ d |d|       k(  sJ y )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       r=   test_size_by_dictrX   V   s    J"67 S
3 

//I	"j))))	#z****	#z****	#z****	$
++++	%,,,,)FJ////Igz2222r?   c                  P   dD  ci c]  } | d }} dt         j                  j                  ddd|      k(  sJ dt         j                  j                  ddd|      k(  sJ dt         j                  j                  ddd|      k(  sJ d	t         j                  j                  dd
d|      k(  sJ dt         j                  j                  dd
d|      k(  sJ dt         j                  j                  dd
d|      k(  sJ dt         j                  j                  dd
d|      k(  sJ y c c} w )Nabcdef
   r   Fr   r   d   ab   T      r   i  r   )rQ   rR   
flop_count)v	size_dicts     r=   test_flop_costrd   i   s    ()1B)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            	          t        j                  t              5  t        j                  ddgdgdgdd       d d d        y # 1 sw Y   y xY w)Na,b,cr   r   r   optimallToptimizeshapes)pytestraisesKeyErrorrQ   contract r?   r=   test_bad_path_optionrp   ~   sC    	x	  N
GaS1#sZMN N Ns   AAc                      t        j                  d       t        j                  ddgdgdgddg      } | j	                         d	k(  sJ y )
Nnumpyrf   r   r   r   r*   r%   )ri      )rk   importorskiprQ   rn   item)xs    r=   test_explicit_pathrw      sC    
 
GaS1#sff5EFA668q==r?   c                      t         j                  j                  } t        d   }t	        | |dddg       t	        | |ddg       y Nr   i  r$   r%   r   )r   r   r   )rQ   pathsr(   explicit_path_testsrD   	test_funcrA   s     r=   test_path_optimalr~      s>      I#G,I)Yvv6FG)YI;?r?   c                      t         j                  j                  } t        d   }t	        | |dddg       t	        | |ddg       y ry   )rQ   rz   r!   r{   rD   r|   s     r=   test_path_greedyr      s<    I#G,I)Yvv6FG)YI;?r?   c                     d} t        |       }t        j                  | g|dddd}t        |d   dg      sJ t        j                  | g|dddd}t        |d   dg      sJ t        j                  | g|dd	dd}t        |d   g d
      sJ t        j                  | g|dd	dd}t        |d   g d
      sJ y )Nzabc,bdef,fghj,cem,mhk,ljk->adglr(   r   Tri   memory_limitrj   r   r   r   r   r   r   r   r!   )r-   r   r   r$   r$   r%   r   rQ   contract_pathr>   )
expressionviewspath_rets      r=   test_memory_pathsr      s    2J$E 
dUdYUV_cdHhqk$6#7888
cUcXTU^bcHhqk$6#7888 
eUeYUW`deHhqk#KLLL
dUdXTV_cdHhqk#KLLLr?   zalg,expression,orderalgr   orderc                 p    t        |      }t        j                  |g|| dd}t        |d   |      sJ y NTrh   r   r   r   r   r   r   r   s        r=   test_path_edge_casesr      s>    $E 
NUNSNHhqk5)))r?   zexpression,orderc                 t    t        |      }t        j                  |g|| dd}t        |d         |k(  sJ y r   )r   rQ   r   r8   r   s        r=   test_path_scalar_casesr      sC     $E 
NUNSNHx{u$$$r?   c                      d} t        | ddddd      }t        j                  | g|dddd\  }}t        |d	d
g      sJ t        j                  | g|dddd\  }}t        |d	d
g      sJ y )Nza,ac,ab,ad,cd,bd,bc->r^   r   dimension_dictr!   	max_inputTr   r%   r   r(   r   )r   
edge_test4path_s       r=   test_optimal_edge_casesr      s    (JjrQSZ\9]^JzqJqXclpqGD!dV%78999zrJrYdmqrGD!dV%78999r?   c                  "   d} | j                  dd      D ci c]  }|d }}t        | |      }t        j                  | g|dddd	\  }}t	        |d
g      sJ t        j                  | g|dddd	\  }}t	        |g d      sJ y c c}w )Nzabc,cfd,dbe,efa,r   r^   r   r!   r   Tr   )r   r   r   r   r   )r%   r$   r%   )replacer   rQ   r   r>   )r   kdim_dicttensorsr   r   s         r=   test_greedy_edge_casesr      s    "J)11#r:;!2;H;:h?GznGnhU`imnGD!d\N+++zeGehUW`deGD!d4555 <s   
Bc                  ~    d} g d}t        j                  | g|dddd   }t        |j                        dk(  sJ y )Nznlp,nlq,pl->n)r   r   r   r   )r   r   Tr)   rj   ri   r   r   rQ   r   max
scale_listeqrj   infos      r=   test_dp_edge_cases_dimension_1r      sD    	B+FBDDtDQGDt1$$$r?   c                  ~    d} g d}t        j                  | g|dddd   }t        |j                        dk(  sJ y )Nza,bcd,efg->))r   r   r   r   r   Tr)   r   r   r   r   r   s      r=   &test_dp_edge_cases_all_singlet_indicesr      sD    	B)FBDDtDQGDt1$$$r?   c                  *   d} d\  }}}|f|f|||fg}t        j                  d      }t        j                  d      }t        j                  | g|d|dd   }t        j                  | g|d|dd   }|j                  |j                  k  sJ y )Nz
a,b,abc->c)r   r   r   F)search_outerTr   r   )rQ   DynamicProgrammingr   opt_cost)	r   dadbdcrj   opt1opt2info1info2s	            r=   .test_custom_dp_can_optimize_for_outer_productsr      s    	BJBBebURRL)F  e4D  d3DRE&EEaHERE&EEaHE>>ENN***r?   c                  ^   t        ddd      \  } }t        j                  d      }t        j                  d      }t        j                  | g|d|d	d
   }t        j                  | g|d|d	d
   }|j                  |j                  k  sJ |j
                  |j
                  kD  sJ y )Nr[   r   +   seedflopsminimizesizeTr   r   )r	   rQ   r   r   r   largest_intermediate)r   rj   r   r   r   r   s         r=   $test_custom_dp_can_optimize_for_sizer      s    r12.JB  '2D  &1DRE&EEaHERE&EEaHE>>ENN***%%(B(BBBBr?   c                     t        ddd      \  } }t        j                  d      }t        j                  d      }t        j                  d      }t        j                  | g|d|d	d
   }t        j                  | g|d|d	d
   }t        j                  | g|d|d	d
   }|j                  |j                  cxk(  r|j                  k(  sJ  J y )Nr   r   *   r   T)cost_capFr\   r   r   )r	   rQ   r   r   r   )r   rj   r   r   opt3r   r   info3s           r=   test_custom_dp_can_set_cost_capr     s    q!"-JB  $/D  %0D  #.DRE&EEaHERE&EEaHERE&EEaHE>>U^^=u~~=====r?   zminimize,cost,width,pathr   i
 iI  )	r   r   r   r   r      r   rs   r   r   r   r   r-   r$   r%   r   iH i  )	r   )r      )r   r   r   rs   r   r   )r   r   r*   r%   writei )	)r   r   r   r   r   r   r   r   r-   r*   r%   comboi )	r   r   )rs   r   r   r   r   r-   r$   r%   limiti )	r   r   r   )r   rs   r   r   r-   r*   r%   z	combo-256z	limit-256r   costwidthr   c                     t        ddd      \  }}t        j                  |       }t        j                  |g|d|dd   }|j                  |k(  sJ |j
                  |k(  sJ |j                  |k(  sJ y )	Nr[   r   r   r   r   Tr   r   )r	   rQ   r   r   r   r   r   )r   r   r   r   r   rj   optr   s           r=   test_custom_dp_can_set_minimizer     s     r12.JB



2CBCCsCAFD99==D   $$---r?   c                  r   t        ddd      \  } }t        j                  d      }t        j                  | g|d|d\  }}|j                  }t        j                  | g|d|d	d
 t        j                  t              5  t        j                  | g|d|dz
  d	d
 d d d        y # 1 sw Y   y xY w)Nr[   r   r   r   r   r   Tr   r)   )rj   r   ri   r   )r	   rQ   r   r   r   rk   rl   RuntimeError)r   rj   r   r   r   mincosts         r=   )test_dp_errors_when_no_contractions_foundr   "  s    r12.JB 


0CrFFF4#FGAt''G RS&SGdS 
|	$ \
[f[T!VZ[\ \ \s   B--B6ri   )r!   r'   r&   r(   r)   c           	          d t        d      D        \  }}}d}t        j                  d||||| d      d   g dk(  sJ y )	Nc              3       K   | ]  }d   yw))r[   r[   Nro   ).0r   s     r=   	<genexpr>z3test_can_optimize_outer_products.<locals>.<genexpr>4  s     *Ax*s   r   )r[   r   zab,cd,ef,fgTrh   r   )r   r   r$   r%   )r9   rQ   r   )ri   r   r   r   r   s        r=    test_can_optimize_outer_productsr   2  sQ    *q*GAq!AM1aAQUVWXY ^   r?   num_symbols)r   r      4   t   i,  c           	      6   dj                  d t        |       D              t        t        t	        j
                  g d                  }dj                  fdt        | dz
        D              }t        ||      }t        j                  |g|dd	d
 y )Nr   c              3   F   K   | ]  }t        j                  |        y wN)rQ   
get_symbol)r   is     r=   r   z"test_large_path.<locals>.<genexpr>@  s     C1bmmA&Cs   !)r   r   r   r   c              3   .   K   | ]  }||d z      yw)r   Nro   )r   tsymbolss     r=   r   z"test_large_path.<locals>.<genexpr>B  s     M'!a!e,Ms   r   r   r!   Trh   )	joinr9   dictrP   	itertoolscycler   rQ   r   )r   r   r   r   r   s       @r=   test_large_pathr   >  s{    ggCk0BCCG#gyy'ABCNMeK!O6LMMJ:nEG ZJ'JHTJr?   c                  f   t        j                  d      } t        ddd      \  }}t        t	        | j
                  |            }t        j                  t              5  t        j                  d       d d d        t        j                  dd	      }t        j                  |g|d
|i\  }}t        |j                        dk(  sJ t        |j                        dk(  sJ ||j                  k(  sJ |j                  d   t!        |j                        k(  sJ |j"                  |j                  d   k(  sJ |j$                  |j                  d   k(  sJ d|_        d|_        t        j                  |g|d
|i\  }}t        |j                        dk(  sJ t        |j                        dk(  sJ ||j                  k(  sJ |j                  d   t!        |j                        k(  sJ |j"                  |j                  d   k(  sJ |j$                  |j                  d   k(  sJ t        ddd      \  }}t        t	        | j
                  |            }t        j                  t              5  t        j                  |g|d
|i\  }}d d d        y # 1 sw Y   &xY w# 1 sw Y   y xY w)Nrr   r[   r   r   r   	somethingr   r   )max_repeatsr   ri   r   g        rs      )   )rk   rt   r	   r7   maponesrl   
ValueErrorrQ   RandomGreedyr   r8   costssizesr   bestminr   r   temperaturer   npr   rj   r   	optimizerr   	path_infos          r=   test_custom_random_greedyr  I  sl   			W	%Br12.JBRWWf%&E	z	" .
-. BAI&&rFEFIFOD)y2%%%y2%%%9>>!!!>>'"c)//&::::))Y^^F-CCCC!8888  II&&rFEFIFOD)y2%%%y2%%%9>>!!!>>&!S%9999))Y^^F-CCCC!8888 r12.JBRWWf%&E	z	" K**2JJ	JiK K=. .<K Ks   J4J'J$'J0c                  r   t        j                  d      } t        ddd      \  }}t        t	        | j
                  |            }t        j                  ddd	      }t        j                  |g|d
|i\  }}||j                  k(  sJ |j                  |j                  d   k(  sJ |j                  |j                  d   k(  sJ d|_        d|_        t        j                  |g|d
|i\  }}||j                  k(  sJ |j                  |j                  d   k(  sJ |j                  |j                  d   k(  sJ t        ddd      \  }}t        t	        | j
                  |            }t        j                  t               5  t        j                  |g|d
|i\  }}d d d        y # 1 sw Y   y xY w)Nrr   r   r   r   r   r   r[   r   )nbranchcutoff_flops_factorr   ri   r   r   r   )rk   rt   r	   r7   r   r   rQ   BranchBoundr   r   r   r  r   r  r  rl   r  r  s          r=   test_custom_branchboundr  q  s   			W	%Bq!"-JBRWWf%&Eqb6RI&&rFEFIFOD)9>>!!!))Y^^F-CCCC!8888 I$%I!&&rFEFIFOD)9>>!!!))Y^^F-CCCC!8888 q!"-JBRWWf%&E	z	" K**2JJ	JiK K Ks   F--F6c                      t        j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY w)Nr   )r  )rk   rl   r  rQ   r  ro   r?   r=   test_branchbound_validationr    s/    	z	" "
q!" " "s	   :Ac                  >   t        j                  d      } t        d      }t        ddd      \  }}t	        t        | j                  |            }t        j                  d|      }t        j                  |g|d|i\  }}t        |j                        dk(  sJ t        |j                        dk(  sJ ||j                  k(  sJ |j                  |u sJ |j                  |u sJ |j                   d	   t#        |j                        k(  sJ |j$                  |j                   d
   k(  sJ |j&                  |j                   d	   k(  sJ t)        d      |_        d|_        d|_        t        j                  |g|d|i\  }}t        |j                        dkD  sJ t        |j                        dkD  sJ ||j                  k(  sJ |j                   d	   t#        |j                        k(  sJ |j$                  |j                   d
   k(  sJ |j&                  |j                   d	   k(  sJ d|_        |j                  J |j                  |usJ |j.                  D cg c]$  }|j1                         xs |j3                         & }	}t5        |	      sJ y c c}w )Nrr   r   r[   r   r   r   )r   parallelri   r   r   g    .Ag?T)rk   rt   r   r	   r7   r   r   rQ   r  r   r8   r  r  r   r  	_executorr  r  r   r   intr   max_time_futuresrunningdoneall)
r	  poolr   rj   r   r
  r   r  fare_dones
             r=   test_parallel_random_greedyr     sv   			W	%Bq!Dr12.JBRWWf%&EB>I&&rFEFIFOD)y2%%%y2%%%9>>!!!%%%$&&&>>'"c)//&::::))Y^^F-CCCC!8888  HIII&&rFEFIFOD)y"$$$y"$$$9>>!!!>>'"c)//&::::))Y^^F-CCCC!8888I***d***1:1C1CDA		'qvvx'DHDx== Es   !)Jc                  r   t        j                  d      }  G d dt        j                  j                        }t        dddd      \  }}t        t        | j                  |            }t        j                  |g|dd	i} |       }t        j                  |g|d|i}||k(  sJ |j                  sJ y )
Nrr   c                   B    e Zd Z	 ddee   dedeeef   dee   de	f
dZ
y)	2test_custom_path_optimizer.<locals>.NaiveOptimizerNinputsoutputrc   r   r4   c                 4    d| _         dgt        |      dz
  z  S )NTr%   r   )was_usedr8   )selfr$  r%  rc   r   s        r=   __call__z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__  s      !DM8s6{Q//r?   r   )__name__
__module____qualname__r   r
   r   strr  r   r   r)  ro   r?   r=   NaiveOptimizerr#    sM     +/	0(	0 #	0 CH~		0
 #3-	0 	0r?   r.  r   r   r   r   d_maxri   F)rk   rt   rQ   rz   PathOptimizerr	   r7   r   r   rn   r'  )r	  r.  r   rj   r   expr
  outs           r=   test_custom_path_optimizerr4    s    			W	%B	0// 	0 q!"A6JBRWWf%&E
++b
15
15
1C I
++b
55
59
5C#::r?   c                     t        j                  d       G fddt        j                  j                        } t        dddd      \  }}t        t        j                  |            }t        j                  |g|dd	i} | d
      }t        j                  |g|d|i}||k(  sJ |j                  sJ t        |j                        d
k(  sJ y )Nrr   c                   d    e Zd Zedededee   dedeeef   de	f fd       Z
de	de	de	de	fdZy	)
:test_custom_random_optimizer.<locals>.NaiveRandomOptimizerrnr$  r%  rc   r4   c                    j                   j                  |        g }t        t        |            }t	        |      dkD  rj                   j                  t        |      dd      \  }}|j                  |t	        |      z          |j                  |       |j                  |       |j                  ||f       t	        |      dkD  rt        j                  j                  ||||      \  }	}
||	|
fS )z,Picks a completely random contraction order.r   r   F)r   r   )randomr   setr9   r8   choicer7   addremoveappendrQ   path_randomssa_path_compute_cost)r8  r9  r$  r%  rc   ssa_path	remainingr   jr   r   r	  s              r=   random_pathzFtest_custom_random_optimizer.<locals>.NaiveRandomOptimizer.random_path  s    
 IINN1.0HE!HIi.1$yy''Ya'O1a#h-/0  #  #A' i.1$ ==hPVXabJD$T4''r?   c                 R    d| _         t        |      }| j                  }||||f}||fS )NT)r'  r8   rF  )r(  r$  r%  rc   r9  trial_fn
trial_argss          r=   setupz@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setup  s6     DMFA''HVVY7JZ''r?   N)r*  r+  r,  staticmethodr  r   r
   r   r-  r   rF  rJ  )r	  s   r=   NaiveRandomOptimizerr7    sw    		(	(	($($8	(BP	(]abegjbj]k	(	( 
	( 	( 	(S 	(S 	(S 	(r?   rL  r   r   r   r/  ri   Fr   )r   )rk   rt   rQ   rA  RandomOptimizerr	   r7   r   r   rn   r'  r8   r  )rL  r   rj   r   r2  r
  r3  r	  s          @r=   test_custom_random_optimizerrN    s    			W	%B(r~~== (2 q!"A6JBRWWf%&E
++b
15
15
1C$4I
++b
55
59
5C#::y2%%%r?   c            
      $   dt         t           dt        dt        t        t        f   dt
        t           dt        f
d} t        j                  t              5  t        j                  j                  d|        d d d        t        j                  j                  d|        dt        j                  j                  v sJ d	}g d
}t        j                  |g|ddd\  }}|ddgk(  sJ t        j                  j                  d= y # 1 sw Y   xY w)Nr$  r%  rc   r   r4   c                 &    dgt        |       dz
  z  S )Nr%   r   )r8   )r$  r%  rc   r   s       r=   custom_optimizerz5test_optimizer_registration.<locals>.custom_optimizer  s     x3v;?++r?   r(   customab,bc,cd)r   r   r   Tr   r%   )r   r
   r   r-  r  r   r   rk   rl   rm   rQ   rz   register_path_fn_PATH_OPTIONSr   )rQ  r   rj   r   r   s        r=   test_optimizer_registrationrV    s    ,^$,.<,IMcSVh,gopsgt,	,
 
x	  ?
!!)-=>? HHh(89rxx-----	B%FrKFK4(KGD!FF####
x(? ?s   !DDc                  `    t        j                  dddggdgdggddgg      \  } }| ddgk(  sJ y )NrS  r   r   r   r   r%   )rQ   r   )r   r   s     r=   test_path_with_assumed_shapesrX    sC    zQF8qcA3Z1a&JGD!FF####r?   )F)r4   N)=__doc__r   concurrent.futuresr   typingr   r   r   r   rk   
opt_einsumrQ   opt_einsum.testingr   r	   opt_einsum.typingr
   r   r   r   r<  r{   path_edge_testspath_scalar_testsboolr>   r  rD   rX   rd   rp   rw   r~   r   r   markparametrizer-  r   rz   rU  r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r4  rN  rV  rX  ro   r?   r=   <module>rd     s  
  2 , ,   : U U 
USYE
+Baaa( 
Vc%j#d),Baaa(  2532-=A?>>9=A?>9>B@?:+6 		 NqMNQK	 H  4 TX . . .s .x .\` .
3&D*N
@@M( /A*l * *H *QU * B* +->? 6 67% %# %h %SW % 8 @%:	6%%+
C> 	&%!ij	$ hi	&$ hi	&$ hi	&$ hi	fd$lm	fd$lm.c . .S .PX .]a ..\  %Z[|   \ (KLK K K MK%KPK:"
)X2&&R)&$r?   