a
    o=ic=                     @   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 }q2|S )NFT)
isinstancelistlenrangetuple)test_output	benchmarkbypassretpos r,   l/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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sPJ d|d| ksbJ d	|d
| kstJ d	|d| ksJ d	|d| ksJ d|d| ksJ d|d| ksJ 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sBJ d	t jd
dd| ks\J dt jddd| ksvJ dt jd
dd| ksJ dt jddd| ksJ dt jddd| ksJ d S )Nc                 S   s   i | ]
}|d qS 
   r,   ).0vr,   r,   r-   
<dictcomp>a       z"test_flop_cost.<locals>.<dictcomp>Zabcdefr@   r	   Fr   r   d   ab   T      r   i  r   )r:   r;   Z
flop_count)	size_dictr,   r,   r-   test_flop_cost_   s    rK   c                   C   sH   t t* tjddgdgdgdd W d    n1 s:0    Y  d S )Na,b,cr   r   r   Zoptimalloptimize)pytestraisesKeyErrorr:   contractr,   r,   r,   r-   test_bad_path_optionu   s    rS   c                  C   s2   t jddgdgdgddgd} |  dks.J d S )	NrL   r   r   r   r   r   rM      )r:   rR   item)xr,   r,   r-   test_explicit_pathz   s    rW   c                  C   s6   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   s    r\   c                  C   s6   t jj} td }t| |dddg t| |ddg d S rX   )r:   rY   r   rZ   r2   r[   r,   r,   r-   test_path_greedy   s    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slJ t j| g|R ddd}t|d g d	sJ t j| g|R ddd}t|d g d	sJ d S )
Nzabc,bdef,fghj,cem,mhk,ljk->adglr   r   rN   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    rh   zalg,expression,orderc                 C   s:   t j|}t j|g|R d| i}t|d |s6J d S )NrN   r   rb   )algre   orderrf   rg   r,   r,   r-   test_path_edge_cases   s    rk   c                  C   s   d} t jj| dddddd}t j| g|R ddd\}}t|dd	gsNJ t j| g|R d
dd\}}t|dd	gs~J d S )Nza,ac,ab,ad,cd,bd,bc->rG   r   dimension_dictr   	max_inputr^   r   r`   r   rb   )re   Z
edge_test4pathpath_strr,   r,   r-   test_optimal_edge_cases   s    rq   c                  C   s   d} dd |  ddD }tjj| |d}tj| g|R ddd	\}}t|d
gsXJ tj| g|R ddd	\}}t|g dsJ d S )Nzabc,cfd,dbe,efac                 S   s   i | ]
}|d qS )rG   r,   )rA   kr,   r,   r-   rC      rD   z*test_greedy_edge_cases.<locals>.<dictcomp>,r   rl   r   rn   r^   )r   r   r   r   ra   )r   r   r   )replacer:   r;   rc   rd   r.   )re   Zdim_dicttensorsro   rp   r,   r,   r-   test_greedy_edge_cases   s    rv   c                  C   s@   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   rw   )r   r   Tr   shapesrN   r   r   r:   rd   maxZ
scale_listeqry   infor,   r,   r-   test_dp_edge_cases_dimension_1   s    r   c                  C   s@   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   rx   r   r   rz   r|   r,   r,   r-   &test_dp_edge_cases_all_singlet_indices   s    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 sJ d S )Nz
a,b,abc->c)r   r   r   F)Zsearch_outerTrx   r   )r:   DynamicProgrammingrd   opt_cost)	r}   dadbZdcry   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 szJ |j|jksJ d S )Nr@   r   +   seedflopsminimizesizeTrx   r   )r:   r;   rand_equationr   rd   r   largest_intermediate)r}   ry   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r|jksn J d S )Nr   r   *   r   T)Zcost_capFrE   rx   r   )r:   r;   r   r   rd   r   )r}   ry   r   r   Zopt3r   r   Zinfo3r,   r,   r-   test_custom_dp_can_set_cost_cap   s    r   rN   )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sLJ d S )
Nc                 S   s   g | ]}t jd d qS r?   )nprandomrandn)rA   _r,   r,   r-   
<listcomp>   rD   z4test_can_optimize_outer_products.<locals>.<listcomp>r   r@   r   zab,cd,ef,fgrM   r   )r   r   r   r   )r%   r   r   r   r:   rd   )rN   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)rA   ir,   r,   r-   	<genexpr>  rD   z"test_large_path.<locals>.<genexpr>)r   r   r   rs   c                 3   s   | ]} ||d   V  qdS )r   Nr,   )rA   tsymbolsr,   r-   r     rD   r   rl   rN   r   )
joinr%   dictr9   	itertoolscycler:   r;   rc   rd   )r   rm   re   ru   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 sR0    Y  t j
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|_d|_t j| g|R d	|i\}}t|jdks4J t|jdksHJ ||jksXJ |jd
 t|jksrJ |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    n1 s0    Y  d S )Nr@   r   r   r   Z	somethingr   r   )max_repeatsr   rN   r   g        rT      )   )r:   r;   r   r#   mapr   onesrO   rP   
ValueErrorRandomGreedyrd   r$   costssizesro   bestminr   r   Ztemperaturer   r}   ry   rf   	optimizerro   	path_infor,   r,   r-   test_custom_random_greedy  s2    *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s`J |j
|jd kstJ |j|jd
 ksJ d|_d|_t j| g|R d	|i\}}||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    n1 sJ0    Y  d S )N   r   r   r   r   r@   r   )nbranchcutoff_flops_factorr   rN   r   r   r   )r:   r;   r   r#   r   r   r   ZBranchBoundrd   ro   r   r   r   r   r   rO   rP   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svJ t|jdksJ ||jksJ |j|u sJ |j|u sJ |jd
 t|jksJ |j|jd ksJ |j|jd
 ksJ td|_d|_d|_tj
