
    Opf=                     6   d Z ddlZddlZddlZddlZddl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
dGd&Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zej                            d/e
          d0             Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zej                            d8g d9          d:             Zej                            d;g d<          d=             Zd> Z d? Z!ej        "                    ej#        d@k     dAB          dC             Z$dD Z%dE Z&dF Z'dS )Hzm
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$   Fc                     t          | t                    sdS t          |           t          |          k    rdS d}t          t          |                     D ]5}|t          | |         t                    z  }|| |         ||         k    z  }6|S )NFT)
isinstancelistlenrangetuple)test_output	benchmarkbypassretposs        [/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/opt_einsum/tests/test_paths.py
check_pathr2   7   s    k4(( u
;3y>>))u
CS%%&& 2 2z+c*E222{39S>11J    c                 j     | |d         |d         |d         |          }t          ||          sJ d S )Nr   r   r   )r2   )func	test_datamax_sizer-   r,   s        r1   assert_contract_orderr8   E   s?    $y|Yq\9Q<JJKk9-------r3   c                     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 d S )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"6"677  S
3
/I		"j))))))		#z******		#z******		#z******		$
++++++		%,,,,,,))FJ//////IIgz22222222r3   c                  N   d dD             } dt           j                            ddd|           k    sJ dt           j                            ddd|           k    sJ dt           j                            d	dd|           k    sJ d
t           j                            ddd|           k    sJ dt           j                            d	dd|           k    sJ dt           j                            ddd|           k    sJ dt           j                            ddd|           k    sJ d S )Nc                     i | ]}|d S 
    ).0vs     r1   
<dictcomp>z"test_flop_cost.<locals>.<dictcomp>a   s    )))1B)))r3   abcdefrP   r   Fr   r   d   ab   T      r	   i  r   )rE   rF   
flop_count)	size_dicts    r1   test_flop_costr]   _   s6   )))))I &&sE1i@@@@@@ &&sE1i@@@@@@"*''eQ	BBBBBB &&sD!Y??????"*''dAyAAAAAA &&sD!Y?????? 2:((aCCCCCCCCr3   c                      t          j        t                    5  t          j        ddgdgdgd           d d d            d S # 1 swxY w Y   d S )Na,b,cr   r   r	   optimalloptimize)pytestraisesKeyErrorrE   contractrQ   r3   r1   test_bad_path_optionrg   u   s    	x	 	  A A
GaS1#sZ@@@@A A A A A A A A A A A A A A A A A As   AAAc                  v    t          j        ddgdgdgddg          } |                                 dk    sJ d S )	Nr_   r   r   r	   r   r   ra      )rE   rf   item)xs    r1   test_explicit_pathrl   z   s@    
GaS1#sff5EFFFA6688q======r3   c                      t           j        j        } t          d         }t	          | |dddg           t	          | |ddg           d S Nr   i  r   r   r   )r   r   r   )rE   pathsr   explicit_path_testsr8   	test_funcr6   s     r1   test_path_optimalrs      sK     I#G,I)Yvv6FGGG)YI;?????r3   c                      t           j        j        } t          d         }t	          | |dddg           t	          | |ddg           d S rn   )rE   ro   r   rp   r8   rq   s     r1   test_path_greedyru      sJ    I#G,I)Yvv6FGGG)YI;?????r3   c                     d} t           j                            |           }t          j        | g|R ddd}t	          |d         dg          sJ t          j        | g|R ddd}t	          |d         dg          sJ t          j        | g|R ddd}t	          |d         g d	          sJ t          j        | g|R ddd}t	          |d         g d	          sJ d S )
Nzabc,bdef,fghj,cem,mhk,ljk->adglr   r   rb   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      s0   2JJ"":..E 
WUWWYUVWWWHhqk$6#788888
VUVVXTUVVVHhqk$6#788888 
XUXXYUWXXXHhqk#K#K#KLLLLL
WUWWXTVWWWHhqk#K#K#KLLLLLLLr3   zalg,expression,orderc                     t           j                            |          }t          j        |g|R d| i}t	          |d         |          sJ d S )Nrb   r   r{   )algr~   orderr   r   s        r1   test_path_edge_casesr      sY    J"":..E 
AUAAASAAHhqk5)))))))r3   c                  
   d} t           j                            | ddddd          }t          j        | g|R ddd\  }}t	          |dd	g          sJ t          j        | g|R d
