o
    i 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.
    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                 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/   J/var/www/myenv/lib/python3.10/site-packages/opt_einsum/tests/test_paths.py
check_path7   s   
r1   c                 C   s,   | |d |d |d |}t ||sJ d S )Nr   r   r   )r1   )func	test_datamax_sizer+   r*   r/   r/   r0   assert_contract_orderE   s   r5   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/   r0   test_size_by_dictK   s   
rH   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/   r0   
<dictcomp>a       z"test_flop_cost.<locals>.<dictcomp>abcdefrK   r   Fr   r   d   ab   T      r   i  r   )rA   rB   
flop_count)	size_dictr/   r/   r0   test_flop_cost_   s   rX   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   optimalloptimize)pytestraisesKeyErrorrA   contractr/   r/   r/   r0   test_bad_path_optionu   s   "ra   c                  C   s2   t jddgdgdgddgd} |  dksJ d S )	NrY   r   r   r   r   r   r[      )rA   r`   item)xr/   r/   r0   test_explicit_pathz   s   re   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   )rA   pathsr   explicit_path_testsr5   	test_funcr3   r/   r/   r0   test_path_optimal      rl   c                  C   rf   rg   )rA   rh   r   ri   r5   rj   r/   r/   r0   test_path_greedy   rm   rn   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   r\   memory_limitr   r   r   r   r   r	   r   r   )r!   )r   r	   r   r   r   rA   rB   build_viewscontract_pathr1   )
expressionviewspath_retr/   r/   r0   test_memory_paths   s   ry   zalg,expression,orderc                 C   s:   t j|}t j|g|R d| i}t|d |sJ d S )Nr\   r   rs   )algrv   orderrw   rx   r/   r/   r0   test_path_edge_cases   s   r|   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->rS   r
   dimension_dictr   	max_inputro   r   rq   r   rs   )rv   
edge_test4pathpath_strr/   r/   r0   test_optimal_edge_cases   s   r   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   rI   )rS   r/   )rL   kr/   r/   r0   rN      rO   z*test_greedy_edge_cases.<locals>.<dictcomp>,r   r}   r   r   ro   )r   r   r   r   rr   )r   r   r   )replacerA   rB   rt   ru   r1   )rv   dim_dicttensorsr   r   r/   r/   r0   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   shapesr\   r   r   rA   ru   max
scale_listeqr   infor/   r/   r0   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/   r0   &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   )rA   DynamicProgrammingru   opt_cost)	r   dadbdcr   opt1opt2info1info2r/   r/   r0   .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 )NrK   r	   +   seedflopsminimizesizeTr   r   )rA   rB   rand_equationr   ru   r   largest_intermediate)r   r   r   r   r   r   r/   r/   r0   $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)cost_capFrQ   r   r   )rA   rB   r   r   ru   r   )r   r   r   r   opt3r   r   info3r/   r/   r0   test_custom_dp_can_set_cost_cap   s   &r   r\   )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 rJ   )nprandomrandn)rL   _r/   r/   r0   
<listcomp>   s    z4test_can_optimize_outer_products.<locals>.<listcomp>r   rK   r   zab,cd,ef,fgr[   r   )r   r   r   r   )r(   r   r   r   rA   ru   )r\   r   r   r   r   r/   r/   r0    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)rA   
get_symbol)rL   ir/   r/   r0   	<genexpr>  s    z"test_large_path.<locals>.<genexpr>)r   r   r	   r   c                 3   s     | ]} ||d   V  qdS )r   Nr/   )rL   tsymbolsr/   r0   r     s    r   r}   r\   r   )
joinr(   dictr@   	itertoolscyclerA   rB   rt   ru   )r   r~   rv   r   r/   r   r0   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 )NrK   r	   r   r   	somethingr   r   )max_repeatsr   r\   r   g        rb      )   )rA   rB   r   r&   mapr   onesr]   r^   
ValueErrorRandomGreedyru   r'   costssizesr   bestminr   r   temperaturer   r   r   rw   	optimizerr   	path_infor/   r/   r0   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   rK   r   )nbranchcutoff_flops_factorr   r\   r   r   r   )rA   rB   r   r&   r   r   r   BranchBoundru   r   r   r   r   r   r   r]   r^   r   r   r/   r/   r0   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   rK   r	   r   r   )r   parallelr\   r   r   g    .Ag?Tc                 S   s   g | ]
}|  p| qS r/   )runningdone)rL   fr/   r/   r0   r   x  s    z/test_parallel_random_greedy.<locals>.<listcomp>)concurrent.futuresr   rA   rB   r   r&   r   r   r   r   ru   r'   r   r   r   r   	_executorr   r   r   r   intr   max_time_futuresall)	r   poolr   r   rw   r   r   r   are_doner/   r/   r0   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outputrW   rp   r/   r/   r0   __call__~  s   z;test_custom_path_optimizer.<locals>.NaiveOptimizer.__call__r   )__name__
__module____qualname__r   r/   r/   r/   r0   NaiveOptimizer}  s    r   r   r   r   r   d_maxr\   F)rA   rh   PathOptimizerrB   r   r&   r   r   r   r`   r   )r   r   r   rw   expr   outr/   r/   r0   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   r   )r   r   r   setr(   r'   choicer&   addremoveappendrA   path_randomssa_path_compute_cost)rnr   r   rW   ssa_path	remainingr   jcostr   r/   r/   r0   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   rW   r  trial_fn
trial_argsr/   r/   r0   setup  s
   z@test_custom_random_optimizer.<locals>.NaiveRandomOptimizer.setupN)r   r   r   staticmethodr
  r  r/   r/   r/   r0   NaiveRandomOptimizer  s    
r  r   r   r   r   r\   Fr   )r   )rA   r  RandomOptimizerrB   r   r&   r   r   r   r`   r   r'   r   )r  r   r   rw   r   r   r   r/   r/   r0   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   rW   rp   r/   r/   r0   custom_optimizer  s   z5test_optimizer_registration.<locals>.custom_optimizerr   customzab,bc,cd)r   )r   r	   )r	   r   Tr   r   )r]   r^   r_   rA   rh   register_path_fn_PATH_OPTIONSru   )r  r   r   r   r   r/   r/   r0   test_optimizer_registration  s   r  )F)(__doc__r   sysnumpyr   r]   
opt_einsumrA   r   ri   path_edge_testsr1   r5   rH   rX   ra   re   rl   rn   ry   markparametrizer|   r   r   r   r   r   r   r   r   r   r   r   skipifversion_infor   r   r  r  r/   r/   r/   r0   <module>   s    
		



&
+&