|g|R d	|i\}}t|jdks8J t|jdksLJ ||jks\J |jd
 t|jksvJ |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   r@   r   r   r   )r   parallelrN   r   r   g    .Ag?Tc                 S   s   g | ]}|  p| qS r,   )runningdone)rA   fr,   r,   r-   r   x  rD   z/test_parallel_random_greedy.<locals>.<listcomp>)concurrent.futuresr   r:   r;   r   r#   r   r   r   r   rd   r$   r   r   ro   r   Z	_executorr   r   r   r   intr   Zmax_timeZ_futuresall)	r   poolr}   ry   rf   r   ro   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
sJ 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outputrJ   r_   r,   r,   r-   __call__~  s    z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__)N)__name__
__module____qualname__r   r,   r,   r,   r-   NaiveOptimizer}  s   r   r   r   r   r   Zd_maxrN   F)r:   rY   ZPathOptimizerr;   r   r#   r   r   r   rR   r   )r   r}   ry   rf   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sJ |j
sJ t|jd	ksJ 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rxt jjt|ddd\}}||t|  |	| |	| |
||f qtj||||\}	}
||	|
fS )z9Picks a completely random contraction order.
            r   r   F)r   rt   )r   r   r   setr%   r$   choicer#   addremoveappendr:   path_randomZssa_path_compute_cost)rnr   r   rJ   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   rJ   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   rN   Fr   )r   )r:   r   ZRandomOptimizerr;   r   r#   r   r   r   rR   r   r$   r   )r   r}   ry   rf   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 s60    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sJ tjjd= d S )
Nc                 S   s   dgt | d  S )Nr   r   )r$   )r   r   rJ   r_   r,   r,   r-   custom_optimizer  s    z5test_optimizer_registration.<locals>.custom_optimizerr   customzab,bc,cd)r   )r   r   )r   r   Trx   r   )rO   rP   rQ   r:   rY   Zregister_path_fnZ_PATH_OPTIONSrd   )r   r}   ry   ro   r   r,   r,   r-   test_optimizer_registration  s    ,r   )F)(__doc__r   sysnumpyr   rO   Z
opt_einsumr:   r   rZ   Zpath_edge_testsr.   r2   r>   rK   rS   rW   r\   r]   rh   markZparametrizerk   rq   rv   r   r   r   r   r   r   r   r   r   Zskipifversion_infor   r   r   r   r,   r,   r,   r-   <module>   s   
		



&
+&