dd\  }}t	          |dd	g          sJ d S )Nza,ac,ab,ad,cd,bd,bc->rX   r   dimension_dictr   	max_inputrw   r   ry   r   r{   )r~   
edge_test4pathpath_strs       r1   test_optimal_edge_casesr      s     )J''
RT[]dfCgCg'hhJ%jk:kk_jkkkND(dV%7899999%jl:ll	`klllND(dV%789999999r3   c                  >   d} d |                      dd          D             }t          j                            | |          }t          j        | g|R ddd\  }}t          |d	g          sJ t          j        | g|R dd
d\  }}t          |g d          sJ d S )Nzabc,cfd,dbe,efac                     i | ]}|d S )rX   rQ   )rR   ks     r1   rT   z*test_greedy_edge_cases.<locals>.<dictcomp>   s    ;;;!2;;;r3   ,r   r   r   r   rw   )r   r   r   r	   rz   )r   r   r   )replacerE   rF   r|   r}   r2   )r~   dim_dicttensorsr   r   s        r1   test_greedy_edge_casesr      s    "J;;z11#r::;;;Hj$$Z$IIG%jh7hhX\ghhhND(d\N+++++%j_7__X\^___ND(d4445555555r3   c                  ~    d} g d}t          j        | g|R dddd         }t          |j                  dk    sJ d S )Nznlp,nlq,pl->n)r   r   r   r   )r   r   Tr   shapesrb   r   r	   rE   r}   max
scale_listeqr   infos      r1   test_dp_edge_cases_dimension_1r      sZ    	B+++FBDDDtDDDQGDt1$$$$$$r3   c                  ~    d} g d}t          j        | g|R dddd         }t          |j                  dk    sJ d S )Nza,bcd,efg->))r   r   r   r   r   Tr   r   r   r	   r   r   s      r1   &test_dp_edge_cases_all_singlet_indicesr      sZ    	B***FBDDDtDDDQGDt1$$$$$$r3   c                     d} d\  }}}|f|f|||fg}t          j        d          }t          j        d          }t          j        | g|R d|dd         }t          j        | g|R d|dd         }|j        |j        k     sJ d S )Nz
a,b,abc->c)r   r   r	   F)search_outerTr   r   )rE   DynamicProgrammingr}   opt_cost)	r   dadbdcr   opt1opt2info1info2s	            r1   .test_custom_dp_can_optimize_for_outer_productsr      s    	BJBBfrfr2rl+F e444D d333DRE&EEEEEaHERE&EEEEEaHE>EN******r3   c                  \   t           j                            ddd          \  } }t          j        d          }t          j        d          }t          j        | g|R d|d	d
         }t          j        | g|R d|d	d
         }|j        |j        k     sJ |j        |j        k    sJ d S )NrP   r
   +   seedflopsminimizesizeTr   r   )rE   rF   rand_equationr   r}   r   largest_intermediate)r   r   r   r   r   r   s         r1   $test_custom_dp_can_optimize_for_sizer      s    ))"ab)99JB '222D &111DRE&EEEEEaHERE&EEEEEaHENU^++++&)CCCCCCCr3   c                     t           j                            ddd          \  } }t          j        d          }t          j        d          }t          j        d          }t          j        | g|R d|d	d
         }t          j        | g|R d|d	d
         }t          j        | g|R d|d	d
         }|j        |j        cxk    r|j        k    sn J d S )Nr   r	   *   r   T)cost_capFrV   r   r   )rE   rF   r   r   r}   r   )r   r   r   r   opt3r   r   info3s           r1   test_custom_dp_can_set_cost_capr      s   ))!QR)88JB $///D %000D #...DRE&EEEEEaHERE&EEEEEaHERE&EEEEEaHE>U^====u~========r3   rb   )r   r   r   r   r   c                     d t          d          D             \  }}}t          j                            dd          }t	          j        d|||||           d         g dk    sJ d S )	Nc                 N    g | ]"}t           j                            d d           #S rO   )nprandomrandn)rR   _s     r1   
<listcomp>z4test_can_optimize_outer_products.<locals>.<listcomp>   s(    9991ryr2&&999r3   r	   rP   r   zab,cd,ef,fgra   r   )r   r	   r   r   )r*   r   r   r   rE   r}   )rb   r   r   r   r   s        r1    test_can_optimize_outer_productsr      sq    99a999GAq!
	AAM1aAIII!LPhPhPhhhhhhhr3   num_symbols)r   r	      4   t   i,  c           	         d                     d t          |           D                       t          t          t	          j        g d                              }d                     fdt          | dz
            D                       }t          j                            ||          }t          j	        |g|R dd	i d S )
