o
    2hL                     @   s  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dd/ed0ed1ed2efd3d4Zd5ed6ed7ed0ed2df
d8d9Zdd:d;Zdd<d=Zdd>d?Zdd@dAZddBdCZ ddDdEZ!ddFdGZ"e	j#$dHedIedJe%dKed2dfdLdMZ&e	j#$dNee	j#$dIej'j(dIedJe%dKed2dfdOdPZ)ddQdRZ*ddSdTZ+ddUdVZ,ddWdXZ-ddYdZZ.dd[d\Z/dd]d^Z0e	j#$d_d`dadbg dcfdddedfg dgfdhdidfg djfdkdldfg dmfdndodfg dpfdqdidfg djfdrdodfg dpfgdse%dteduedved2df
dwdxZ1ddydzZ2e	j#$d{g d|d{ed2dfd}d~Z3e	j#$dg dded2dfddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dS )zm
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%   r/   r.   )r&   r/   r.   )r'   r/   r.   )r(   r/   r.   za,->azab,->abz,a,->az,,a,->az,,->Ftest_output	benchmarkbypassreturnc                 C   sf   t | tsdS t| t|krdS d}tt| D ]}|t | | tM }|| | t|| kM }q|S )NFT)
isinstancelistlenrangetuple)r0   r1   r2   retpos r;   V/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/tests/test_paths.py
check_pathC   s   
r=   func	test_datamax_sizec                 C   s,   | |d |d |d |}t ||sJ d S )Nr   r   r   )r=   )r>   r?   r@   r1   r0   r;   r;   r<   assert_contract_orderQ   s   rA   c                  C   s   i } t dg dD ]\}}|| |< q	tjj}d|d| ksJ d|d| ks(J d|d| ks1J d	|d
| ks:J d	|d| ksCJ d	|d| ksLJ d|d| ksUJ 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_funcr;   r;   r<   test_size_by_dictV   s   
rT   c                  C   s   d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sHJ dt jddd| ksUJ dt jddd| ksbJ d S )Nc                 S      i | ]}|d qS )
   r;   ).0vr;   r;   r<   
