o
    e=                     @   s  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
d`d&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zejd8e
d9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZejdIg dJdKdL ZejdMg dNdOdP ZdQdR Z dSdT Z!ejj"ej#dUk dVdWdXdY Z$dZd[ Z%d\d] Z&d^d_ Z'dS )azm
Tests the accuracy of the opt_einsum paths in addition to unit tests for
the various path helper functions.
    NZabdacZbdc             abcdabcdabcbc   )GEMM1Z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                 C   sb   t | tsdS t| t|krdS d}tt| D ]}|t | | tM }|| | || kM }q|S )NFT)
isinstancelistlenrangetuple)test_output	benchmarkbypassretpos r,   KD:\Projects\ConvertPro\env\Lib\site-packages\opt_einsum/tests/test_paths.py
check_path7   s   
r.   c                 C   s,   | |d |d |d |}t ||sJ d S )Nr   r   r   )r.   )func	test_datamax_sizer(   r'   r,   r,   r-   assert_contract_orderE   s   r2   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 )NZabcdez)r   r   	         r   r   r   r   r	   r   r
   r   zazZzbch   ZaaaeiF2  Zabcde)zipoehelpersZcompute_size_by_dict)Z
sizes_dictindvalZ	path_funcr,   r,   r-   test_size_by_dictK   s   
r>   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>a       z"test_flop_cost.<locals>.<dictcomp>ZabcdefrA   r	   Fr   r   d   ab   T      r   i  r   )r:   r;   Z
flop_count)	size_dictr,   r,   r-   test_flop_cost_   s   rL   c                   C   sJ   t t tjddgdgdgdd W d    d S 1 sw   Y  d S )Na,b,cr   r   r   Zoptimalloptimize)pytestraisesKeyErrorr:   contractr,   r,   r,   r-   test_bad_path_optionu   s   "rT   c                  C   s2   t jddgdgdgddgd} |  dksJ d S )	NrM   r   r   r   r   r   rN      )r:   rS   item)xr,   r,   r-   test_explicit_pathz   s   rX   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   )r:   pathsr   explicit_path_testsr2   Z	test_funcr0   r,   r,   r-   test_path_optimal      r^   c                  C   rY   rZ   )r:   r[   r   r\   r2   r]   r,   r,   r-   test_path_greedy   r_   r`   c                  C   s   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s6J t j| g|R ddd}t|d g d	sNJ t j| g|R ddd}t|d g d	sfJ d S )
Nzabc,bdef,fghj,cem,mhk,ljk->adglr   r   rO   memory_limitr   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r:   r;   build_viewscontract_pathr.   )
expressionviewspath_retr,   r,   r-   test_memory_paths   s   rk   zalg,expression,orderc                 C   s:   t j|}t j|g|R d| i}t|d |sJ d S )NrO   r   re   )algrh   orderri   rj   r,   r,   r-   test_path_edge_cases   s   rn   c                  C   s   d} t jj| d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->rH   r   dimension_dictr   	max_inputra   r   rc   r   re   )rh   Z
edge_test4pathpath_strr,   r,   r-   test_optimal_edge_cases   s   rt   c                  C   s   d} dd |  ddD }tjj| |d}tj| g|R ddd	\}}t|d
gs,J tj| g|R ddd	\}}t|g dsDJ d S )Nzabc,cfd,dbe,efac                 S   r?   )rH   r,   )rB   kr,   r,   r-   rD      rE   z*test_greedy_edge_cases.<locals>.<dictcomp>,r   ro   r   rq   ra   )r   r   r   r   rd   )r   r   r   )replacer:   r;   rf   rg   r.   )rh   Zdim_dicttensorsrr   rs   r,   r,   r-   test_greedy_edge_cases   s   ry   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   shapesrO   r   r   r:   rg   maxZ
scale_listeqr}   infor,   r,   r-   test_dp_edge_cases_dimension_1      r   c                  C   rz   )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)Zsearch_outerTr|   r   )r:   DynamicProgrammingrg   opt_cost)	r   dadbZdcr}   opt1opt2info1info2r,   r,   r-   .test_custom_dp_can_optimize_for_outer_products   s   
r   c                  C   s   t jj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sEJ d S )NrA   r   +   seedflopsminimizesizeTr|   r   )r:   r;   rand_equationr   rg   r   largest_intermediate)r   r}   r   r   r   r   r,   r,   r-   $test_custom_dp_can_optimize_for_size   s   r   c                  C   s   t jj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rX|jks[J  J d S )Nr   r   *   r   T)Zcost_capFrF   r|   r   )r:   r;   r   r   rg   r   )r   r}   r   r   Zopt3r   r   Zinfo3r,   r,   r-   test_custom_dp_can_set_cost_cap   s   &r   rO   )r   r   r   r   r   c                 C   sP   dd t dD \}}}tjdd}tjd||||| dd g d	ks&J d S )
Nc                 S   s   g | ]	}t jd d qS r@   )nprandomrandn)rB   _r,   r,   r-   
<listcomp>   s    z4test_can_optimize_outer_products.<locals>.<listcomp>r   rA   r   zab,cd,ef,fgrN   r   )r   r   r   r   )r%   r   r   r   r:   rg   )rO   r	   r
   r   r   r,   r,   r-    test_can_optimize_outer_products   s   *r   num_symbols)r   r      4   t   i,  c                    s|   d dd t| D  tt tg d}d  fddt| d D }tjj||d}tj	|g|R d	d