Nr   c              3   >   K   | ]}t          j        |          V  d S N)rE   
get_symbol)rR   is     r1   	<genexpr>z"test_large_path.<locals>.<genexpr>  s,      CC1bmA&&CCCCCCr3   )r   r	   r
   r   c              3   2   K   | ]}||d z            V  dS )r   NrQ   )rR   tsymbolss     r1   r   z"test_large_path.<locals>.<genexpr>  s0      KKq'!AE'*KKKKKKr3   r   r   rb   r   )
joinr*   dictrD   	itertoolscyclerE   rF   r|   r}   )r   r   r~   r   r   s       @r1   test_large_pathr     s    ggCCk0B0BCCCCCG#gyyyy'A'ABBCCNKKKKE+/4J4JKKKKKJj$$Z$OOG Z='===H=====r3   c                  V   t           j                            ddd          \  } }t          t	          t
          j        |                    }t          j        t                    5  t          j
        d           d d d            n# 1 swxY w Y   t          j
        dd          }t          j        | g|R 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|R 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           j                            ddd          \  } }t          t	          t
          j        |                    }t          j        t                    5  t          j        | g|R d	|i\  }}d d d            d S # 1 swxY w Y   d S )NrP   r
   r   r   	somethingr   r   )max_repeatsr   rb   r   g        ri      )   )rE   rF   r   r(   mapr   onesrc   rd   
ValueErrorRandomGreedyr}   r)   costssizesr   bestminr   r   temperaturer   r   r   r   	optimizerr   	path_infos         r1   test_custom_random_greedyr     sL   ))"ab)99JBRWf%%&&E	z	"	" . .
----. . . . . . . . . . . . . . . BAAAI&rFEFFFIFFOD)y2%%%%y2%%%%9>!!!!>'"c)/&:&:::::)Y^F-CCCCC!88888  II&rFEFFFIFFOD)y2%%%%y2%%%%9>!!!!>&!S%9%99999)Y^F-CCCCC!88888 ))"ab)99JBRWf%%&&E	z	"	" K K*2JJJJ	JJiK K K K K K K K K K K K K K K K K Ks$   &BBB8JJ"%J"c                  h   t           j                            ddd          \  } }t          t	          t
          j        |                    }t          j        ddd          }t          j        | g|R d	|i\  }}||j	        k    sJ |j
        |j        d         k    sJ |j        |j        d
         k    sJ d|_        d|_        t          j        | g|R d	|i\  }}||j	        k    sJ |j
        |j        d         k    sJ |j        |j        d
         k    sJ t           j                            ddd          \  } }t          t	          t
          j        |                    }t          j        t"                    5  t          j        | g|R d	|i\  }}d d d            d S # 1 swxY w Y   d S )N   r
   r   r   r   rP   r   )nbranchcutoff_flops_factorr   rb   r   r	   r   )rE   rF   r   r(   r   r   r   BranchBoundr}   r   r   r   r   r   r   rc   rd   r   r   s         r1   test_custom_branchboundr   5  s$   ))!QR)88JBRWf%%&&Eqb6RRRI&rFEFFFIFFOD)9>!!!!)Y^F-CCCCC!88888 I$%I!&rFEFFFIFFOD)9>!!!!)Y^F-CCCCC!88888 ))!QR)88JBRWf%%&&E	z	"	" K K*2JJJJ	JJiK K K K K K K K K K K K K K K K K Ks   F''F+.F+)r	   r   zrequires python3.2 or higher)reasonc                     ddl m}   | d          }t          j                            ddd          \  }}t          t          t          j        |                    }t          j	        d|          }t          j
        |g|R 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|R 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|_        |j        J |j        |usJ d |j        D             }t3          |          sJ d S )Nr   )ProcessPoolExecutorr   rP   r
   r   r   )r   parallelrb   r   r   g    .Ag?Tc                 ^    g | ]*}|                                 p|                                +S rQ   )runningdone)rR   fs     r1   r   z/test_parallel_random_greedy.<locals>.<listcomp>x  s-    DDDA		'qvvxxDDDr3   )concurrent.futuresr   rE   rF   r   r(   r   r   r   r   r}   r)   r   r   r   r   	_executorr   r   r   r   intr   max_time_futuresall)	r   poolr   r   r   r   r   r   are_dones	            r1   test_parallel_random_greedyr  P  s   666666q!!D))"ab)99JBRWf%%&&EB>>>I&rFEFFFIFFOD)y2%%%%y2%%%%9>!!!!%%%%$&&&&>'"c)/&:&:::::)Y^F-CCCCC!88888  HHIII&rFEFFFIFFOD)y"$$$$y"$$$$9>!!!!>'"c)/&:&:::::)Y^F-CCCCC!88888I***d****DD1CDDDHx==r3   c                  d    G d dt           j        j                  } t           j                            dddd          \  }}t          t          t          j        |                    }t          j	        |g|R ddi} |             }t          j	        |g|R d|i}||k    sJ |j
        sJ d S )	Nc                       e Zd ZddZdS )2test_custom_path_optimizer.<locals>.NaiveOptimizerNc                 <    d| _         dgt          |          dz
  z  S )NTr   r   )was_usedr)   )selfinputsoutputr\   rx   s        r1   __call__z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__~  s      DM8s6{{Q//r3   r   )__name__
__module____qualname__r  rQ   r3   r1   NaiveOptimizerr  }  s(        	0 	0 	0 	0 	0 	0r3   r  r   r	   r   r   d_maxrb   F)rE   ro   PathOptimizerrF   r   r(   r   r   r   rf   r	  )r  r   r   r   expr   outs          r1   test_custom_path_optimizerr  |  s    0 0 0 0 0/ 0 0 0
 ))!QRq)AAJBRWf%%&&E
