o
    °2úh£  ã                
   @   s  d Z ddlmZmZ ddlZddlmZmZmZ ddl	m
Z
 e d¡Zd&dd	„Zd&d
d„Zd&dd„Zd&dd„Zd&dd„Zd&dd„Zd&dd„Zej dddgdddgddggdfgdddgddggddgdd ggfgdddgddggd!fgg¡d"ed#ee ddfd$d%„ƒZdS )'zf
Tets a series of opt_einsum contraction paths to ensure the results are the same for different paths
é    )ÚAnyÚTupleN)ÚcontractÚcontract_expressionÚcontract_path)ÚPathTypeÚnumpyÚreturnc               	   C   s  t  t¡ tddddd W d   ƒ n1 sw   Y  t  t¡ tddddƒ W d   ƒ n1 s4w   Y  t d¡} t  t¡ tddd| d W d   ƒ n1 sVw   Y  tdddƒ}t  t¡}|tj d	d
¡ƒ W d   ƒ n1 szw   Y  dt|j	ƒv sˆJ ‚t  t¡}|tj d	d
¡tj d	d
¡tj d	d
¡ƒ W d   ƒ n1 s­w   Y  dt|j	ƒv s»J ‚t  t¡}|tj d	d
d¡tj d
d¡ƒ W d   ƒ n1 sÛw   Y  dt|j	ƒv séJ ‚t  t¡}|tj d	d¡tj d
dd¡ƒ W d   ƒ n	1 s
w   Y  dt|j	ƒv sJ ‚t  t¡}|tj d	d
¡tj d
d¡tj d	dd¡d W d   ƒ n	1 sAw   Y  dt|j	ƒv sPJ ‚t  t
¡}|tj d	d
¡tj d
d¡dd W d   ƒ n	1 srw   Y  dt|j	ƒv sJ ‚d S )Nú	ab,bc->ac)é   é   )r   é   F©Úoptimize)é*   r   )r   r   )Úoutr   r   z$`ContractExpression` takes exactly 2r   z4Internal error while evaluating `ContractExpression`é   é   ÚF)Úorderzgot an unexpected keyword)ÚpytestÚraisesÚ
ValueErrorr   ÚnpÚemptyÚrandomÚrandÚstrÚvalueÚ	TypeError)r   ÚexprÚerrÚerr_type© r#   ú[/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/tests/test_edge_cases.pyÚtest_contract_expression_checks   sF   ÿÿ
ÿÿ,ÿ"ÿ"ÿ0ÿ$ÿr%   c            	      C   sÀ   t j ddd¡} t j dd¡}t j dd¡}t j d¡}td| ||dd}td| ||d	d}t  ||¡s6J ‚|| }td
| |||dd}td
| |||d	d}t  ||¡sVJ ‚t  ||¡s^J ‚d S )Né   r   r   r   é
   z	ijk,kl,jlFr   Tzijk,kl,jl,i->i©r   r   r   r   Úallclose©	ÚaÚbÚcÚdÚ
ein_scalarÚ
opt_scalarÚresultÚeinÚoptr#   r#   r$   Útest_broadcasting_contraction<   s   r4   c            	      C   sÄ   t j dddd¡} t j dd¡}t j dd¡}t j dd¡}td| ||dd}td| ||d	d}t  ||¡s8J ‚|| }td
| |||dd}td
| |||d	d}t  ||¡sXJ ‚t  ||¡s`J ‚d S )Nr&   r   r   r   é   z
abjk,kl,jlFr   Tzabjk,kl,jl,ab->abr(   r*   r#   r#   r$   Útest_broadcasting_contraction2O   s   r6   c                  C   sx   t j ddd¡} t j ddd¡}t j dd¡}t j dd¡}td| |||dd}td| |||d	d}t  ||¡s:J ‚d S )
Nr&   r   r   r   r5   zajk,kbl,jl,ab->abFr   Tr(   )r+   r,   r-   r.   r2   r3   r#   r#   r$   Útest_broadcasting_contraction3b   s   r7   c                  C   sH   t  d¡ ddd¡} td| | dd}td| | dd}t  ||¡s"J ‚d S )	Né@   r   r   é   zobk,ijk->iojFr   T)r   ÚarangeÚreshaper   r)   )r+   r2   r3   r#   r#   r$   Útest_broadcasting_contraction4n   s   r<   c                  C   sj   t ddddƒ} | jd d dksJ ‚| jd d d	u sJ ‚| jd
 d dks(J ‚| jd
 d dks3J ‚d S )Nzab,bc,bd->acd)r   r   )r&   r   )r   é   r   r   z
bc,ab->bcaéÿÿÿÿFr&   zbca,bd->acdÚGEMM)r   Úcontraction_list)r    r#   r#   r$   Ú,test_can_blas_on_healed_broadcast_dimensionsv   s
   rA   c                  C   sD   d} d}g }t | g|¢R d|iŽ\}}t|ƒsJ ‚|jdks J ‚d S )Nz->)g      ð?r   r&   )r   ÚreprÚlargest_intermediate)ÚeqÚarraysÚpathÚ_Úinfor#   r#   r$   Ú#test_pathinfo_for_empty_contraction€   s   rI   zexpression, operandsz,,->)r   g      @ù               @zab,->r   g       @r&   rJ   r
   g      @r   TÚ
expressionÚoperandsc                 C   s<   t j| g|¢R Ž }t| g|¢R ddiŽ}t  ||¡sJ ‚dS )zTest that we can contract with assumed shapes, and that the output is correct. This is required as we need to infer intermediate shape sizes.r   TN)r   Úeinsumr   r)   )rK   rL   Ú	benchmarkr1   r#   r#   r$   Ú!test_contract_with_assumed_shapesŠ   s   rO   )r	   N)Ú__doc__Útypingr   r   r   Ú
opt_einsumr   r   r   Úopt_einsum.typingr   Úimportorskipr   r%   r4   r6   r7   r<   rA   rI   ÚmarkÚparametrizer   rO   r#   r#   r#   r$   Ú<module>   s,    


,






"üþ 	