<dictcomp>j       z"test_flop_cost.<locals>.<dictcomp>abcdefrV   r   Fr   r   d   ab   T      r   i  r   )rM   rN   
flop_count)	size_dictr;   r;   r<   test_flop_costi   s   rc   c                	   C   sL   t t tjddgdgdgddd W d    d S 1 sw   Y  d S )Na,b,cr   r   r   optimallToptimizeshapes)pytestraisesKeyErrorrM   contractr;   r;   r;   r<   test_bad_path_option~   s   "rm   c                  C   s<   t d tjddgdgdgddgd} |  d	ksJ d S )
Nnumpyrd   r   r   r   r)   r$   )rg      )ri   importorskiprM   rl   item)xr;   r;   r<   test_explicit_path   s   
rs   c                  C   6   t jj} td }t| |dddg t| |ddg d S Nr   i  r#   r$   r   )r   r   r   )rM   pathsr'   explicit_path_testsrA   	test_funcr?   r;   r;   r<   test_path_optimal      rz   c                  C   rt   ru   )rM   rv   r    rw   rA   rx   r;   r;   r<   test_path_greedy   r{   r|   c                  C   s   d} t | }tj| g|R dddd}t|d dgsJ tj| g|R dddd}t|d dgs6J tj| g|R dd	dd}t|d g d
sOJ tj| g|R dd	dd}t|d g d
shJ d S )Nzabc,bdef,fghj,cem,mhk,ljk->adglr'   r   Trg   memory_limitrh   r   r   r   r   r   r   r   r    )r,   r   r   r#   r#   r$   r   rM   contract_pathr=   )
expressionviewspath_retr;   r;   r<   test_memory_paths   s   r   zalg,expression,orderalgr   orderc                 C   s8   t |}tj|g|R | dd}t|d |sJ d S NTrf   r   r   r   r   r   r   r   r;   r;   r<   test_path_edge_cases   s   r   zexpression,orderc                 C   s:   t |}tj|g|R | dd}t|d |ksJ d S r   )r   rM   r   r6   r   r;   r;   r<   test_path_scalar_cases   s   r   c                  C   s   d} t | dddddd}tj| g|R dddd\}}t|d	d
gs&J tj| g|R dddd\}}t|d	d
gs?J d S )Nza,ac,ab,ad,cd,bd,bc->r^   r   dimension_dictr    	max_inputTr}   r$   r   r'   r   )r   
edge_test4path_r;   r;   r<   test_optimal_edge_cases   s     r   c                  C   s   d} dd |  ddD }t| |d}tj| g|R ddd	d
\}}t|dgs+J tj| g|R ddd	d
\}}t|g dsDJ d S )Nzabc,cfd,dbe,efac                 S   rU   )r^   r;   )rW   kr;   r;   r<   rY      rZ   z*test_greedy_edge_cases.<locals>.<dictcomp>,r   r   r    r   Tr}   )r   r   r   r   r   )r$   r#   r$   )replacer   rM   r   r=   )r   dim_dicttensorsr   r   r;   r;   r<   test_greedy_edge_cases   s     r   c                  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(   rh   rg   r   r   rM   r   max
scale_listeqrh   infor;   r;   r<   test_dp_edge_cases_dimension_1      r   c                  C   r   )Nza,bcd,efg->))r   r   r   r   r   Tr(   r   r   r   r   r   r;   r;   r<   &test_dp_edge_cases_all_singlet_indices   r   r   c            	      C   s   d} d\}}}|f|f|||fg}t jdd}t jdd}t j| g|R d|dd }t j| g|R d|dd }|j|jk sCJ d S )Nz
a,b,abc->c)r   r   r   F)search_outerTr   r   )rM   DynamicProgrammingr   opt_cost)	r   dadbdcrh   opt1opt2info1info2r;   r;   r<   .test_custom_dp_can_optimize_for_outer_products   s   
r   c                  C   s   t dddd\} }tjdd}tjdd}tj| g|R d|d	d
 }tj| g|R d|d	d
 }|j|jk s;J |j|jksCJ d S )NrV   r   +   seedflopsminimizesizeTr   r   )r   rM   r   r   r   largest_intermediate)r   rh   r   r   r   r   r;   r;   r<   $test_custom_dp_can_optimize_for_size   s   r   c                  C   s   t dddd\} }tjdd}tjdd}tjdd}tj| g|R d|d	d
 }tj| g|R d|d	d
 }tj| g|R d|d	d
 }|j|j  krV|jksYJ  J d S )Nr   r   *   r   T)cost_capFr\   r   r   )r   rM   r   r   r   )r   rh   r   r   opt3r   r   info3r;   r;   r<   test_custom_dp_can_set_cost_cap  s   &r   zminimize,cost,width,pathr   i
 iI  )	r   r   r   r   r      r   ro   r   r   r   r   r,   r#   r$   r   iH i  )	r   )r      )r   r   r   ro   r   r   )r   r   r)   r$   writei )	)r   r   r   r   r   r   r   r   r,   r)   r$   comboi )	r   r   )ro   r   r   r   r   r,   r#   r$   limiti )	r   r   r   )r   ro   r   r   r,   r)   r$   z	combo-256z	limit-256r   costwidthr   c                 C   sj   t dddd\}}tj| d}tj|g|R d|dd }|j|ks%J |j|ks,J |j|ks3J d S )	NrV   r   r   r   r   Tr   r   )r   rM   r   r   r   r   r   )r   r   r   r   r   rh   optr   r;   r;   r<   test_custom_dp_can_set_minimize  s   r   c                  C   s   t dddd\} }tjdd}tj| g|R d|d\}}|j}tj| g|R d|d	d
 tt tj| g|R d|d d	d
 W d    d S 1 sPw   Y  d S )NrV   r   r   r   r   r   Tr   r(   )rh   r~   rg   r   )r   rM   r   r   r   ri   rj   RuntimeError)r   rh   r   r   r   mincostr;   r;   r<   )test_dp_errors_when_no_contractions_found"  s   ""r   rg   )r    r&   r%   r'   r(   c              	   C   sH   dd t dD \}}}d}tjd||||| ddd g d	ks"J d S )