i d S )Nr   c                 s   s    | ]}t |V  qd S N)r:   Z
get_symbol)rB   ir,   r,   r-   	<genexpr>  s    z"test_large_path.<locals>.<genexpr>)r   r   r   rv   c                 3   s     | ]} ||d   V  qdS )r   Nr,   )rB   tsymbolsr,   r-   r     s    r   ro   rO   r   )
joinr%   dictr9   	itertoolscycler:   r;   rf   rg   )r   rp   rh   rx   r,   r   r-   test_large_path  s
    r   c                  C   s  t jjdddd\} }t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sLJ t|jdksUJ ||jks\J |jd t|jkshJ |j|jd
 ksrJ |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 jjdddd\} }tttj|}tt	 t j| g|R d	|i\}}W d    d S 1 sw   Y  d S )NrA   r   r   r   Z	somethingr   r   )max_repeatsr   rO   r   g        rU      )   )r:   r;   r   r#   mapr   onesrP   rQ   
ValueErrorRandomGreedyrg   r$   costssizesrr   bestminr   r   Ztemperaturer   r   r}   ri   	optimizerrr   	path_infor,   r,   r-   test_custom_random_greedy  s6   "r   c                  C   sX  t jjdddd\} }tttj|}t jdddd}t j| g|R d	|i\}}||j	ks0J |j
|jd ks:J |j|jd
 ksDJ d|_d|_t j| g|R d	|i\}}||j	ks_J |j
|jd ksiJ |j|jd
 kssJ t jjdddd\} }tttj|}tt t j| g|R d	|i\}}W d    d S 1 sw   Y  d S )N   r   r   r   r   rA   r   )nbranchcutoff_flops_factorr   rO   r   r   r   )r:   r;   r   r#   r   r   r   ZBranchBoundrg   rr   r   r   r   r   r   rP   rQ   r   r   r,   r,   r-   test_custom_branchbound5  s$   "r   )r   r   zrequires python3.2 or higher)reasonc            	      C   s  ddl m}  | d}tjjdddd\}}tttj|}tj	d|d}tj
|g|R d	|i\}}t|jdks;J t|jdksDJ ||jksKJ |j|u sRJ |j|u sYJ |jd
 t|jkseJ |j|jd ksoJ |j|jd
 ksyJ 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 )Nr   )ProcessPoolExecutorr   rA   r   r   r   )r   parallelrO   r   r   g    .Ag?Tc                 S   s   g | ]
}|  p| qS r,   )runningdone)rB   fr,   r,   r-   r   x  s    z/test_parallel_random_greedy.<locals>.<listcomp>)concurrent.futuresr   r:   r;   r   r#   r   r   r   r   rg   r$   r   r   rr   r   Z	_executorr   r   r   r   intr   Zmax_timeZ_futuresall)	r   poolr   r}   ri   r   rr   r   Zare_doner,   r,   r-   test_parallel_random_greedyP  s:   
r   c                  C   s   G dd dt jj} t jjd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
sDJ d S )	Nc                   @   s   e Zd ZdddZdS )z2test_custom_path_optimizer.<locals>.NaiveOptimizerNc                 S   s   d| _ dgt|d  S )NTr   r   )was_usedr$   )selfinputsoutputrK   rb   r,   r,   r-   __call__~  s   z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__r   )__name__
__module____qualname__r   r,   r,   r,   r-   NaiveOptimizer}  s    r   r   r   r   r   Zd_maxrO   F)r:   r[   ZPathOptimizerr;   r   r#   r   r   r   rS   r   )r   r   r}   ri   expr   outr,   r,   r-   test_custom_path_optimizer|  s   r   c                  C   s   G dd dt jj} t jjddddd\}}tttj|}t j	|g|R ddi}| d	d
}t j	|g|R d|i}||ksAJ |j
sFJ t|jd	ksOJ d S )Nc                   @   s    e Zd Zedd Zdd ZdS )z:test_custom_random_optimizer.<locals>.NaiveRandomOptimizerc                 S   s   t j|  g }tt|}t|dkrAt jjt|ddd\}}||t|  |	| |	| |
||f t|dkstj||||\}	}
||	|
fS )z9Picks a completely random contraction order.
            r   r   F)r   rw   )r   r   r   setr%   r$   choicer#   addremoveappendr:   path_randomZssa_path_compute_cost)rnr   r   rK   Zssa_path	remainingr   jZcostr   r,   r,   r-   random_path  s   


zFtest_custom_random_optimizer.<locals>.NaiveRandomOptimizer.random_pathc                 S   s(   d| _ t|}| j}||||f}||fS )NT)r   r$   r   )r   r   r   rK   r   Ztrial_fnZ
trial_argsr,   r,   r-   setup  s
   z@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setupN)r   r   r   staticmethodr   r   r,   r,   r,   r-   NaiveRandomOptimizer  s    
r   r   r   r   r   rO   Fr   )r   )r:   r   ZRandomOptimizerr;   r   r#   r   r   r   rS   r   r$   r   )r   r   r}   ri   r   r   r   r,   r,   r-   test_custom_random_optimizer  s   

r   c                  C   s   dd } t t tjd|  W d    n1 s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sLJ tjjd= d S )
Nc                 S   s   dgt | d  S )Nr   r   )r$   )r   r   rK   rb   r,   r,   r-   custom_optimizer  s   z5test_optimizer_registration.<locals>.custom_optimizerr   Zcustomzab,bc,cd)r   )r   r   )r   r   Tr|   r   )rP   rQ   rR   r:   r[   Zregister_path_fnZ_PATH_OPTIONSrg   )r   r   r}   rr   r   r,   r,   r-   test_optimizer_registration  s   r   )F)(__doc__r   sysnumpyr   rP   Z
opt_einsumr:   r   r\   Zpath_edge_testsr.   r2   r>   rL   rT   rX   r^   r`   rk   markZparametrizern   rt   ry   r   r   r   r   r   r   r   r   r   Zskipifversion_infor   r   r   r   r,   r,   r,   r-   <module>   s    
		



&
+&