+b
15
1
1
15
1
1C  I
+b
55
5
5
59
5
5C#::::r3   c                      G d dt           j        j                  } t           j                            dddd          \  }}t          t          t          j        |                    }t          j	        |g|R ddi} | d	
          }t          j	        |g|R d|i}||k    sJ |j
        sJ t          |j                  d	k    sJ d S )Nc                   *    e Zd Zed             Zd ZdS ):test_custom_random_optimizer.<locals>.NaiveRandomOptimizerc                 L   t           j                            |            g }t          t	          |                    }t          |          dk    rt           j                            t          |          dd          \  }}|                    |t          |          z              |	                    |           |	                    |           |
                    ||f           t          |          dk    t          j                            ||||          \  }	}
||	|
fS )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  r\   ssa_path	remainingr   jcostr   s              r1   random_pathzFtest_custom_random_optimizer.<locals>.NaiveRandomOptimizer.random_path  s    INN1HE!HHIi..1$$y''Ya'OO1a#h--/000  ###  ###A''' i..1$$ ==hPVXabbJD$T4''r3   c                 P    d| _         t          |          }| j        }||||f}||fS )NT)r	  r)   r)  )r
  r  r  r\   r$  trial_fn
trial_argss          r1   setupz@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setup  s5     DMFA'HVVY7JZ''r3   N)r  r  r  staticmethodr)  r-  rQ   r3   r1   NaiveRandomOptimizerr    s<        		( 	( 
	(	( 	( 	( 	( 	(r3   r/  r   r	   r   r  rb   Fr   )r   )rE   r!  RandomOptimizerrF   r   r(   r   r   r   rf   r	  r)   r   )r/  r   r   r   r  r   r  s          r1   test_custom_random_optimizerr1    s    ( ( ( ( (r~= ( ( (0 ))!QRq)AAJBRWf%%&&E
+b
15
1
1
15
1
1C$$444I
+b
55
5
5
59
5
5C#::::y2%%%%%%r3   c                     d } t          j        t                    5  t          j                            d|            d d d            n# 1 swxY w Y   t          j                            d|            dt          j        j        v sJ d}g d}t          j        |g|R ddd\  }}|ddgk    sJ t          j        j        d= d S )	Nc                 .    dgt          |           dz
  z  S )Nr   r   )r)   )r  r  r\   rx   s       r1   custom_optimizerz5test_optimizer_registration.<locals>.custom_optimizer  s    x3v;;?++r3   r   customzab,bc,cd)r   )r	   r
   )r
   r   Tr   r   )rc   rd   re   rE   ro   register_path_fn_PATH_OPTIONSr}   )r4  r   r   r   r   s        r1   test_optimizer_registrationr8    s!   , , , 
x	 	  ? ?
!!)-=>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hh(8999rx-----	B%%%F&rSFSS4(SSSOD)FF#####
x(((s   !A

AA)F)(__doc__r   sysnumpyr   rc   
opt_einsumrE   r  rp   path_edge_testsr2   r8   rL   r]   rg   rl   rs   ru   r   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   skipifversion_infor  r  r1  r8  rQ   r3   r1   <module>rB     s   
     



          s5zz33t99cc%jj133r77	= =  FSSZZT3SSWW	? ?   " 211555333222---===AAA???>>>>>>999===AAA???>>>999>>>BBB@@@???:::+2   . . .3 3 3(D D D,A A A
  
@ @ @@ @ @M M M* /AA* * BA*	: 	: 	:
6 
6 
6% % %% % %+ + +
E 
E 
E> > > %Z%Z%Z[[i i \[i (K(K(KLL> > ML>#K #K #KLK K K6 C$v-6TUU( ( VU(V  "#& #& #&L) ) ) ) )r3   