Nc                 s   s    | ]}d V  qdS ))rV   rV   Nr;   )rW   r   r;   r;   r<   	<genexpr>4  s    z3test_can_optimize_outer_products.<locals>.<genexpr>r   )rV   r   zab,cd,ef,fgTrf   r   )r   r   r#   r$   )r7   rM   r   )rg   r   r   r   r   r;   r;   r<    test_can_optimize_outer_products2  s   ,r   num_symbols)r   r      4   t   i,  c                    sz   d dd t| D  tt tg d}d  fddt| d D }t||d}tj|g|R d	d
d d S )Nr   c                 s   s    | ]}t |V  qd S N)rM   
get_symbol)rW   ir;   r;   r<   r   @  s    z"test_large_path.<locals>.<genexpr>)r   r   r   r   c                 3   s     | ]} ||d   V  qdS )r   Nr;   )rW   tsymbolsr;   r<   r   B  s    r   r   r    Trf   )	joinr7   dictrL   	itertoolscycler   rM   r   )r   r   r   r   r;   r   r<   test_large_path>  s
    r   c                  C   s  t d} tdddd\}}tt| j|}t t tj	dd W d    n1 s,w   Y  tj	ddd	}tj
|g|R d
|i\}}t|jdksOJ t|jdksXJ ||jks_J |jd t|jkskJ |j|jd ksuJ |j|jd ksJ d|_d|_tj
|g|R d
|i\}}t|jdksJ t|jdksJ ||jksJ |jd t|jksJ |j|jd ksJ |j|jd ksJ tdddd\}}tt| j|}t t tj
|g|R d
|i\}}W d    d S 1 sw   Y  d S )Nrn   rV   r   r   r   	somethingr   r   )max_repeatsr   rg   r   g        ro      )   )ri   rp   r   r5   maponesrj   
ValueErrorrM   RandomGreedyr   r6   costssizesr   bestminr   r   temperaturer   npr   rh   r   	optimizerr   	path_infor;   r;   r<   test_custom_random_greedyI  s8   
"r   c                  C   sZ  t d} tdddd\}}tt| j|}tjdddd	}tj|g|R d
|i\}}||j	ks3J |j
|jd ks=J |j|jd ksGJ d|_d|_tj|g|R d
|i\}}||j	ksbJ |j
|jd kslJ |j|jd ksvJ tdddd\}}tt| j|}t t tj|g|R d
|i\}}W d    d S 1 sw   Y  d S )Nrn   r   r   r   r   r   rV   r   )nbranchcutoff_flops_factorr   rg   r   r   r   )ri   rp   r   r5   r   r   rM   BranchBoundr   r   r   r   r   r   r   rj   r   r   r;   r;   r<   test_custom_branchboundq  s&   
"r   c                   C   s<   t t tjdd W d    d S 1 sw   Y  d S )Nr   )r   )ri   rj   r   rM   r   r;   r;   r;   r<   test_branchbound_validation  s   "r   c            	      C   s  t d} td}tdddd\}}tt| j|}tjd|d}tj	|g|R d|i\}}t
|jdks8J t
|jdksAJ ||jksHJ |j|u sOJ |j|u sVJ |jd	 t|jksbJ |j|jd
 kslJ |j|jd	 ksvJ td|_d|_d|_tj	|g|R d|i\}}t
|jdksJ t
|jdksJ ||jksJ |jd	 t|jksJ |j|jd
 ksJ |j|jd	 ksJ d|_|jd usJ |j|usJ dd |jD }t|sJ d S )Nrn   r   rV   r   r   r   )r   parallelrg   r   r   g    .Ag?Tc                 S   s   g | ]
}|  p| qS r;   )runningdone)rW   fr;   r;   r<   
<listcomp>  s    z/test_parallel_random_greedy.<locals>.<listcomp>)ri   rp   r   r   r5   r   r   rM   r   r   r6   r   r   r   r   	_executorr   r   r   r   intr   max_time_futuresall)	r   poolr   rh   r   r   r   r   are_doner;   r;   r<   test_parallel_random_greedy  s:   

r
  c                  C   s   t d} G dd dtjj}tddddd\}}tt| j|}tj	|g|R dd	i}| }tj	|g|R d|i}||ksBJ |j
sGJ d S )
Nrn   c                   @   s>   e Zd Z	d	dee dedeeef dee de	f
ddZ
dS )
z2test_custom_path_optimizer.<locals>.NaiveOptimizerNinputsoutputrb   r~   r3   c                 S   s   d| _ dgt|d  S )NTr$   r   )was_usedr6   )selfr  r  rb   r~   r;   r;   r<   __call__  s   z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__r   )__name__
__module____qualname__r   r	   r   strr  r   r   r  r;   r;   r;   r<   NaiveOptimizer  s    
r  r   r   r   r   d_maxrg   F)ri   rp   rM   rv   PathOptimizerr   r5   r   r   rl   r  )r   r  r   rh   r   expr   outr;   r;   r<   test_custom_path_optimizer  s   
r  c                     s   t d G  fdddtjj} tddddd\}}tt j|}tj	|g|R dd	i}| d
d}tj	|g|R d|i}||ksFJ |j
sKJ t|jd
ksTJ d S )Nrn   c                       s\   e Zd Zedededee dedeeef de	f fddZ
de	de	de	de	fd	d
ZdS )z:test_custom_random_optimizer.<locals>.NaiveRandomOptimizerrnr  r  rb   r3   c                    s    j |  g }tt|}t|dkrA j jt|ddd\}}||t|  || || |	||f t|dkst
j||||\}	}
||	|
fS )z,Picks a completely random contraction order.r   r   F)r   r   )randomr   setr7   r6   choicer5   addremoveappendrM   path_randomssa_path_compute_cost)r  r  r  r  rb   ssa_path	remainingr   jr   r   r   r;   r<   random_path  s   


zFtest_custom_random_optimizer.<locals>.NaiveRandomOptimizer.random_pathc                 S   s(   d| _ t|}| j}||||f}||fS )NT)r  r6   r)  )r  r  r  rb   r  trial_fn
trial_argsr;   r;   r<   setup  s
   z@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setupN)r  r  r  staticmethodr  r   r	   r   r  r   r)  r,  r;   r(  r;   r<   NaiveRandomOptimizer  s     
r.  r   r   r   r  rg   Fr   )r   )ri   rp   rM   r#  RandomOptimizerr   r5   r   r   rl   r  r6   r   )r.  r   rh   r   r  r   r  r;   r(  r<   test_custom_random_optimizer  s   


r0  c               
   C   s   dt t dtdtttf dtt dtf
dd} tt	 t
jd|  W d    n1 s.w   Y  t
jd	|  d	t
jjv sBJ d
}g d}t
j|g|R dd	d\}}|ddgks_J t
jjd	= d S )Nr  r  rb   r~   r3   c                 S   s   dgt | d  S )Nr$   r   )r6   )r  r  rb   r~   r;   r;   r<   custom_optimizer  s   z5test_optimizer_registration.<locals>.custom_optimizerr'   customab,bc,cd)r   r   r   Tr   r$   )r   r	   r   r  r  r   r   ri   rj   rk   rM   rv   register_path_fn_PATH_OPTIONSr   )r1  r   rh   r   r   r;   r;   r<   test_optimizer_registration  s*   

r6  c                  C   s<   t dddggdgdggddgg\} }| ddgksJ d S )Nr3  r   r   r   r   r$   )rM   r   )r   r   r;   r;   r<   test_path_with_assumed_shapes  s   (r7  )F)r3   N)=__doc__r   concurrent.futuresr   typingr   r   r   r   ri   
opt_einsumrM   opt_einsum.testingr   r   opt_einsum.typingr	   r
   r   r   r  rw   path_edge_testspath_scalar_testsboolr=   r  rA   rT   rc   rm   rs   rz   r|   r   markparametrizer  r   rv   r5  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r0  r6  r7  r;   r;   r;   r<   <module>   s    







	





 
	


(


,

)